k-近邻算法(KNN)

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=(xA0xB0)2+(xA1xB1)2 ),选择k个最相似(距离最小)的样本中,类别出现次数最多的作为新数据的类别。

二、特点
  1. 计算复杂度高: 对每一个新样本都要计算其与训练集中所有样本的距离
  2. 没有训练算法这一步
三、归一化数值
  1. 使用原因: 特征值间差距过大(如特征值1都是零点几,特征值2都是几千),数值较大的特征值成为了最终分类的主导因素。
  2. 优点: 均化各特征值对分类结果的影响
  3. 处理:
    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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值