机器学习实战之KNN实现
KNN实现思想如下:
对位置数据集中的每个点依次执行以下操作:
1)计算已知类别数据集中的点与当前点之间的距离;
2)按照距离递增依次排序;
3)选取与当前点距离最小的k个点;
4)确定前k个点所在类别的出现频率;
5)返回前k个点出现频率最高的类别作为当前点的预测分类;
KNN优缺点
优点:
- 精度高
- 对异常值不敏感
- 无数据输入假设(LR假设输入数据服从伯努利,线性回归假设输入数据服从高斯分布)
缺点:
- 计算复杂度高:需要和空间中每个点都计算距离(优化:kd树)
- 空间复杂度高:需要存储所有点
代码实现
去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片
.
from numpy import *
import operator
#生成数据集
def createDataSet():
group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
labels = ['A','A','B','B']
return group, labels
def knn(dataSet,labels,point,k):
#获得数据点个数
dataSetSize = dataSet.shape[0]
#计算欧氏距离
#tile(key,(x,y))在行方向重复key x次,列方向重复key y次
diffMat = tile(point,(dataSetSize,1)) - dataSet
sqDiffMat = diffMat**2
sqDistances = sqDiffMat.sum(axis=1)
distances = sqDistances**0.5
#排序并返回原索引
sortedDistIndicies = distances.argsort()
class_count = {}
#计算统计前k次中,每个label次数
for i in range(k):
key = labels[sortedDistIndicies[i]]
#dic.get(key,0)获得key,若不存在则dic[key]=0
class_count[key] = class_count.get(key,0) + 1
sorted_class_count = sorted(class_count.iteritems(),key = lambda x:x[1],reverse=True)
return sorted_class_count