发布时间:2024-03-02 11:01
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习入门算法——KNN(K-Nearest Neighbor)最邻近分类算法。
提示:以下是本篇文章正文内容,下面案例可供参考
KNN是机器学习中最简单,最基础,也是最好理解思路的一种算法,其指导思想简单可以用一句老话来理解:“近朱者赤,近墨者黑”。
为了判断某未知样本的类别,以所有已知类别的样本作为参照,计算出未知样本与所有已知样本的距离,从中选出已知样本与未知样本距离最近的前K个已知样本,根据投票原则(即少数服从多数原则),将未知样本与K个最近邻的已知样本中所属类别最多的类别归为未知样本类别。
由于算法过程涉及距离的计算,那么就要求样本的所有属性数据均为数值型数据,非数值型数据(如字符串数据)需要转换为数值型数据,常用的方法有使用每种数据出现的频数代替数据,或者使用散列函数将非数值型数据量化
算法实现过程中距离的计算大多使用欧式距离(后文说明),比如现在我有两个属性的数据,一个属性A,属性值的取值区间为[0,1],而属性B的取值区间为[0,100000],那么我们在计算欧式距离时,无疑默认将数据B的权值加重,但我们在训练时并不知道属性A,B哪个对结果的影响更大,所以需要对所有属性的数据进行归一化处理。
通常使用的距离函数有:欧氏距离(欧几里得距离)、余弦距离、汉明距离、曼哈顿距离等,一般选用欧式距离作为距离度量。下面给出欧式距离的定义:
K值作为KNN算法中最重要的一个参数,K值太大容易造成欠拟合,太小容易造成过拟合,所以需要对训练结果进行交叉验证以确定最适K值,交叉验证一般以数据集数量的平方根开始向两边验证。
代码如下(以样本类别数量为2为例,输入train为二维数组,行数据为各个样本数据,列数据为每个属性数据,最后一列为类别属性,test同train,但缺少最后一列类别属性,输出result是长度为样本数量的一维类别数组):
class KNN:
def __init__(self,train,test):
self.train=train
self.test=test
@staticmethod
def distance(x,y):
dis=0.0
for i in range(0,len(x)-1):
dis+=(x[i]-y[i])**2
return dis
def knn(self):
result=[]
for i in range(0,len(self.test)):
dis=[]
for j in range(0,len(self.train)):
temp=[]
temp.append(self.distance(self.train[j],self.test[i]))
temp.append(self.train[j][-1])
dis.append(temp)
dis.sort()
dis=dis[0:K]
class0=0
class1=0
for i in range(0,K):
if dis[i][1]==0:
class0+=1
else :
class1+=1
if class0>class1:
result.append(0)
else :
result.append(1)
return result
例如:以上就是今天要分享的内容,主要简单讲述了KNN算法的实现原理,注意事项,以及代码示例。本人机器学习入门者,若上述内容有误,欢迎交流指正!