knn算法代码实现c++
时间: 2023-09-27 09:02:22 浏览: 111
knn算法实现(C++)
5星 · 资源好评率100%
KNN算法是一种经典的机器学习算法,用于分类和回归问题。在C语言中,我们可以通过数组和循环来实现KNN算法。
下面是一个简单的KNN算法的C语言代码实现:
```c
#include <stdio.h>
#include <math.h>
#define K 3 // 设置K值为3
#define N 5 // 设置训练样本数量为5
#define M 2 // 设置测试样本数量为2
#define DIMENSION 2 // 设置样本维度为2
// 计算欧氏距离
float calculateDistance(float* sample1, float* sample2) {
float sum = 0.0;
for (int i = 0; i < DIMENSION; i++) {
sum += pow(sample1[i] - sample2[i], 2);
}
return sqrt(sum);
}
// 寻找最近的K个样本
int findNearestNeighbors(float** trainSamples, float* testSample, int* labels) {
float distances[N]; // 存储每个训练样本到测试样本的距离
int neighbors[K]; // 存储最近的K个样本的索引
// 初始化距离和最近样本的索引
for (int i = 0; i < N; i++) {
distances[i] = calculateDistance(trainSamples[i], testSample);
neighbors[i] = i;
}
// 对距离进行从小到大排序
for (int i = 0; i < N; i++) {
for (int j = 0; j < N - i - 1; j++) {
if (distances[j] > distances[j + 1]) {
float tempDist = distances[j];
distances[j] = distances[j + 1];
distances[j + 1] = tempDist;
int tempIdx = neighbors[j];
neighbors[j] = neighbors[j + 1];
neighbors[j + 1] = tempIdx;
}
}
}
// 统计K个样本中最多的类别
int classCount = 0;
int maxCount = 0;
for (int i = 0; i < K; i++) {
int label = labels[neighbors[i]];
int count = 0;
for (int j = 0; j < K; j++) {
if (labels[neighbors[j]] == label) {
count++;
}
}
if (count > maxCount) {
maxCount = count;
classCount = label;
}
}
return classCount;
}
int main() {
float trainSamples[N][DIMENSION] = {{1.0, 1.0}, {2.0, 2.0}, {3.0, 3.0}, {4.0, 4.0}, {5.0, 5.0}};
float testSamples[M][DIMENSION] = {{2.5, 2.5}, {4.5, 4.5}};
int labels[N] = {0, 0, 1, 1, 1};
for (int i = 0; i < M; i++) {
int result = findNearestNeighbors(trainSamples, testSamples[i], labels);
printf("Test Sample %d belongs to Class %d\n", i, result);
}
return 0;
}
```
该代码实现了一个简单的KNN算法,其中训练样本、测试样本和对应的类别标记以及K值都是在代码中事先定义好的。通过调用`findNearestNeighbors`函数,对于每个测试样本,算法会找到最近的K个训练样本,然后通过统计K个样本中出现次数最多的类别来进行分类预测。
以上就是KNN算法的C语言代码实现。注意,这只是一个简单的示例代码,实际应用时可能需要考虑更多的算法细节和优化。
阅读全文