k-近邻算法(KNN)
一、概念
采用测量不同特征值之间距离的方法进行分类采用测量不同特征值之间距离的方法进行分类
计算新输入的无分类数据与训练集中的每个样本的距离(欧式距离: d = ( x A 0 − x B 0 ) 2 + ( x A 1 − x B 1 ) 2 d = \sqrt {( x_{A_0}- x_{B_0})^2 + ( x_{A_1}- x_{B_1})^2} d=(xA0−xB0)2+(xA1−xB1)2 ),选择k个最相似(距离最小)的样本中,类别出现次数最多的作为新数据的类别。
二、特点
- 计算复杂度高: 对每一个新样本都要计算其与训练集中所有样本的距离
- 没有训练算法这一步
三、归一化数值
- 使用原因: 特征值间差距过大(如特征值1都是零点几,特征值2都是几千),数值较大的特征值成为了最终分类的主导因素。
- 优点: 均化各特征值对分类结果的影响
- 处理:
ranges = max_val - min_val val = (val - min_val) / ranges
四、主要分类代码
'''
参数:
inx: 进行类别判断的数据
data_mat:已有类别的数据集,numpy矩阵,每一行是一个样本
labels:类别标签数组
k:算法k值
返回值:
sorted_vote[0][0]: 类别标签
'''
def classify(in_x, data_mat, labels, k):
x_mat = tile(in_x, (data_mat.shape[0], 1))
result_mat = (data_mat- x_mat ) **2
result_mat = result_mat .sum(axis = 1) ** 0.5
sorted_index = result_mat .argsort()
class_vote = {}
for i in range(k):
label = labels[sorted_index [i]]
if label not in class_vote .keys():
class_vote [label] = 1
else:
class_vote [label] = class_vote [label] + 1
sorted_vote = sorted(class_vote .items(), key=operator.itemgetter(1), reverse=True)
return sorted_vote[0][0]