当前位置:   article > 正文

2024年C C++最全机器学习算法KNN之c++实现(不调用外源库)_knn算法 c+(1),阿里C C++面试必问_knn c++

knn c++

img
img

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

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

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

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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

}
/计算每个测试样本与训练样本的距离,保存在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个近邻中最大的一个
			}
		}
	}
}
return Kdistances;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

}
//KNN决规则,这里采用平局权重投票,且不考虑样本不均衡问题
/**
1,knn分类决策函数,首先对训练数据和测试数据进行归一化,
2,计算每一个测试样本到m个训练样本的距离
3,从m个距离中选出最小的k个距离,并记录这k个最小距离的样本
4,由k个样本加权投票得到最终的决策类别

***/
int classfiy(Matrix testData, Matrix testDatay, Matrix x, Matrix y, int K)
{

}
int main()
{
dataToMatrix dtm;
cout << “loadData” << endl;
cout << “----------------------” << endl;
//记得改路径
char file[40] = “data/knn.txt”;
dtm.loadData(&dtm, file);
//dtm.print(dtm);

Matrix x;
x.loadMatrix(&x, dtm);

Matrix y;
y.initMatrix(&y, x.col, 1);
y = y.getOneRow(x, x.row - 1);

x.deleteOneRow(&x, x.row);


dataToMatrix dtmTest;
cout << "loadData" << endl;
cout << "----------------------" << endl;
//记得改路径
char testFile[40] = "data/knnTest.txt";
dtmTest.loadData(&dtmTest, testFile);
//dtmTest.print(dtmTest);

Matrix testData;
testData.loadMatrix(&testData, dtmTest);

Matrix testDatay;
testDatay.initMatrix(&testDatay, x.col, 1);
testDatay = testDatay.getOneRow(testData, testData.row - 1);

testData.deleteOneRow(&testData, testData.row);


classfiy(testData, testDatay, x, y, 10);
return 0;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

}




![img](https://img-blog.csdnimg.cn/img_convert/ea50bf2506f173550e48b3649fbddbb2.png)
![img](https://img-blog.csdnimg.cn/img_convert/2f6fa38eeb68547e8738e59a527519e7.png)

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

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


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

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


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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/801213
推荐阅读
相关标签
  

闽ICP备14008679号