knn算法概述
简单地说,K邻近算法采用测量不同特征值之间的距离来进行分类
工作原理:存在一个样本数据集合,并且样本集中每个数据都存在标签,也就是我们都知道样本集中每一数据与所属分类的关系,输入没有标签的新数据后,将新数据的每个特征与样本中的数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最邻近)的分类标签。
计算两个向量点A,B之间的距离
d=
s
q
r
t
[
(
x
A
0
−
x
B
0
)
2
+
(
x
A
1
−
x
B
1
)
2
]
sqrt[ ( xA_0-xB_0)^2+(xA_1-xB_1)^2]
sqrt[(xA0−xB0)2+(xA1−xB1)2]
举个例子
import numpy as np
import operator
def createDataSet():
group = np.array([[1.0,2.0],[1.2,2.4],[0.1,1.4],[0.3,1.5],[0.2,0.9],[1.8,2.1]])#训练数据
labels = ['A','A','B','B','B','C']
return group,labels
def classify(input,dataSet,label,k):
datasize=dataSet.shape[0]
juzheng=np.tile(input,(datasize,1))#将输入的一维矩阵转为二维的datasize行的矩阵
#计算欧式距离
distance=juzheng-dataSet
#对每个元素做平方
ds=distance**2
dsqiuhe=np.sum(ds,axis=1)#每行每个元素相加
sqrtdsqiuhe=dsqiuhe**0.5#对每个元素开跟
print(sqrtdsqiuhe)
sortdistance=np.argsort(sqrtdsqiuhe)#对每个元素的原来的索引进行排序 排出的数组为每个元素从小到大后原来索引的值
classCount = {}
print(sortdistance)
for i in range(k):
voteLabel = label[sortdistance[i]]
###对选取的K个样本所属的类别个数进行统计
classCount[voteLabel] = classCount.get(voteLabel, 0) + 1
print(classCount[voteLabel],voteLabel)
###选取出现的类别次数最多的类别
maxCount = 0
for key, value in classCount.items():
if value > maxCount:
maxCount = value
classes = key
return classes
dataSet,labels = createDataSet()
input = np.array([1.1,1.5])
K = 3
output = classify(input,dataSet,labels,K)
print("测试数据为:",input,"分类结果为:",output)