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

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

问题解决思路:

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

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

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

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

KNN分类 -- 手写版逻辑介绍_第1张图片

理解上面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)


 

你可能感兴趣的:(学习记录,人工智能,分类,数据挖掘,人工智能)