21xrx.com
2025-03-28 02:20:10 Friday
文章检索 我的文章 写文章
KNN算法代码C语言实现
2023-09-29 01:09:31 深夜i     38     0
KNN算法 代码 C语言 实现 分类算法

KNN(K-Nearest Neighbors)算法是一种简单而强大的分类算法,它可以对未知样本进行分类。在本文中,将使用C语言实现KNN算法的代码。

首先,我们需要定义一个数据结构来表示样本。在这个例子中,我们假设每个样本有两个特征,因此我们可以用一个包含两个整数的结构体来表示样本。我们还需要一个数组来存储所有的样本。假设我们有N个样本,那么我们可以定义如下的结构体和数组:

typedef struct
  int feature1;
  int feature2;
  int label;
Sample;
Sample samples[N];

在定义好数据结构后,我们需要实现一个函数来计算两个样本之间的欧氏距离。欧氏距离是KNN算法中常用的距离度量方法。代码如下:

double distance(Sample s1, Sample s2) {
  int dist1 = s1.feature1 - s2.feature1;
  int dist2 = s1.feature2 - s2.feature2;
  return sqrt(dist1*dist1 + dist2*dist2); // 使用math库的sqrt函数计算平方根
}

接下来,我们需要实现KNN算法的核心部分。在KNN算法中,我们需要找出与未知样本最近的K个已知样本,并根据这K个样本的标签来确定未知样本的分类。以下是KNN算法的C语言实现代码:

int classify(Sample unknownSample, int k) {
  // 创建一个数组来存储与未知样本最近的K个样本的索引
  int nearestIndices[k];
  // 初始化数组,假设前K个样本最近
  for (int i = 0; i < k; i++) {
    nearestIndices[i] = i;
  }
  
  // 遍历余下的样本
  for (int i = k; i < N; i++) {
    // 计算未知样本与遍历到的样本的距离
    double dist = distance(samples[i], unknownSample);
    
    // 检查距离是否比当前最远的样本还要近
    double maxDist = distance(samples[nearestIndices[k-1]], unknownSample);
    if (dist < maxDist) {
      // 找到一个更近的样本,将其索引插入到合适的位置
      int j = k - 2;
      while (j >= 0 && dist < distance(samples[nearestIndices[j]], unknownSample)) {
        nearestIndices[j+1] = nearestIndices[j];
        j--;
      }
      nearestIndices[j+1] = i;
    }
  }
  
  // 统计K个样本中最多的标签
  int labelCounts[10] = {0};
  for (int i = 0; i < k; i++) {
    labelCounts[samples[nearestIndices[i]].label]++;
  }
  
  // 返回出现频率最高的标签
  int maxCount = 0;
  int maxLabel;
  for (int i = 0; i < 10; i++) {
    if (labelCounts[i] > maxCount) {
      maxCount = labelCounts[i];
      maxLabel = i;
    }
  }
  
  return maxLabel;
}

最后,我们可以使用这个KNN算法的代码对未知样本进行分类。首先,我们需要定义一个未知样本并给其特征赋值。然后,通过调用`classify`函数,并传入未知样本和K值,即可获得未知样本的预测标签。在这个例子中,我们设定K值为5:

Sample unknownSample;
unknownSample.feature1 = 4;
unknownSample.feature2 = 5;
int predictedLabel = classify(unknownSample, 5);

通过以上的实现,我们成功地使用C语言编写了KNN算法的代码。这个代码可以用来对未知样本进行分类,并根据K个最近的已知样本的标签来预测未知样本的分类。感谢您阅读本文!

  
  

评论区

请求出错了