python33 kNN算法的详细解释
2014-06-26 15:29
489 查看
虽然了解过python,但是numpy和operator还是第一次使用,虽然知道knn算法的操作步骤,但是刚开始看这个算法还是不太能明白每一行代码的作用滴。所以要记录下来啦:
首先是kNN算法:python33
def classify0(inX, 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()
classCount={}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] =
classCount.get(voteIlabel,0) + 1
sortedClassCount = sorted(classCount.items(),
key=operator.itemgetter(1), reverse=True)
return
sortedClassCount[0][0]
##################################################################################################
首先函数参数解释(inX, dataSet, labels,
k)其中inX是要进行分类的输入向量,dataSet是已经存在的训练样本集矩阵, labels与dataSet每一行对应的标签
组成的向量, k是用于对inX进行排序的总体计算结果中的前k个(经过排序的前k个)
接下来是每行的解释
##################################################################################################
def classify0(inX, dataSet, labels,
k):
dataSetSize = dataSet.shape[0]
#dataSet的行数
diffMat = tile(inX, (dataSetSize,1)) - dataSet
#通过tile把inX的单行向量扩展到和dataSet同样的行数,然后将inX与样本集中的每行做差,得到差矩阵(这是为了进行计算欧氏距离)
sqDiffMat = diffMat**2
#每行的分量计算平方值
sqDistances = sqDiffMat.sum(axis=1)
#每行进行求和(axis=0是列)
distances = sqDistances**0.5
#对每个分量开方(这就得到了inX与dataSet中的每个训练集的欧氏距离)
sortedDistIndicies =
distances.argsort()返回升序排序后的结果,返回的是distances的分量的下标,下标从0开始
classCount={} #字典
for i in range(k):
#range(k)返回[0,1,...k-1]
voteIlabel
= labels[sortedDistIndicies[i]]
#取得排序数据(原数据的下标)所对应的标签
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
#对出现的标签进行计数,当classCount中没有对应的'key'为voteIlabel时,返回0
sortedClassCount =
sorted(classCount.items(), key=operator.itemgetter(1),
reverse=True) #在python2中使用iteritems()以迭代器对象返回字典键值对
但是我现在用的是python3.3所以python中的dict么有了iteritems(),但是有items()返回只读类集合对象,所以使用items(),然后按照第二个元素的顺序排序
按照逆序排序,
return sortedClassCount[0][0]
#返回最终inX所应该属于的标签(取得的k个递增数据所对应的标签通过上面的步骤进行了每个标签的数量统计,最终获得了标签逆序排序,其中sortedClassCount[0][0]就是k个中出现频率最高的那个标签sortedClassCount[0][1]是对应的频次。
首先是kNN算法:python33
def classify0(inX, 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()
classCount={}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] =
classCount.get(voteIlabel,0) + 1
sortedClassCount = sorted(classCount.items(),
key=operator.itemgetter(1), reverse=True)
return
sortedClassCount[0][0]
##################################################################################################
首先函数参数解释(inX, dataSet, labels,
k)其中inX是要进行分类的输入向量,dataSet是已经存在的训练样本集矩阵, labels与dataSet每一行对应的标签
组成的向量, k是用于对inX进行排序的总体计算结果中的前k个(经过排序的前k个)
接下来是每行的解释
##################################################################################################
def classify0(inX, dataSet, labels,
k):
dataSetSize = dataSet.shape[0]
#dataSet的行数
diffMat = tile(inX, (dataSetSize,1)) - dataSet
#通过tile把inX的单行向量扩展到和dataSet同样的行数,然后将inX与样本集中的每行做差,得到差矩阵(这是为了进行计算欧氏距离)
sqDiffMat = diffMat**2
#每行的分量计算平方值
sqDistances = sqDiffMat.sum(axis=1)
#每行进行求和(axis=0是列)
distances = sqDistances**0.5
#对每个分量开方(这就得到了inX与dataSet中的每个训练集的欧氏距离)
sortedDistIndicies =
distances.argsort()返回升序排序后的结果,返回的是distances的分量的下标,下标从0开始
classCount={} #字典
for i in range(k):
#range(k)返回[0,1,...k-1]
voteIlabel
= labels[sortedDistIndicies[i]]
#取得排序数据(原数据的下标)所对应的标签
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
#对出现的标签进行计数,当classCount中没有对应的'key'为voteIlabel时,返回0
sortedClassCount =
sorted(classCount.items(), key=operator.itemgetter(1),
reverse=True) #在python2中使用iteritems()以迭代器对象返回字典键值对
但是我现在用的是python3.3所以python中的dict么有了iteritems(),但是有items()返回只读类集合对象,所以使用items(),然后按照第二个元素的顺序排序
按照逆序排序,
return sortedClassCount[0][0]
#返回最终inX所应该属于的标签(取得的k个递增数据所对应的标签通过上面的步骤进行了每个标签的数量统计,最终获得了标签逆序排序,其中sortedClassCount[0][0]就是k个中出现频率最高的那个标签sortedClassCount[0][1]是对应的频次。
相关文章推荐
- 麻省理工的 背包算法 python
- KNN算法 代码详细解释
- <Python><有监督>kNN--近邻分类算法
- Top&nbsp;K算法详细解析
- python实现的 K-近邻算法代码详细解释
- python 算法之栈
- 【原创】【算法】python 选择排序
- <基础原理进阶>机器学习算法python实现【1】--分类简谈&KNN算法
- javascript动画、运动算法详细解释与分析 (一、Tween 运动算法学习笔记)
- ZiPhone&nbsp;GUI一键软破工具详细使用教程
- BossPrefs&nbsp;v1.62详细教程及技巧
- python 生成验证码
- BM 算法的详细解释
- 关于>&2、2>&1等重定向的详细解释!
- drupal函数&nbsp;node_get_types的详细…
- 数据结构&算法实践-Python——序章
- 转:经典的KNN算法解释
- javascript动画、运动算法详细解释与分析 (三、Tween 运动算法:二次方曲线算法)
- javascript动画、运动算法详细解释与分析 (二、javascript动画 时间精度问题)
- 比分先知道&nbsp;iScores球赛信息详细使用教程