机器学习(一)——k-近邻、kd树及其python实现

1.k近邻的基本原理

1.1基本流程

k-近邻通过测量不同特征属性之间的距离来分类

一般流程:

(1)计算当前点与已知类别(训练集)中的各个点之间的距离(欧式、皮尔逊等)

(2)距离递增排序。选取距离最小的前k个

(3)对这个k个点的类别计数,即k个点中属于类别1的有几个,属于类别2的有几个。。。。

(4)返回类别出现次数最多的类,当做当前的预测分类

1.2k-近邻的三个基本要素

  • 距离度量

欧式距离(p=2)、简单的绝对值相加(p=1)、p=3/4…..

  • k值的选择

k值小,意味着采用较小的邻域中的训练实例进行预测,近似误差减小,模型复杂,容易过拟合。极端情况是k=1,选取一个距离最近的。这种情况会导致估计误差变大,单个点的结果即代表预测结果,如果单个点恰巧是噪声点,则GG思密达惊恐。

k值大,意味着采用较大的邻域中的训练实例进行预测,模型简单,近似误差增大。极端情况是全部训练点,这个时候,预测结果等于出现频次最多的类,虽然估计误差减少了,但是预测也没有意义再见。

一般,k先取小值,交叉验证,选取最优结果的k值。

  • 分类决策规则

多数表决,即与带预测点距离最近的k个点坐在类别中,类别出现次数最多的,即为预测分类。

多数表决规则等价于经验风险最小化

1.3k近邻的python实现

因为是学习,所以就选取了sklearn包中的鸢尾花数据集进行测验,没有对数据进行处理,直接测试算法(简单的数据可视化分析在上一篇文章中讲到)。

from numpy import *
import operator
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
#kNN算法
def classfy(test,dataSet,label,k):
    dataSetSize=dataSet.shape[0]
    #采用欧氏距离公式
    # 扩充矩阵,计算差
    diffMat=tile(test,(dataSetSize,1))-dataSet
    #计算平方
    diffMatSquare=diffMat**2
    #横向求和
    disSum=diffMatSquare.sum(axis=1)
    #开根号
    distacens=disSum**0.5
    #按距离由小到大排序,并返回索引值
    sortDistanceIndex=distacens.argsort()
    classCount={}
    for i in range(k):
        key=label[sortDistanceIndex[i]]
        classCount[key]=classCount.get(key,0)+1
    sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
    return  sortedClassCount[0][0]

# 加载数据,获取数据的特征属性列表、数据、分类信息
dataSet = load_iris()
# 获取属性标签
FeatureLabels = dataSet.feature_names
# 获取属性数据
data= dataSet.data
# 获取分类信息
classInfo = dataSet.target
#划分测试集和训练集
train,test,train_label,test_label=train_test_split(data,classInfo,test_size=0.9)
testSize=test.shape[0]
err_count=0.0
for i in range(testSize):
    classResult=classfy(test[i,:],train,train_label,5)
    print('推算结果是',classResult,'-------实际结果是',test_label[i])
    if classResult!=test_label[i]:
        err_count+=1
errRate=err_count/testSize
print('错误率是:%f'%errRate)

【结果】
鸢尾花数据集上运行k-近邻结果
单独运行一次的结果会不稳定,而且k的值也是可调的

2.kd树

k-近邻主要是通过距离计算寻找k个最近邻居,当数据量很大时,计算及其耗时,解决思路是如何减少距离的计算次数,使得八竿子打不着的点就不用计算距离了,从而提高k近邻的搜索效率,kd树就是其中一种方法

2.1构造平衡kd树

输入:k维空间数据集 Y={ x1,

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值