机器学习实战笔记(二)KNN(K-Nearest Neighbors) k-近邻算法

特点:
精度高、对异常值不敏感、无输入假定;计算复杂度高,空间复杂度高。适用数值型和标称型(枚举?)

原理:
存在一个样本数据集合(训练样本),样本集中每个数据(特征)都存在标签(分类结果),即我们知道样本集中每一个样本数据与分类的对应关系。输入一个新的数据,将新数据的每个特征与样本集数据中的特征进行比较,这种比较一般用相似算法来实现。比较完后通过算法找到样本集中特征最相似的k个数据(k个最近邻居)的标签,选择这k个邻居中出现次数最多的标签即使我们预测的新数据的标签。

相似算法:
      闵可夫斯基距离     
      欧氏距离                
      曼哈顿距离            
可以看出欧式距离和曼哈顿距离是闵可夫斯基距离的特例。

步骤:
1.准备数据
2.输入数据
3.分析数据
4.训练算法(KNN无需本步骤)
5.测试算法
6.使用算法


算法描述:
1.计算已知类别数据集中每个点与当前点的距离
2.将已知类别数据集中的点按照与当前点距离进行排序
3.选取与当前点距离最小的K个点
4.确定K个点中各个分类的频率
5.取频率最高的点的分类作为当前点的预测分类

归一化:
数据中,各个特征的取值范围不一样,有些值范围特别大的特征的波动就明显的影响最后距离的计算结果,所以如果这个特征的地位和其他的特征一样,则要采取归一化处理,将其值范围归一化到相同的范围。

算法实现:
通过python语言和numpy函数库来实现

1.核心函数
#intx是一个要预测的向量。也就是该数据的特征的一维数组
#dataSet是训练集,包括多个样本,每个样本的特征数和要预测的向量的特征数一样
#labels是训练集中样本的分类变量,数量和样本的个数一致
#k是预测的时候取得最近邻居的个数
#在这里用到了numpy库来进行向量和矩阵的计算
def classknn(intx,dataSet,labels,k):
dataSetSize=dataSet.shape[0] #获取样本数量
#下面四行通过欧式距离公式计算距离
diffMat=tile(inX,(dataSetSize,1))-dataSet
sqDiffMat=diffMat**2
sqDistances=sqDiffmat.sum(axis=1)
distances=sqDistances**0.5
#对距离进行排序
sortedDistIndicies=distances.argsort()
#存储k个最近邻居中每种分类结果的数量
classCount{}
for i in range(k)
voteIlabel=labels[sortedDistIndicies[i]]
classCount[voteIlabel]=classCount.get(voteIlabel,1)+1
#对k个最近邻居中分类结果数进行倒排序
sortClassCount=sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=true)
#取第一个元素,即k个最近邻居中分类数最多的分类作为预测结果
return sortedClassCount[0][0]
2.归一化函数
def autoNorm(dataSet)
#取样本集中每个特征的最小值
minVals=dataSet.min(0)
#取样本集中每个特征的最大值
maxVals=dataSet.max(0)
#获得样本集中每个特征最大值和最小值的差
ranges=maxVals-minVals
normDataSet=zeros(shape(dataSet))
m=dataSet.shape[0]
#将样本集中的每个特征值转换成为该特征值与该特征最小值的差
normDataSet=dataSet-tile(minVals,(m,1))
#将样本集中的每个特征值转换成为0..1之间的值
normDataSet=normDataSet/title(ranges,(m,1))
return normDataSet,ranges,minVals


KNN小结
算法简单,但是效率比较低,运算的次数比较多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值