求k近邻法实例,有的给我发一个,matlab程序。求高手啊!

求k近邻法实例,有的给我发一个,matlab程序。求高手啊!,第1张

大奎!哥来要分!

发个算法吧,以免口舌,VS2008C#算法代码,刚学C#,代码有些粗糙,绝对好使,想要全部代码与本人联系。呵呵~: )

public void knnsf(float PH,float JD,float NH4,float COD,float BOD,float SS,float XTD)

{

double[,] kn = new double[81, 2]

int a = 0, b = 0, c = 0

//计算欧氏距离

for (int i = 0i <27i++ )

{

kn[i, 0] = Math.Sqrt( Math.Pow(class1[i, 1] - PH, 2) + Math.Pow(class1[i, 2] - JD, 2) + Math.Pow(class1[i, 3] - NH4, 2) +

Math.Pow(class1[i, 4] - COD, 2) + Math.Pow(class1[i, 5] - BOD, 2) + Math.Pow(class1[i, 6] - SS, 2) +

Math.Pow(class1[i, 7] - XTD, 2))

kn[i, 1] = 1

kn[i+27,0] = Math.Sqrt(Math.Pow(class2[i, 1] - PH, 2) + Math.Pow(class2[i, 2] - JD, 2) + Math.Pow(class2[i, 3] - NH4, 2) +

Math.Pow(class2[i, 4] - COD, 2) + Math.Pow(class2[i, 5] - BOD, 2) + Math.Pow(class2[i, 6] - SS, 2) +

Math.Pow(class2[i, 7] - XTD, 2))

kn[i+27, 1] = 2

kn[i+54,0] = Math.Sqrt(Math.Pow(class3[i, 1] - PH, 2) + Math.Pow(class3[i, 2] - JD, 2) + Math.Pow(class3[i, 3] - NH4, 2) +

Math.Pow(class3[i, 4] - COD, 2) + Math.Pow(class3[i, 5] - BOD, 2) + Math.Pow(class3[i, 6] - SS, 2) +

Math.Pow(class3[i, 7] - XTD, 2))

kn[i+54, 1] = 3

}

//选择排序法

for (int i = 0i <81i++ )

{

int k = 0

double mintmp = kn[i, 0],clas=kn[i,1]

for (int j = i+1j <81j++)

{

if (mintmp >kn[j, 0])

{

mintmp = kn[j, 0]

clas = kn[j, 1]

k = j

}

}

kn[k, 0] = kn[i, 0]

kn[k, 1] = kn[i, 1]

kn[i, 0] = mintmp

kn[i, 1] = clas

}

//选择K=30个近邻

for (int k = 0k <3k++)

{

if (kn[k, 1] == 1) a++

if (kn[k, 1] == 2) b++

if (kn[k, 1] == 3) c++

}

//统计近邻类别

if (a >b &&a >c)

{

classes = 1

}

if (b >a &&b >c)

{

classes = 2

}

if (c >b &&c >a)

{

classes = 3

}

}

1.K-近邻(KNearestNeighbor,KNN)算法简介 :对于一个未知的样本,我们可以根据离它最近的k个样本的类别来判断它的类别。

以下图为例,对于一个未知样本绿色小圆,我们可以选取离它最近的3的样本,其中包含了2个红色三角形,1个蓝色正方形,那么我们可以判断绿色小圆属于红色三角形这一类。

我们也可以选取离它最近的5个样本,其中包含了3个蓝色正方形,2个红色三角形,那么我们可以判断绿色小圆属于蓝色正方形这一类。

3.API文档

下面我们来对KNN算法中的参数项做一个解释说明:

'n_neighbors':选取的参考对象的个数(邻居个数),默认值为5,也可以自己指定数值,但不是n_neighbors的值越大分类效果越好,最佳值需要我们做一个验证。

'weights': 距离的权重参数,默认uniform。

'uniform': 均匀的权重,所有的点在每一个类别中的权重是一样的。简单的说,就是每个点的重要性都是一样的。

'distance':权重与距离的倒数成正比,距离近的点重要性更高,对于结果的影响也更大。

'algorithm':运算方法,默认auto。

'auto':根绝模型fit的数据自动选择最合适的运算方法。

'ball_tree':树模型算法BallTree

'kd_tree':树模型算法KDTree

'brute':暴力算法

'leaf_size':叶子的尺寸,默认30。只有当algorithm = 'ball_tree' or 'kd_tree',这个参数需要设定。

'p':闵可斯基距离,当p = 1时,选择曼哈顿距离;当p = 2时,选择欧式距离。

n_jobs:使用计算机处理器数目,默认为1。当n=-1时,使用所有的处理器进行运算。

4.应用案例演示

下面以Sklearn库中自带的数据集--手写数字识别数据集为例,来测试下kNN算法。上一章,我们简单的介绍了机器学习的一般步骤:加载数据集 - 训练模型 - 结果预测 - 保存模型。这一章我们还是按照这个步骤来执行。

[手写数字识别数据集] https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_digits.html#sklearn.datasets.load_digits

5.模型的方法

每一种模型都有一些它独有的属性方法(模型的技能,能做些什么事),下面我们来了解下knn算法常用的的属性方法。

6.knn算法的优缺点

优点:

简单,效果还不错,适合多分类问题

缺点:

效率低(因为要计算预测样本距离每个样本点的距离,然后排序),效率会随着样本量的增加而降低。

(1)简单,易于理解,易于实现,无需估计参数。

(2)训练时间为零。它没有显示的训练,不像其它有监督的算法会用训练集train一个模型(也就是拟合一个函数),然后验证集或测试集用该模型分类。KNN只是把样本保存起来,收到测试数据时再处理,所以KNN训练时间为零。

(3)KNN可以处理分类问题,同时天然可以处理多分类问题,适合对稀有事件进行分类。

(4)特别适合于多分类问题(multi-modal,对象具有多个类别标签), KNN比SVM的表现要好。

(5)KNN还可以处理回归问题,也就是预测。

(6)和朴素贝叶斯之类的算法比,对数据没有假设,准确度高,对异常点不敏感。

(1)计算量太大,尤其是特征数非常多的时候。每一个待分类文本都要计算它到全体已知样本的距离,才能得到它的第K个最近邻点。

(2)可理解性差,无法给出像决策树那样的规则。

(3)是慵懒散学习方法,基本上不学习,导致预测时速度比起逻辑回归之类的算法慢。

(4)样本不平衡的时候,对稀有类别的预测准确率低。当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数。

(5)对训练数据依赖度特别大,对训练数据的容错性太差。如果训练数据集中,有一两个数据是错误的,刚刚好又在需要分类的数值的旁边,这样就会直接导致预测的数据的不准确。

需要一个特别容易解释的模型的时候。

比如需要向用户解释原因的推荐算法。

通过此次实验我了解了K近邻算法及其思路,该方法的思路是:如果一个样本在特征空间中的k个最相似的样本中的大多数属于某一个类别,则该样本也属于这个类别。

所谓k近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的k个实例。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12028875.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存