最新机器学习算法KNN之c++实现(不调用外源库)_knn算法 c+,经验总结

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

2)想提升自己的代码能力

第一步:原理

k-近邻算法就是通过测量不同特征值之间的距离来进行分类,其优点:精度高、对异常值敏感、无数据输入假定,其缺点:计算复杂度高、空间复杂度高。

其伪代码:

对已知类别属性的数据集中的每个点依次执行以下操作:

1)计算已知类别数据集中的点与当前点之间的距离

2)按照距离递增次序排序

3)选取于当前点距离最小的k个点

4)确定前k个点所在类别的出现频率

5)返回前k个点出现频率最高的类别作为当前点的预测分类

第二步:代码实现

#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <vector>
#include <math.h>
#include "matrix.h"
using namespace std;

/***数据归一化处理,data[i][j]-min[j]/range[j]**/
int autoNorm(Matrix x)
{
	int j = 0, i = 0;

	Matrix minVals;
	minVals.initMatrix(&minVals, 1, x.row, MAX); //1行 row列

	Matrix maxVals;
	maxVals.initMatrix(&maxVals, 1, x.row, MIN);

	Matrix ranges;
	ranges.initMatrix(&ranges, 1, x.row);

	for (j = 0; j<x.row; j++)
	{
		minVals.mat[0][j] = x.mat[0][j];
		maxVals.mat[0][j] = minVals.mat[0][j];
	}
	for (i = 0; i<x.col; i++)
	{
		for (j = 0; j<x.row; j++)
		{
			if (x.mat[i][j]<minVals.mat[0][j])
				minVals.mat[0][j] = x.mat[i][j];
			if (x.mat[i][j]>maxVals.mat[0][j])
				maxVals.mat[0][j] = x.mat[i][j];
		}
	}
	for (i = 0; i<x.row; i++)
		ranges.mat[0][i] = maxVals.mat[0][i] - minVals.mat[0][i];
	for (i = 0; i<x.col; i++)
	{
		for (j = 0; j<x.row; j++)
		{
			x.mat[i][j] -= minVals.mat[0][j];
			x.mat[i][j] /= ranges.mat[0][j];
			//cout<<x.mat[i][j]<<"  ";
		}
		//cout<<endl;
	}
	return 0;
}
/**计算每个测试样本与训练样本的距离,保存在distance矩阵中**/
Matrix cdistances(Matrix test, Matrix x)
{
	int i, j;
	Matrix distances;
	distances.initMatrix(&distances, x.col, 1, 0);
	for (i = 0; i<x.col; i++)
	{
		for (j = 0; j<x.row; j++)
		{
			distances.mat[i][0] += pow((x.mat[i][j] - test.mat[0][j]), 2);
		}
		distances.mat[i][0] = sqrt(distances.mat[i][0]);
		//cout<<"dis="<<distances.mat[i][0]<<endl;
	}
	return distances;
}
/***选择出K个近邻**/
Matrix getK(Matrix oneTest, Matrix x, int K)
{
	int i, j, k;
	//为每一个测试样本初始化k个近邻为前k个训练样本,并记录近邻的id
	Matrix distances;
	distances.initMatrix(&distances, x.col, 1);
	distances = cdistances(oneTest, x);

	Matrix Kdistances;
	Kdistances.initMatrix(&Kdistances, K, 2);
	double Max = -1;
	int Maxi = -1;
	for (i = 0; i<K; i++)
	{
		Kdistances.mat[i][0] = distances.mat[i][0];
		Kdistances.mat[i][1] = i;//记录近邻的id
		if (Kdistances.mat[i][0]>Max)
		{
			Max = Kdistances.mat[i][0];
			Maxi = i;//选出当前k个近邻中最大的一个
		}
	}
	//为每一个测试样本从第K个训练样本中遍历更新新的k个近邻
	for (i = K; i<x.col; i++)
	{
		if (distances.mat[i][0]<Max)
		{
			Kdistances.mat[Maxi][0] = distances.mat[i][0];
			Max = distances.mat[i][0];//暂时更新当前替换的距离为最大距离,因为已经不能用之前的最大距离了
			Kdistances.mat[Maxi][1] = i;//记录近邻的id
			for (k = 0; k<K; k++)
			{
				if (Kdistances.mat[k][0]>Max)
				{
					Max = Kdistances.mat[k][0];
					Maxi = k;//选出当前k个近邻中最大的一个
				}
			}
		}


![img](https://img-blog.csdnimg.cn/img_convert/7e1b17a4021429265cff49c8c4a82032.png)
![img](https://img-blog.csdnimg.cn/img_convert/1da7fb33a95b197905a46497fb8fafbe.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值