k近邻定义
K近邻算法,即K-Nearest Neighbor algorithm,简称KNN算法,可以根据字面意思理解为:K个最近的邻居。因为k近邻是分类算法,找到最近的邻居就能知道自己所在的类别。
用途
k近邻用于解决分类问题。因为需要计算特征之间的距离,所以需要将数据集中的特征数据变成数值型和标称型。
公式
求距离一般采用欧式距离公式,在《机器学习实战》k近邻章节中有这样一个公式:
d
=
(
x
A
0
−
x
B
0
)
2
+
(
x
A
1
−
x
B
1
)
2
d=\sqrt{(xA_{0}-xB_{0})^{2}+(xA_{1}-xB_{1})^{2}}
d=(xA0−xB0)2+(xA1−xB1)2
其中
x
A
xA
xA表示输入的需要分类的测试样本,
x
B
xB
xB表示输入的需要分类的训练样本,
x
A
0
xA_{0}
xA0表示测试样本的第一个特征,
x
A
1
xA_{1}
xA1表示测试样本的第二个特征,
x
B
0
xB_{0}
xB0表示训练样本的第一个特征,
x
B
1
xB_{1}
xB1表示训练样本的第二个特征。
如果数据存在4个特征值,则点(1,0,0,1)与点(7,6,9,4)之间的距离为 ( 7 − 1 ) 2 + ( 6 − 0 ) 2 + ( 9 − 0 ) 2 + ( 4 − 1 ) 2 \sqrt{{(7-1)^{2}+(6-0)^{2}+(9-0)^{2}+(4-1)^{2}}} (7−1)2+(6−0)2+(9−0)2+(4−1)2
代码
##给出训练数据以及对应的类别
import pandas as pd
from numpy import *
def createDataSet():
group = array([[1.0,2.0],[1.2,0.1],[0.1,1.4],[0.3,3.5]])
labels = ['A','A','B','B']
return group,labels
###通过KNN进行分类
def classify(input_x,dataSet,label,k):
dataSize = dataSet.shape[0]
print("dataSize:",dataSize)
####计算欧式距离
print("tile的作用:",tile(input_x,(dataSize,1)))#其实tile就是重复的意思,把一个数组a,当做模板,重复几次,生成另一个数组b,这里就是把input_x数组重复成4行1列,这样方便去减训练集的特征
diff = tile(input_x,(dataSize,1)) - dataSet
sqdiff = diff ** 2#每行进行求平方
squareDist = sum(sqdiff,axis = 1)###行向量分别相加,从而得到新的一个行向量
dist = squareDist ** 0.5
##对距离进行排序
sortedDistIndex = argsort(dist)##argsort()根据元素的值从大到小对元素进行排序,返回下标
classCount={}
for i in range(k):
voteLabel = label[sortedDistIndex[i]]
###对选取的K个样本所属的类别个数进行统计
classCount[voteLabel] = classCount.get(voteLabel,0) + 1
###选取出现的类别次数最多的类别
maxCount = 0
for key,value in classCount.items():
if value > maxCount:
maxCount = value
classes = key
return classes
#进行测试
dataSet,label=createDataSet()
classify([1.0,1.0],dataSet,label,2)
输出:
dataSize: 4
tile的作用: [[1. 1.]
[1. 1.]
[1. 1.]
[1. 1.]]
‘A’
得到最后的分类为A