输入的t.txt文件中的数据(随便写的,可以参考):
20
1 3 25 30 0
2 2 30 29 0
4 2 31 28 0
20 30 1 1 1
3 4 40 33 0
30 29 2 3 1
33 29 4 2 1
2 2 29 30 0
33 29 4 2 1
5 2 29 30 0
30 24 6 2 1
4 2 33 30 0
31 26 4 3 1
7 1 28 30 0
32 21 2 2 1
1 3 27 30 0
36 28 3 2 1
3 2 23 34 0
36 26 3 2 1
3 2 36 26 1
10
1 1 40 39 0
2 2 40 32 0
1 3 35 35 0
4 3 35 38 0
5 1 29 30 0
29 30 2 3 1
25 35 1 2 1
29 30 2 2 1
26 30 2 4 1
29 33 1 5 1
运行结果:
代码如下:
//k-近邻算法简单版 两类分类器 没有考虑归一化
//数据量特别大的话,不能用冒泡排序,应该使用优先队列或者K最大/小堆来维护
#include <iostream>
#include <fstream>
using namespace std;
double d1[10000], d2[10000], d3[10000], d4[10000];
int y[10000];
int t1[10000], t2[10000], t3[10000], t4[10000];
int y2[10000];
double dis[10000][10000];
int index[10000][10000];
int main()
{
freopen("t.txt", "r", stdin);
int train_num = 0;
int test_num = 0;
cout<<"---------------------------------------------"<<endl;
cout<<"k-近邻算法(两类分类器)简单版演示(k==3)"<<endl;
//输入
cout<<"请输入训练实例个数"<<endl;
cin>>train_num;
cout<<"请依次输入"<<train_num<<"个实例的特征1, 2, 3, 4, 标签(0或1)"<<endl;
for(int i = 0; i < train_num; i++)
{
cin>>d1[i]>>d2[i]>>d3[i]>>d4[i]>>y[i];
}
cout<<"请输入测试实例个数"<<endl;
cin>>test_num;
cout<<"请依次输入"<<test_num<<"个实例的特征1, 2, 3, 4, 标签(0或1)"<<endl;
for(int i = 0; i < test_num; i++)
{
cin>>t1[i]>>t2[i]>>t3[i]>>t4[i]>>y2[i];
}
//处理
for(int i = 0; i < test_num; i++)
{
for (int j = 0; j < train_num; j++)
{
dis[i][j] = (t1[i] - d1[j]) * (t1[i] - d1[j]) + (t2[i] - d2[j]) * (t2[i] - d2[j]) + (t3[i] - d3[j]) * (t3[i] - d3[j]) + (t4[i] - d4[j]) * (t4[i] - d4[j]);
index[i][j] = j;
}
}
for (int k = 0; k < test_num; k++)
{
for (int i = 0; i < train_num - 1; i++)
{
for(int j = 0; j < train_num - i; j++)
{
if(dis[k][j] > dis[k][j+1])
{
double temp = dis[k][j];
dis[k][j] = dis[k][j+1];
dis[k][j+1] = temp;
int temp1 = index[k][j];
index[k][j] = index[k][j+1];
index[k][j+1] = temp1;
}
}
}
}
//输出
int correct = 0;
for (int i = 0; i < test_num; i++)
{
if(y[index[i][0]] + y[index[i][1]] + y[index[i][2]] < 2)
{
if(y2[i] == 0)
correct++;
}
else
{
if(y2[i] == 1)
correct++;
}
}
cout<<"准确率: "<<correct * 1.0 / test_num * 100<<"%"<<endl;
cout<<"---------------------------------------------"<<endl;
return 0;
}