简单实现k近邻算法c++
时间: 2023-11-18 08:54:55 浏览: 41
K近邻算法是一种基于实例的机器学习算法,它的主要思想是通过计算样本之间的距离来确定新样本的类别。下面是一个简单的C++实现:
```c++
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
// 定义一个结构体表示样本
struct Sample {
vector<double> features; // 样本的特征向量
int label; // 样本的类别
};
// 计算两个样本之间的欧几里得距离
double distance(const Sample& s1, const Sample& s2) {
double sum = 0.0;
for (int i = 0; i < s1.features.size(); i++) {
sum += pow(s1.features[i] - s2.features[i], 2);
}
return sqrt(sum);
}
// K近邻算法
int knn(const vector<Sample>& samples, const Sample& query, int k) {
// 计算所有样本与查询样本之间的距离
vector<pair<double, int>> distances; // 存储距离和样本下标的pair
for (int i = 0; i < samples.size(); i++) {
double d = distance(samples[i], query);
distances.push_back(make_pair(d, i));
}
// 按距离从小到大排序
sort(distances.begin(), distances.end());
// 统计前k个样本中出现最多的类别
vector<int> counts(k, 0); // 存储每个类别出现的次数
for (int i = 0; i < k; i++) {
int label = samples[distances[i].second].label;
counts[label]++;
}
// 返回出现次数最多的类别
int max_count = 0;
int max_label = -1;
for (int i = 0; i < counts.size(); i++) {
if (counts[i] > max_count) {
max_count = counts[i];
max_label = i;
}
}
return max_label;
}
int main() {
// 构造样本数据
vector<Sample> samples = {
{{1.0, 2.0}, 0},
{{2.0, 1.0}, 0},
{{4.0, 5.0}, 1},
{{5.0, 4.0}, 1}
};
// 构造查询样本
Sample query = {{3.0, 3.0}, -1};
// 进行K近邻分类
int k = 3;
int label = knn(samples, query, k);
// 输出结果
cout << "query sample belongs to class " << label << endl;
return 0;
}
```
这个实现中,我们首先定义了一个`Sample`结构体表示样本,其中包含了样本的特征向量和类别。然后,我们定义了一个`distance`函数来计算两个样本之间的欧几里得距离。接着,我们实现了一个`knn`函数来进行K近邻分类,其中,我们首先计算所有样本与查询样本之间的距离,并按距离从小到大排序。然后,我们统计前k个样本中出现最多的类别,并返回出现次数最多的类别。最后,我们在`main`函数中构造了样本数据和查询样本,并调用`knn`函数进行分类。