请用C++帮我实现问题【问题描述】 设计与实现K-NN分类算法的基本输入与输出 【输入形式】 键盘输入 第1行:m(样本数), n(特征维数), s(类别数,K-Means算法该项为0) 接下来m行(每行n列)输入样本; 接下来1行输入n项特征的名称; 当是s>0,输入一行s项类别的名称; 输入K值 输入未知样本 【输出形式】 给出KNN分类的类别名称 【样例输入】 12 4 2 228 134 20 11 0 245 134 10 40 0 200 167 12 27 0 170 150 7 8 0 100 167 20 14 0 150 117 7 6 1 120 133 10 26 1 160 100 5 10 1 185 115 5 19 1 170 125 6 4 1 165 142 5 3 1 185 108 2 12 1 铜蓝蛋白 蓝色反应 吲哚乙酸 中性硫化物 阳性 阴性 1 100 117 7 2 【样例输出】 阴性
时间: 2024-01-01 09:05:42 浏览: 64
使用C++来实现KNN算法
5星 · 资源好评率100%
以下是C++的代码实现,实现了K-NN分类算法的输入与输出功能:
```cpp
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <cmath>
using namespace std;
struct Sample {
vector<double> features;
string category;
};
bool cmp(const pair<double, int>& a, const pair<double, int>& b) {
return a.first < b.first;
}
int main() {
int m, n, s, k;
cin >> m >> n >> s;
vector<Sample> samples(m);
for (int i = 0; i < m; i++) {
samples[i].features.resize(n);
for (int j = 0; j < n; j++) {
cin >> samples[i].features[j];
}
cin >> samples[i].category;
}
vector<string> featureNames(n);
for (int i = 0; i < n; i++) {
cin >> featureNames[i];
}
vector<string> categoryNames(s);
if (s > 0) {
for (int i = 0; i < s; i++) {
cin >> categoryNames[i];
}
}
cin >> k;
Sample unknown;
unknown.features.resize(n);
for (int i = 0; i < n; i++) {
cin >> unknown.features[i];
}
// 计算与每个样本的距离
vector<pair<double, int>> distances(m);
for (int i = 0; i < m; i++) {
double d = 0;
for (int j = 0; j < n; j++) {
d += pow(samples[i].features[j] - unknown.features[j], 2);
}
distances[i] = make_pair(sqrt(d), i);
}
// 按距离排序
sort(distances.begin(), distances.end(), cmp);
// 统计最近的k个样本的类别
vector<int> categoryCount(s);
for (int i = 0; i < k; i++) {
int index = distances[i].second;
for (int j = 0; j < s; j++) {
if (samples[index].category == categoryNames[j]) {
categoryCount[j]++;
break;
}
}
}
// 输出出现次数最多的类别
int maxCount = 0, maxIndex = -1;
for (int i = 0; i < s; i++) {
if (categoryCount[i] > maxCount) {
maxCount = categoryCount[i];
maxIndex = i;
}
}
cout << categoryNames[maxIndex] << endl;
return 0;
}
```
该程序读取输入,将每个样本的特征和类别存储在 `Sample` 结构体中,读取特征名称和类别名称,并读取未知样本和 `K` 值。然后,程序计算与每个样本的距离,按距离排序,统计最近的 `K` 个样本的类别,输出出现次数最多的类别名称。
注意,该程序中没有使用 K-Means 算法,因为 K-Means 算法是聚类算法,而 K-NN 算法是分类算法,两者不同。
阅读全文