kNN的理解和代码实现

0 写在前

kNN作为自监督学习算法中分类算法的基础算法之一.是传统机器学习中通过距离和概率的一种判定结果的方法

1 以例讲解

假设有样本空间[x1,x2,x3,x4] x1=[2,0.5],x2=[1.5,0.8],x3=[2,3],x4=[3,2],其对应的标签为y=[1,1,0,0]
首先我们通过图像查看其分布:
x5=[2.6,2.7]
然后有一个预测分类点x6=[1.2,0.9],现在任务是需要判断该点属于哪一类.

2 通过代码实现分类预测

对于数据而言,眼睛其实很好将其预测为1,那么接下来我们要做的是用理论来实现它.这里就不进行归一化了.直接表示实现方法:

  1. 计算该需要预测点与训练样本点之间的欧式距离.
  2. 进行排序,并查找对应的位置,这样方便配对标签
  3. 设置k值,k的目的是为了通过预测频率得到预测分类
    第一步:
    [ s u m ( x 6 − x 1 ) 2 = 0.894427 s u m ( x 6 − x 2 ) 2 = 0.316228 s u m ( x 6 − x 3 ) 2 = 2.24722 s u m ( x 6 − x 4 ) 2 = 2.1095 s u m ( x 6 − x 5 ) 2 = 2.28035 ] \begin{bmatrix} \sqrt{sum(x6-x1)^{2}}=0.894427 \\ \sqrt{sum(x6-x2)^{2}}=0.316228 \\ \sqrt{sum(x6-x3)^{2}} =2.24722\\ \sqrt{sum(x6-x4)^{2}}=2.1095 \\ \sqrt{sum(x6-x5)^{2}}=2.28035 \\ \end{bmatrix} sum(x6x1)2 =0.894427sum(x6x2)2 =0.316228sum(x6x3)2 =2.24722sum(x6x4)2 =2.1095sum(x6x5)2 =2.28035
    第二步:
    [ 0.894427 1 0.316228 0 2.24722 3 2.1095 2 2.28035 4 ] \begin{bmatrix} 0.894427 & 1 \\ 0.316228 & 0 \\ 2.24722&3\\ 2.1095&2 \\2.28035&4 \\ \end{bmatrix} 0.8944270.3162282.247222.10952.2803510324
    第三步:
    如果k=1,那么出现最近的距离为0.316228,而x2的标签为1,标签1出现1次,标签0出现0次,这时预测为1
    如果k=2,那么出现最近的距离为0.316228,0.894427而x2,x1的标签为1,标签1出现2次,标签0出现0次,这时预测为1
    如果k=3,那么出现最近的距离为0.316228,0.894427,2.1095&2而x2,x1的标签为1,x4的标签为0,标签1出现2次,标签0出现1次,这时预测为1
    但是接下来就会出现无法预测的结果,所以k值得选择至关重要.太大,可能使得直接误判.太小由于其频率太绝对,使得预测也可能出错.
    其理论就是这样.接下来就是代码
def classify0(inX, dataSet, labels, k):
    """ inX:预测样本
        dataset:训练样本集
        labels:数据标签
        k:k近邻算法的k值
    """
    dataSetSize = dataSet.shape[0]
    # np.tile作用是产生inX形式的矩阵
    diffMat = np.tile(inX, (dataSetSize,1)) - dataSet
    #数据平方
    sqDiffMat = diffMat**2
    # 计算平方和,矩阵的每一行向量相加
    sqDistances = sqDiffMat.sum(axis=1)
    # 欧式距离公式的体现,开根号
    distances = sqDistances**0.5
    # 找出list中的index,首先排序distances,然后找出对应的位置
    sortedDistIndicies = distances.argsort()    
    # 计算标签对应下的个数
    classCount={}          
    for i in range(k):
        voteIlabel = labels[sortedDistIndicies[i]]
        # 对应标签的计数
        classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
    # 计算 对应标签出现的频率  
    sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)
    return sortedClassCount[0][0]

其项目代码见<机器学习实战>Peter Harrington著

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值