机器学习实战——knn

from numpy import * #引入numpy包
import  operator#引入运算符模块

import KNN

"""
Parameters:
    无
Returns:
    group - 数据集
    labels - 分类标签
"""
#创建数据集(包括数据和标签)
def createDataSet():
    #六组二维特征
    group=array([[3,104],[2,100],[1,81],[101,10],[99,5],[98,2]])#np.array(),NumPy库的函数创建多维数组
    #六组特征的标签
    labels=['爱情片','爱情片','爱情片','动作片','动作片','动作片']
    return group, labels
#group,labels=KNN.createDataSet()
#print(group)


"""
Parameters:
    inX - 用于分类的数据(测试集)
    dataSet - 用于训练的数据(训练集)
    labes - 分类标签
    k - kNN算法参数,选择距离最小的k个点(选择最近邻居的数目)
Returns:
    sortedClassCount[0][0] - 分类结果
"""
####为每组数据值分类,函数的功能是使用k-近邻算法将 每组数据划分到某个类中
def classify0(inX,dataSet,labels,K):
    #numpy函数shape[0]返回dataSet的行数
    dataSetSize=dataSet.shape[0]#获取数组的形状信息,0返回行数,1返回列数
    # 在列向量方向上重复inX共1次(横向),行向量方向上重复inX共dataSetSize次(纵向)
    diffMat=tile(inX,(dataSetSize,1))-dataSet#测试集和训练集之前的x,y上的差值,新(x,y)=(x_测-x_训练,y_测-y_训)
    """
    c = np.array([[1, 2], [3, 4]])
        d = np.tile(c, (2, 3))
        print(d)
        # 输出:
        # [[1 2 1 2 1 2]
        #  [3 4 3 4 3 4]
        #  [1 2 1 2 1 2]
        #  [3 4 3 4 3 4]]
    """
    ##计算欧式距离
    sqDiffMat= diffMat ** 2#计算距离的平方
    sqDistances=sqDiffMat.sum(axis=1)#(x_测-x_训练)^2+y_测-y_训)^2
    distances=sqDistances**0.5#开根号
    ##返回distances中元素从小到大排序后的索引值
    sortedDistIndicies=distances.argsort()#argsort,返回数组排序后的索引,先从小到大排序然后再按照各个顺序返回数值没有排序前的索引
    #argsort()返回最小的的数值的索引,之后返回第二小的索引
    """distances=[129.0736224 , 127.28314892, 117.13667231, 10. ,15.13274595,18.24828759])
        sortedDistIndicies=[3, 4, 5, 2, 1, 0]
    """
    classCount={}#创建空字典
    for i in range(K):
        # 取出前k个元素的类别
        voteIlabel=labels[sortedDistIndicies[i]]
        #计算类别次数
        #classCount.get(voteIlabel, 0) 表示获取字典 classCount 中键为 voteIlabel 的值,如果不存在则返回0
        classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
    #对键值进行排序
    #classCount.items() 返回字典 classCount 中所有键值对的视图
    # python3中用items()替换python2中的iteritems()
    # key=operator.itemgetter(1)根据字典的值进行排序
    # key=operator.itemgetter(0)根据字典的键进行排序
    #reverse = True
    #是排序函数的关键字参数,表示按照降序进行排序
    sortedClassCount=sorted(classCount.items(),
                            key=operator.itemgetter(1),reverse=True)
    #return sortedClassCount[0][0]
    return distances,sortedDistIndicies

#KNN.classify0([101,20],group,labels,3)


if __name__ == '__main__':#主程序的入口,判断是否作为独立的脚本运行
    #创建数据集
    group, labels = createDataSet()
    #测试集
    test = [101,20]
    #kNN分类
    test_class = classify0(test, group, labels, 3)
    #打印分类结果
    print(test_class)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值