KNN算法python实现

内容参考了某_统计学习方法_。

KNN算法的主要实现步骤:

  1. 计算测试数据与各训练数据之间的距离。
  2. 按照距离的大小进行排序。
  3. 选择其中距离最小的k个样本点。
  4. 确定K个样本点所在类别的出现频率。
  5. 返回K个样本点中出现频率最高的类别作为最终的预测分类。

此次实现的方式是对数据进行一个测试,并且这个knn就是单纯的近邻,没有对距离采取加权处理,并且没有使用kd树,代码如下

'''
采用线性的方式实现KNN算法
'''

import  numpy as np
from collections import  Counter

class KNN:
    def __init__(self,x_train,y_train,k):
        self.k = k
        self.x_train = x_train
        self.y_train =y_train
        self.p = 0

    def predict(self,point):
        distance = [
            (np.linalg.norm(point-self.x_train[i]) , self.y_train[i])
            for  i in  range(self.x_train.shape[0])
        ]
        distance.sort(key= lambda  x: x[0])
        distance = distance[:self.k]
        mat ={}
        for i,elm in enumerate(distance):
            if elm[1] in mat:
                mat[elm[1]]+= 1
            else:
                mat[elm[1]] =1
        mated = sorted(mat.items(), key=lambda x:x[1], reverse=True)
        self.p = mated[0][1]/self.k
        return mated[0][0]



def main():
    x_train = np.array([
        [5, 4],
        [9, 6],
        [4, 7],
        [2, 3],
        [8, 1],
        [7, 2],
        [5,2],
        [5,4]
    ])
    y_train = np.array([1,1,1,-1,-1,-1,-2,-2])
    X_new = np.array([5,4])
    for k in range(1,10,2):
        clf = KNN(x_train,y_train,k=k)
        yp = clf.predict(X_new)
        print('k',k,'predictY',yp,'p',clf.p)


if __name__ == '__main__':
    main()

在这个测试中,故意添加了一些噪声,来看一看噪声对KNN的影响,因此还是建议对距离进行加权。

常见的加权是倒数和高斯加权,本文不在叙述。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值