ML基础-k近邻算法-1

概述

k近邻算法采用测量不同特征值之间的距离方法进行分类。

特点

  • 优点:精度高、对异常值不敏感、无数据输入假定。
  • 缺点:计算复杂度高、空间复杂度高。 适用数据范围:数值型和标称型。

原理:

Python程序解析

准备工作

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
group, labels = createDataSet()
print(group)
print(labels)

算法内容

#
# 用于分类的输入向量是inX,
# 输入的训练样本集为dataSet,
# 标签向量为labels ,
# 最后的参数k 表示用于选择最近邻居的数目,
# 其中标签向量的元素数目和矩阵dataSet 的行数相同。
#
def classify0(inX, dataSet, labels, k):
    dataSetSize = dataSet.shape[0]  # 求数组的长度
    # ❶(以下三行)距离计算
    # 第二个参数的意思就是把inX补成有datasetsize行数的矩阵,
    diffMat = tile(inX, (dataSetSize, 1)) - dataSet  
    print("====================================")
    print(diffMat)
    sqDiffMat = diffMat **2 #diffMat相乘
    print("====================================")
    print(sqDiffMat)
    sqDistances = sqDiffMat.sum(axis=1)  # axis=1按照列求和,0是按照行求和
    distances = sqDistances ** 0.5 # 开方,结果为[1.48660687 1.41421356 0.0 0.1 ]
    print("====================================")
    print(distances)
    sortedDistIndicies = distances.argsort()  # argsort把想向量中的每个元素进行排序  [2 3 1 0]
    print("====================================")
    print(sortedDistIndicies)
    classCount = {}
    # ❷ (以下两行)选择距离最小的k个点
    #循环执行的过程,大概是分别对照,然后给AB计数
    #dict_items([('B', 1)])
    #dict_items([('B', 2)])
    #dict_items([('B', 2), ('A', 1)])
    #
    for i in range(k):
        # sortedDistIndicies=[2 3 1 0],sortedDistIndicies[i]取出的是第几个,labels取出的是对应的AB值
        voteIlabel = labels[sortedDistIndicies[i]]
        # classCount.get可以理解赋值默认值0,然后得到一个就加一,累加
        classCount[voteIlabel]= classCount.get(voteIlabel, 0) + 1
    # 根据元素的第二个排序,返回的结果[('B', 2), ('A', 1)]
    sortedClassCount = sorted(classCount.items(),
        key=operator.itemgetter(1), reverse=True)

    return sortedClassCount[0][0]#返回B

print(classify0([0,0], group, labels, 3))

pynum函数记录:

  • shape shape属性:属性记录的是数组每一维的长度,a.shap得到的应该是一个tuple。
  • numpy.tile(A,B)函数:将数组[1,2],在列重复3次,行重复2次
# 函数形式: tile(A,rep)
# 功能:重复A的各个维度
# 参数类型:
# - A: Array类的都可以
# - rep:A沿着各个维度重复的次数
print(numpy.tile([1,2],(3,2)))
#结果如下
[[1 2 1 2]
 [1 2 1 2]
 [1 2 1 2]]
  • sum(axis=1)
group = array([[1, 2], [4, 5]])
print(group)
print(group.sum(axis=1))
#  [[1 2]
#  [4 5]]
# 0将数组的列相加[5 7],
# 1将数组的行相加[3 9]

print("====================================")
group = array([[1, 2], [3, 4], [5, 6]])
print(group)
print(group.sum(axis=0))
#  [[1 2 ]
#  [3 4 ]
#  [5 6]]
# 0将数组的列相加[912],
# 1将数组的行相加[3711]
#iterable:是可迭代类型;
#cmp:用于比较的函数,比较什么由key决定,有默认值,迭代集合中的一项;
#key:用列表元素的某个属性和函数进行作为关键字,有默认值,迭代集合中的一项;
#reverse:排序规则. reverse = True 或者 reverse = False,有默认值。
#返回值:是一个经过排序的可迭代类型,与iterable一样

数学知识记录

  • 向量:
    这里写图片描述

  • 矩阵相乘
    百度吧。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值