21xrx.com
2024-12-22 16:24:33 Sunday
登录
文章检索 我的文章 写文章
KNN算法代码C语言实现
2023-09-29 01:09:31 深夜i     --     --
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个最近的已知样本的标签来预测未知样本的分类。感谢您阅读本文!

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复