小标
2018-10-15
来源 :
阅读 1477
评论 0
摘要:本文主要向大家介绍了机器学习入门之《机器学习实战》中的程序清单2-1 k近邻算法classify0都做了什么,通过具体的内容向大家展现,希望对大家学习机器学习入门有所帮助。
本文主要向大家介绍了机器学习入门之《机器学习实战》中的程序清单2-1 k近邻算法classify0都做了什么,通过具体的内容向大家展现,希望对大家学习机器学习入门有所帮助。
def start():
group,labels = createDataSet()
return classify0([3,3], group, labels, 4)
def createDataSet():
group = array([[1,2],[2,3],[1,1],[4,5]]) #此处随意定义,表示一个已知的已分类的数据集
labels = [‘A‘,‘A‘,‘B‘,‘B‘]
return group, labels
def classify0(inX,dataSet,labels,k):
"""
inX 是输入的测试样本,是一个[x, y]样式的
dataset 是训练样本集
labels 是训练样本标签
k 是top k最相近的
"""
# 矩阵的shape是个tuple,如果直接调用dataSet.shape,会返回(4,2),即
# 返回矩阵的(行数,列数),
# 那么shape[0]获取数据集的行数,
# 行数就是样本的数量
# shape[1]返回数据集的列数
dataSetSize = dataSet.shape[0]
###################说明代码########################
print("dataSet.shape[0]返回矩阵的行数:")
print(dataSetSize)
cols = dataSet.shape[1]
print("dataSet.shape[1]返回矩阵的列数:")
print(cols)
print(dataSet.shape)
print("dataSet.shape类型:")
print(type(dataSet.shape))
###################################################
#此处Mat是Maxtrix的缩写,diffMat,即矩阵的差,结果也是矩阵
#关于tile函数的说明,见//www.cnblogs.com/Sabre/p/7976702.html
#简单来说就是把inX(本例是[1,1])在“行”这个维度上,复制了dataSetSize次(本例dataSetSize==4),在“列”这个维度上,复制了1次
#形成[[1,1],[1,1],[1,1],[1,1]]这样一个矩阵,以便与dataSet进行运算
#之所以进行这样的运算,是因为要使用欧式距离公式求输入点与已存在各点的距离
#这是第1步,求给出点[1,1]与已知4点的差,输出为矩阵
diffMat = tile(inX,(dataSetSize,1)) - dataSet
###################说明代码########################
print("diffMat:" + str(diffMat))
###################################################
#对矩阵进行平方,即,求差的平方
sqDiffMat = diffMat ** 2
###################说明代码########################
print("sqDiffMat:" + str(sqDiffMat))
###################################################
#sum(axis=1)是将矩阵中每一行中的数值相加,如[[0 0] [1 1] [0 1] [9 9]]将得到[0,2,1,18],得到平方和
#sum(axis=0)是将矩阵中每一列中的数值相加
sqDistances = sqDiffMat.sum(axis=1)
###################说明代码########################
print("sqDistances:" + str(sqDistances))
###################################################
#将平方和进行开方,得到距离,输出数组
distances = sqDistances ** 0.5
###################说明代码########################
print("未知点到各个已知点的距离:",distances)
###################################################
#argsort(),将数组中的元素的索引放在由小到大的位置上由小到大排序
#如数组[ 0 2 1 18],argsort之后,得到[0 2 1 3],最小的在最前面,位置0,第二小的是索引为2的元素,即1
#第三小的是索引为1的,即2,第四小的是索引为3的,即18
#这样保证了原数组元素的位置不变,以便进行标签的匹配
sortedDistIndicies = distances.argsort()
###################说明代码########################
print("索引位置:",sortedDistIndicies)
###################################################
#创建空字典
classCount = {}
#k值是取前k个样本进行比较
for i in range(k):
#返回distances中索引为sortedDistIndicies[i]的值
#此例中分别为:
#sortedDistIndicies[0]==0,则labels[0]==‘A‘,voteIlabel==‘A‘
#sortedDistIndicies[1]==2,则labels[2]==‘B‘,voteIlabel==‘B‘
#sortedDistIndicies[2]==1,则labels[0]==‘A‘,voteIlabel==‘A‘
#sortedDistIndicies[3]==18,则labels[0]==‘B‘,voteIlabel==‘B‘
voteIlabel = labels[sortedDistIndicies[i]]
###################说明代码########################
print("标签" + str(i) + ":" + voteIlabel)
###################################################
#dict.get(key, default=None),对于键 key 返回其对应的值,或者若 dict 中不含 key 则返回 default(注意, default的默认值为 None)
#第一次调用classCount.get时,classCount内还没有值
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
###################说明代码########################
print("第"+str(i+1)+"次访问,classCount[" + voteIlabel + "]值为:" + str(classCount[voteIlabel]))
print("classCount的内容为:")
print(classCount)
###################################################
# sorted(iterable[,cmp,[,key[,reverse=True]]])
# 作用:Return a new sorted list from the items in iterable.
# 第一个参数是一个iterable,返回值是一个对iterable中元素进行排序后的列表(list)。
# 可选的参数有三个,cmp、key和reverse。
# 1)cmp指定一个定制的比较函数,这个函数接收两个参数(iterable的元素),如果第一个参数小于第二个参数,返回一个负数;如果第一个参数等于第二个参数,返回零;如果第一个参数大于第二个参数,返回一个正数。默认值为None。
# 2)key指定一个接收一个参数的函数,这个函数用于从每个元素中提取一个用于比较的关键字。默认值为None。
# 3)reverse是一个布尔值。如果设置为True,列表元素将被倒序排列。
# operator.itemgetter(1)这个很难解释,用以下的例子一看就懂
# a=[11,22,33]
# b = operator.itemgetter(2)
# b(a)
# 输出:33
# b = operator.itemgetter(2,0,1)
# b(a)
# 输出:(33,11,22)
# operator.itemgetter函数返回的不是值,而是一个函数,通过该函数作用到对象上才能获取值
# 比较复杂,此处不做过多解释
sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1), reverse=True)
print(sortedClassCount)
#返回正序排序后最小的值,即“k个最小相邻”的值决定测试样本的类别
print("最终结果,测试样本类别:" , end="")
print(sortedClassCount[0][0])
return sortedClassCount[0][0]
if __name__=="__main__":
start()
输出结果:
dataSet.shape[0]返回矩阵的行数:4dataSet.shape[1]返回矩阵的列数:2(4, 2)dataSet.shape类型:
本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标人工智能机器学习频道!
喜欢 | 0
不喜欢 | 0
您输入的评论内容中包含违禁敏感词
我知道了

请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号