一、knn算法概述
1.算法简介
k-近邻算法是一种用于分类和回归的非参数方法。在分类问题中,它通过测量不同特征之间的距离来对数据进行分类。k-近邻算法不同于传统的基于参数模型的算法,它不会对数据进行假设,而是直接利用数据之间的相似性进行分类。
2.knn算法的一般流程
1.收集数据:可以使用任何方法。
2.准备数据:距离计算所需要的数值,最好是结构化的数据格式。
3.分析数据:可以使用任何方法。
4.训练算法:此步骤不适用于k-近邻算法。
5.测试算法:计算错误率。
6.使用算法:首先需要输入样本数据和结构化的输出结果,然后运行k-近邻算法判定输入数据分别属于哪个分类,最后应用对计算出的分类执行后续的处理。
3.优缺点分析
优点:精度高、对异常值不敏感、无数据输入假定。
缺点:计算复杂度高、空间复杂度高。
二、knn算法实现
1.k值选取
我们在进行knn算法的时候需要选取合适的k值,不然会造成得到的结果有误差。
k值偏小:如果遇到异常点或者局部特性较强的样本,可能会导致错误的分类,对训练数据过度敏感,泛化能力变差,会造成过拟合现象。
k值偏大:对于复杂的分类边界,可能无法捕捉到真实的数据分布,导致分类性能下降,当 k 值较大时,模型会变得简单,可能会忽略样本之间的细微差异,会造成欠拟合现象。
2.距离计算
这里我使用的是欧氏距离计算公式。
3.代码实现
import numpy as np
import operator
def createDataSet():
features=np.array([[160,48],[165,50],[178,8],[185,12]])
labels=['女','女','男','男']
return features,labels
def classify0(X,data,labels,k):
dataSize=data.shape[0]
diffMat=np.tile(X,(dataSize,1))-data
sqdiffMat=diffMat**2
sqdistances=sqdiffMat.sum(axis=1)
distances=sqdistances**0.5
sortedDistIndicies=distances.argsort()
classCount={}
for i in range(k):
voteIlabel=labels[sortedDistIndicies[i]]
classCount[voteIlabel]=classCount.get(voteIlabel,0)+1
sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
return sortedClassCount[0][0]
features,labels=createDataSet()
test=[160,12]
start_test=classify0(test,features,labels,3)
print(start_test)
4.运行结果
希望以上内容对读者能提供一些帮助,学无止境!