knn算法C++实现代码
时间: 2023-09-11 11:05:33 浏览: 221
### 回答1:
KNN算法的C语言实现代码如下:
int k = 3;
int[] distances = new int[trainingSetSize]; // Find distances from x to all training data
for (int i = 0; i < trainingSetSize; i++)
distances[i] = calculateDistance(x, trainingData[i]); // Sort the distances in ascending order
sort(distances); // Take the top k elements
int[] neighbors = new int[k];
for (int i = 0; i < k; i++)
neighbors[i] = distances[i]; // Find the majority label from the neighbors
int majorityLabel = findMajority(neighbors); // Return the majority label
return majorityLabel;
### 回答2:
knn算法是一种简单且易于理解的分类算法。下面是一个使用C语言实现的knn算法的示例代码:
```c
#include <stdio.h>
#include <math.h>
#define K 3 // 设置k值为3
typedef struct {
double x;
double y;
int label;
} Point;
int classify(Point train[], Point test) {
// 计算测试点到训练集中各个点的距离
double distances[K];
for (int i = 0; i < K; i++) {
double dx = train[i].x - test.x;
double dy = train[i].y - test.y;
distances[i] = sqrt(dx*dx + dy*dy);
}
// 根据距离对训练集中的点进行排序
for (int i = 0; i < K-1; i++) {
for (int j = i+1; j < K; j++) {
if (distances[i] > distances[j]) {
double tempDist = distances[i];
distances[i] = distances[j];
distances[j] = tempDist;
int tempLabel = train[i].label;
train[i].label = train[j].label;
train[j].label = tempLabel;
}
}
}
// 统计k个最近邻点中标签数量最多的类别
int labels[K] = {0};
for (int i = 0; i < K; i++) {
labels[train[i].label]++;
}
int maxLabel = 0;
int maxCount = 0;
for (int i = 0; i < K; i++) {
if (labels[i] > maxCount) {
maxCount = labels[i];
maxLabel = i;
}
}
return maxLabel;
}
int main() {
// 训练集
Point train[] = {{1.0, 1.0, 0}, {2.0, 2.0, 0}, {4.0, 4.0, 1}, {5.0, 5.0, 1}};
// 测试点
Point test = {3.0, 3.0, 0};
// 使用knn算法进行分类
int label = classify(train, test);
printf("测试点的类别为:%d\n", label);
return 0;
}
```
该示例代码中定义了一个结构体`Point`,其中包含了点的坐标和标签。`classify`函数用于对测试点进行分类,首先计算测试点与训练集中各点的距离,并将训练集中的点按照距离进行排序。然后统计k个最近邻点中标签数量最多的类别作为测试点的类别。在`main`函数中,定义了一个训练集和一个测试点,并调用`classify`函数进行分类,并输出分类结果。
以上就是一个使用C语言实现knn算法的基本示例代码,根据实际需求,可以在此基础上进行进一步的修改和优化。
### 回答3:
knn算法是一种常用的分类算法,它的原理是通过计算待分类样本与已知样本的距离,然后取距离最近的k个已知样本的类别进行投票,最终确定待分类样本的类别。下面是knn算法的C语言实现代码示例:
```c
#include <stdio.h>
#include <math.h>
// 计算欧氏距离
double calcDistance(double *sample1, double *sample2, int n) {
double sum = 0.0;
for (int i = 0; i < n; i++) {
sum += pow(sample1[i] - sample2[i], 2);
}
return sqrt(sum);
}
// knn分类函数
int knnClassify(double **samples, int *labels, double *testSample, int k, int nSamples, int nFeatures) {
double distances[nSamples];
// 计算所有样本与测试样本的距离
for (int i = 0; i < nSamples; i++) {
distances[i] = calcDistance(samples[i], testSample, nFeatures);
}
// 根据距离排序
int sortedIndices[nSamples];
for (int i = 0; i < nSamples; i++) {
sortedIndices[i] = i;
}
for (int i = 0; i < nSamples - 1; i++) {
for (int j = i + 1; j < nSamples; j++) {
if (distances[j] < distances[i]) {
// 交换距离和索引
double tempDist = distances[i];
distances[i] = distances[j];
distances[j] = tempDist;
int tempIndex = sortedIndices[i];
sortedIndices[i] = sortedIndices[j];
sortedIndices[j] = tempIndex;
}
}
}
// 统计k个最近邻样本的类别
int classCount[nSamples];
for (int i = 0; i < nSamples; i++) {
classCount[i] = 0;
}
for (int i = 0; i < k; i++) {
classCount[labels[sortedIndices[i]]]++;
}
// 选择类别最多的作为测试样本的预测类别
int maxCount = 0;
int predictedLabel = -1;
for (int i = 0; i < nSamples; i++) {
if (classCount[i] > maxCount) {
maxCount = classCount[i];
predictedLabel = i;
}
}
return predictedLabel;
}
int main() {
// 样本数据和标签
double samples[5][2] = {{1.0, 1.0}, {1.5, 2.0}, {3.0, 4.0}, {5.0, 7.0}, {4.5, 5.0}};
int labels[5] = {0, 0, 1, 1, 1};
// 测试样本
double testSample[2] = {3.5, 5.0};
// 设置参数
int k = 3; // k值,即最近邻个数
int nSamples = 5; // 样本个数
int nFeatures = 2; // 特征维度
// 调用knn分类函数
int predictedLabel = knnClassify(samples, labels, testSample, k, nSamples, nFeatures);
printf("测试样本的预测类别为:%d\n", predictedLabel);
return 0;
}
```
以上是一个简单的knn算法的C语言实现代码,通过给定一组样本数据和对应的标签,以及待测试的样本数据,通过调用knnClassify函数,可以得到待测试样本的预测类别。其中,calcDistance函数用于计算欧氏距离,knnClassify函数用于执行knn分类算法。请根据实际需要修改样本数据、标签、测试样本和参数等内容。
阅读全文