机器学习实战之k-近邻算法(1)---c++简单版

输入的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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值