KNN分类 -- 手写版逻辑介绍

KNN,K个NearestNeighbors,K个最近的邻居。KNN分类,想知道你属于哪一类,就看你最好的几个朋友是属于哪一类,那你也就八九不离十啦。

问题解决思路:

step01、找出你的K个最好朋友

step02、统计这K个好朋友大部分都属于哪一类;

step03、这大部分朋友所属的分类也就是你的分类。

如何定义好朋友呢?便是最近距离者,距离计算有欧氏距离、余弦相似度等。

理解上面3点,就可以去完成一个手动版KNN分类算法。


#加载numpy,为计算使用
import numpy as np

#加载数据
from sklearn.datasets import load_iris
# from sklearn.neighbors import KNeighborsClassifier

#切分数据
from sklearn.model_selection import train_test_split
X,y = load_iris(return_X_y = True) #只加载数据
X_train,X_test,y_train,y_test= train_test_split(X,y,test_size = 0.2)


# 开始写定义模型

class KNeighborsClassifier(object):
    """
    分类器
    """
    def __init__(self,n_neighbors = 5):
        """
        初始化模型,定义超差数
        """
        self.n_neighbors = n_neighbors

    def fit(self, X, y):
        """
        训练
        """
        self.X = np.array(X) #把训练数据转为np 数组,方便距离计算
        self.y = np.array(y) 
        
    def predict(self,X):
        """
        预测
        """
        X= np.array(X)
        if X.ndim != 2:
            raise Exception("需要二维数组")
            
        result = [] #把所有的预测结果放在一个列表中
        for x in X:
            dist = np.sqrt(((self.X - x)**2).sum(axis =1)) #用测试集一一去跟训练集计算距离
            args = np.argsort(a=dist)[:self.n_neighbors] #取出k(self.n_neighbors)个最近记录者
            labels = self.y[args] #取出相近好朋友(训练集)的分类(标签)
            result.append(max(set(labels),key=labels.tolist().count)) #求出好朋友所属分类最多那个             return np.array(result)  


# 构建模型
knn = KNeighborsClassifier()

#训练模型
knn.fit(X = X_train,y=y_train)

#模型预测
y_pred = knn.predict(X=X_test)

#计算准确率
print(y_pred,y_test)

acc = (y_pred== y_test).mean()

print(acc)


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值