一、原理
看最靠近自身的k个是什么,那自己就是什么。
属于消极分类,不需要训练模型
需要计算全局距离,当samples很大时很难使用(当然可以抽样)
二、代码
import numpy as np from sklearn.datasets import load_iris import distance as d iris = load_iris() data = iris.data # 。shape=(150,4) target = iris.target def max_word(lt): d = {} max_key = None for w in lt: if w not in d: count = lt.count(w) d[w] = count if d.get(max_key, 0) < count: max_key = w return max_key def kNN(testdata, dataSet, labels, k): # 第一步,测定距离列表、 disArray = np.zeros(dataSet[:, 0].shape) for i in range(len(dataSet)): disArray[i] = d.euclidean(testdata, dataSet[i]) # 第二步,联合labels取最小的k个 dis_labels = list(zip(disArray, labels)) dis_labels = sorted(dis_labels, key=lambda x: x[0]) # 排序 for i in range(len(dis_labels)): dis_labels[i] = np.array(dis_labels[i]) # 这里把人折磨疯了,一直不能切片,写的很丑陋 k_labels = list(np.array(dis_labels)[:10, 1]) # 第三步,查找labels中出现次数最多的元素 return int(max_word(k_labels)) if __name__ == "__main__": k = 10 testdata = [5, 3, 1.4, .2] # 只测试一组 print(kNN(testdata, data, target, k))
结果:
Python 3.7.0 (default, Jun 28 2018, 08:04:48) [MSC v.1912 64 bit (AMD64)] on win32
runfile('H:/PythonProject/茎叶图.py', wdir='H:/PythonProject')
0