• k近邻(k-Nearest Neihbor , kNN)学习就是一种常用的监督学习方法。它的工作机制:给定测试样本,基于距离度量找出训练集中与测试样本最靠近的k个训练样本,然后基于这k个邻居的信息来进行预测。

K近邻算法通过在整个训练集中搜索 K个最相似的实例(欧氏距离最近的k个),并为所有这些K个实例分配一个公共输出变量,来对预测对象进行分类。属于有监督学习,是一种基于实例的学习,是局部近似和将所有计算推迟到分类之后的惰性学习。用最近的邻居(k)来预测未知数据点。

k 值是预测精度的一个关键因素,无论是分类还是回归,衡量邻居的权重都非常有用,较近邻居的权重比较远邻居的权重大。

python代码实现为:

# coding:utf-8
from numpy import *
import operator


def creataDataSet():
    '''
    labels中   A代表爱情片  B代表动作片
    :return:
    '''
    #坐标代表在二维中的点,x坐标表示动作元素,y坐标表示吻戏元素
    group = array([[1, 101], [5, 89], [108, 5], [115, 8]])
    #labels表示上面四个坐标分别属于哪一类,
    labels = ['爱情片', '爱情片', '动作片', '动作片']
    return group, labels


# k-近邻算法
def knn(inX, dataSet, labels, k):
    # shape读取数据矩阵第一维度的长度
    dataSetSize = dataSet.shape[0]
    # tile重复数组inX,有dataSet行 1个dataSet列,减法计算差值
    diffMat = tile(inX, (dataSetSize, 1)) - dataSet
    # **是幂运算的意思,这里用的欧式距离
    sqDiffMat = diffMat ** 2
    # 普通sum默认参数为axis=0为普通相加,axis=1为一行的行向量相加
    sqDistances = sqDiffMat.sum(axis=1)
    distances = sqDistances ** 0.5
    # argsort返回数值从小到大的索引值(数组索引0,1,2,3)
    sortedDistIndicies = distances.argsort()
    # 选择距离最小的k个点
    classCount = {}
    for i in range(k):
        # 根据排序结果的索引值返回靠近的前k个标签
        voteLabel = labels[sortedDistIndicies[i]]
        # 各个标签出现频率
        classCount[voteLabel] = classCount.get(voteLabel, 0) + 1

    # reverse默认升序 key关键字排序itemgetter(1)按照第一维度排序(0,1,2,3)
    sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)
    return sortedClassCount[0][0]   #这里面存储的就是离目标点最近的类别名


if __name__ == '__main__':
    group, labels = creataDataSet()
    knn = knn([100, 20], group, labels, 3)	#k=3
    print("[100,20]属于",knn)

训练集所表示意思在代码中注释出了,最终输入一个二维测试点,代码输出它所属的类别:
[100,20]属于 动作片

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐