用cpp写一个KNN分类代码,包括以下参数double * train_datas, long int length, long int dimension, int *labels, double * test_data, int k
时间: 2024-01-02 08:02:42 浏览: 71
好的,以下是一个简单的用cpp写的KNN分类代码,包括了您提到的所有参数:
```cpp
#include <iostream>
#include <cmath>
using namespace std;
// 欧几里得距离计算函数
double euclidean_distance(double* point1, double* point2, long int dimension)
{
double distance = 0;
for (int i = 0; i < dimension; i++)
{
distance += pow(point1[i] - point2[i], 2);
}
return sqrt(distance);
}
int main()
{
// 训练数据和标签
double train_datas[][3] = {{1.0, 1.1, 1.0}, {1.0, 1.0, 1.0}, {0.0, 0.0, 0.0}, {0.0, 0.1, 0.0}};
int labels[] = {1, 1, 2, 2};
// 测试数据
double test_data[] = {0.2, 0.2, 0.2};
// 配置参数
int k = 3;
long int length = 4;
long int dimension = 3;
// 计算每个训练数据点到测试数据点的距离
double distances[length];
for (int i = 0; i < length; i++)
{
double* point = train_datas[i];
distances[i] = euclidean_distance(point, test_data, dimension);
}
// 找到最近的 k 个数据点,并统计它们的标签
int freq[2] = {0, 0};
for (int i = 0; i < k; i++)
{
int min_index = 0;
double min_distance = INFINITY;
for (int j = 0; j < length; j++)
{
if (distances[j] < min_distance)
{
min_distance = distances[j];
min_index = j;
}
}
freq[labels[min_index] - 1]++;
distances[min_index] = INFINITY;
}
// 输出预测的标签
if (freq[0] > freq[1])
cout << "Test data belongs to label 1" << endl;
else
cout << "Test data belongs to label 2" << endl;
return 0;
}
```
上述代码中,我使用了欧几里得距离作为相似度计算的标准,算法流程如下:
1. 计算每个训练数据点到测试数据点的距离,存储在一个数组中;
2. 选出距离最近的 k 个训练数据点,并统计其所属标签的频率;
3. 输出预测的标签,即频率最高的标签。
您可以根据自己的实际需求,将函数封装成类或者函数库,以便更方便地进行调用和使用。希望这个代码能帮到您。如果您有其他问题或需要其他帮助,请不要犹豫,随时提出来。
阅读全文