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