c++实现knn投票
时间: 2023-09-28 22:10:32 浏览: 121
你可以使用 C 语言实现 KNN(K-Nearest Neighbors)的投票算法。下面是一个简单的示例代码,用于对给定测试样本进行分类:
```c
#include <stdio.h>
#include <math.h>
// 计算欧氏距离
double euclideanDistance(double *point1, double *point2, int dimensions) {
double distance = 0.0;
for (int i = 0; i < dimensions; ++i) {
distance += pow((point1[i] - point2[i]), 2);
}
return sqrt(distance);
}
// KNN投票算法
int knnVote(double *trainingSet[], int *labels, int trainingSize, int dimensions, double *testPoint, int k) {
// 计算测试样本与训练样本的距离
double distances[trainingSize];
for (int i = 0; i < trainingSize; ++i) {
distances[i] = euclideanDistance(trainingSet[i], testPoint, dimensions);
}
// 根据距离排序,找出 K 个最近的邻居
int sortedIndices[trainingSize];
for (int i = 0; i < trainingSize; ++i) {
sortedIndices[i] = i;
}
for (int i = 0; i < trainingSize - 1; ++i) {
for (int j = 0; j < trainingSize - i - 1; ++j) {
if (distances[j] > distances[j + 1]) {
// 通过冒泡排序交换距离和索引
double tempDist = distances[j];
distances[j] = distances[j + 1];
distances[j + 1] = tempDist;
int tempIndex = sortedIndices[j];
sortedIndices[j] = sortedIndices[j + 1];
sortedIndices[j + 1] = tempIndex;
}
}
}
// 统计 K 个最近邻居的类别
int votes[10] = {0}; // 假设类别标签为 0-9
for (int i = 0; i < k; ++i) {
int label = labels[sortedIndices[i]];
votes[label]++;
}
// 返回票数最多的类别
int maxVotes = 0;
int maxLabel = -1;
for (int i = 0; i < 10; ++i) {
if (votes[i] > maxVotes) {
maxVotes = votes[i];
maxLabel = i;
}
}
return maxLabel;
}
int main() {
// 训练样本和标签
double trainingSet[5][2] = {{1.0, 2.0}, {2.0, 1.0}, {5.0, 8.0}, {6.0, 9.0}, {8.0, 7.0}};
int labels[5] = {0, 0, 1, 1, 1};
// 测试样本
double testPoint[2] = {4.0, 6.0};
// KNN 参数
int k = 3;
int trainingSize = 5;
int dimensions = 2;
// 进行分类
int predictedLabel = knnVote(trainingSet, labels, trainingSize, dimensions, testPoint, k);
// 打印结果
printf("Predicted Label: %d\n", predictedLabel);
return 0;
}
```
在上面的示例代码中,训练样本的特征值存储在二维数组 `trainingSet` 中,对应的标签存储在整型数组 `labels` 中。测试样本的特征值存储在一维数组 `testPoint` 中。你可以根据实际情况修改这些数据。K 值由变量 `k` 控制。
代码中使用欧氏距离计算样本之间的距离,然后根据距离排序,选取 K 个最近邻居,并统计各个类别的票数,最后返回票数最多的类别作为预测结果。
注意:这只是一个简单的示例,实际使用时你可能需要根据具体问题对代码进行适当的修改和优化。
阅读全文