K近邻算法
KNN:K-NearestNeighbor–K最近邻(原理)
K最近邻,就是k个最近的邻居的意思,即:每个样本都可以用他最近的k个邻居来代表。
核心思想:如果一个样本在特征空间中的K个最相邻的样本,并且最相邻样本中的大多数属于某一个类别(该样本也属于这个类别,并具有该类别上样本的特性)
KNN很大程度上取决于K的选择
算法三要素:
k值的选择
距离度量方式--------百度上很多
分类决策规制
距离度量:
欧氏距离():
曼哈顿距离(城市街区距离):
k值选择:
较小k值:相当于较小的领域中训练实例,训练误差减小,容易过拟合;
较大k值:较大领域训练实例进行预测,有点减少泛化误差,缺点训练误差增加。
分类决策规则:
分类:
多数表决法
回归:
平均值
如何实现KNN
补充知识:python中对字典进行排序
import operator
def SortDict():
dic={'a':1,'b':2,'c':3,'f':0}
#函数原型:sorted(dic,value,reverse)
#按字典中的键进行升序排序
print("按字典中的键进行升序排序:",\
sorted(dic.items(),key=operator.itemgetter(0),reverse=False))
#按字典中的键进行降序排序
print("按字典中的键进行降序排序:",\
sorted(dic.items(),key=operator.itemgetter(0),reverse=True))
#按字典中的值进行升序排序
print("按字典中的值进行升序排序:",\
sorted(dic.items(),key=operator.itemgetter(1),reverse=False))
#按字典中的值进行降序排序
print("按字典中的值进行降序排序:",\
sorted(dic.items(),key=operator.itemgetter(1),reverse=True))
SortDict()
································································
输出结果:
按字典中的键进行升序排序: [('a', 1), ('b', 2), ('c', 3), ('f', 0)]
按字典中的键进行降序排序: [('f', 0), ('c', 3), ('b', 2), ('a', 1)]
按字典中的值进行升序排序: [('f', 0), ('a', 1), ('b', 2), ('c', 3)]
按字典中的值进行降序排序: [('c', 3), ('b', 2), ('a', 1), ('f', 0)]
简单的knn实现的代码:
#-coding:utf-8-- """ 自定义实现KNN算法 给定一组数据集:其包括了(x,y) 给定一个预测的样本, 通过KNN来预测样本属于哪分类 样本集: 1,1,A 1,2,A 1.5,1.5,A 3,4,B 4,4,B 测试数据: 2,2 请通过KNN对该数据进行分类预测 算法实现思路: 1,计算预测样本和数据集中样本点距离 2,将所有距离从小到大排序 3,计算前K个最短距离类别的个数 4,返回前K个最小距离中个数最多的的分类 """ import numpy as np import operator def handle_data(dataset): """ dataset:样本集 return:输出x和y """ x=dataset[:,:-1].astype(float) y=dataset[:,-1] return x,y def knn_classifier(k,dataset,input): """ k:k个邻居 dataset:所有数据集 input:测试数据 return:输出预测类别 """ x,y=handle_data(dataset) #1,计算预测样本和数据集样本的距离 dist=np.sum((input-x)**2,axis=1)**0.5 #axis=1表示一维 #2,将所有距离从小到大排序 sortedDist=np.argsort(dist) #argsort 排序之后输出下标 #3,计算前K个最短距离类别的个数 countLable={} for i in range(k): label=y[sortedDist[i]] countLable[label]=countLable.get(label,0)+1 #4,返回前K个最小距离中个数最多的的分类(python中字典的排序) sortedLabel=sorted(countLable.items(),key=operator.itemgetter(1),reverse=True) return sortedLabel[0][0] if __name__ == "__main__": dataset = np.loadtxt("C:/Users/yanruyu/Documents/code/python/GA/dataset.txt",dtype="str",encoding='utf-8',delimiter=',') #默认为float,需要dtype x=dataset[:,:-1].astype(np.float) y=dataset[:,-1] test=[2,2] #预测数据 print(knn_classifier(3,dataset,test)) ··························································· 输出结果: PS C:\Users\yanruyu> & D:/Anaconda3/python.exe c:/Users/yanruyu/Documents/code/python/GA/text.py A
我们向往远方,却忽略了此刻的美丽