《机器学习实战》学习——kNN算法代码

机器学习实战学习——kNN算法

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 classify0(inX, dataSet, labels, k):
    #四个输入参数,inX是用于分类的输入向量;输入的训练样本集;标签向量;k值。其中标签向量的元素数目与矩阵dataSet的行数相同
    #array都点运算,matrix才是矩阵运算
    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#记录标签值出现了几次,存在字典里
        """
        classCount.get(voteIlabel,0)返回字典classCount中voteIlabel元素对应的值,若无,则进行初始化,因为开始是空字典,
        #得到的第一个键没有值,所以得到的是默认值0,然后加一将其重新赋给这个键。接着查看第二个出现的标签值,如果跟上一个一样,那么
        get的值就是1,此时再加一变成2;如果不一样,则重新得到一个键,并赋值为1.这样就达到了统计次数的目的
        """
    sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
    """
    sorted(对象,排序值,reverse=True/False),将字典classCount分解为元组列表
    若classCount = {‘A’:1,‘B’:2,‘C’:3},则分为
    [‘A’,’B’,’C’] 与 [1, 2, 3]两组,items=([‘A’,’B’,’C’] ,[1, 2, 3])
    operator.itemgetter(1)作用是读取元组items内的第2列(索引值为1),reverse=True降序排列
    sorted返回值是对象按照要求重新排列之后的相同的类型,只是改了个数据
    """
    return sortedClassCount[0][0]#返回排列之后的元组的第一个元素中的第一个元素

shape()函数的用法

import numpy as np
k = np.matrix([[1, 2, 3, 4],
             [5, 6, 7, 8],
             [9, 10, 11, 12]])
print(np.shape(k))       # 输出(3,4)表示矩阵为3行4列
print(k.shape[0])        # shape[0]输出3,为矩阵的行数
print(k.shape[1])        # 同理shape[1]输出列数

  1. tile函数

tile(inx, (datasetsize, 1)):将矩阵inx纵向复制datasetsize份(成了datasetsize行),再横向复制一份。

#title(对象矩阵,([m,] k )):title函数是个复制函数,作用是将对象矩阵作为一个单元进行横向和纵向复制,形成一个m*k的矩阵。注意的是,当()只有一个数值时,只会横向复制。

2.sum函数

sqdiffmat.sum(axis=1):矩阵sqdiffmat的各行相加

sum(对象,axis=0/1)或者对象.sum(axis=0/1):
axis=0代表对象的所有元素进行相加返回一个结果值;axis=1表示同行的元素相加,每行返回一个值,通常默认的,且不用写出来。

  1. argsort函数

distances.argsort():对distances进行从小到大排序,返回的是每个值在distances中的索引位置。如排序后得到[3,2,0,1],最小的是排序对象的索引号为3的元素。

  1. 关于数组numpy中的array和matrix在《机器学习实战》书中附录处有简单清楚的介绍。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值