class KNN(object):
    #构造函数
    def __init__(self,n_neighbors=5):
        #self.k是属性,属性在类中有点相似于全局变量的作用
        self.k = n_neighbors
    
    #训练函数 knn算法是惰性学习的机器学习方法 
    #所有的惰性学习 他们的训练(算法计算)都是假的 都是在预测的时间开始计算的 predict
    def fit(self,X,y):
        #统一数据类型
        self.X_train = np.array(X)
        self.y_train = np.array(y)
        
    #预测
    def predict(self,X):
        #测试数据
        X_test = np.array(X)
        #测试数据有多少个? 获取测试样本数量
        n_test_sample = X_test.shape[0]
        #每一个测试数据都需要和训练数据之间测算距离
        dist = self.distance(X_test,n_test_sample)
        
        #清楚的知道一件事情,预测的目标值有多少个
        y_pred = np.zeros(shape=n_test_sample,dtype='uint8')
        
        #排序,找到离自己最近的k个数
        for i in np.arange(n_test_sample):
            #获取最近k个数的目标值
            cls_y = self.y_train[np.argsort(dist[i])[:self.k]]
            #计算类别
            y_pred[i] = np.argmax(np.bincount(cls_y))
        return y_pred
    
    
    #计算距离 OOP思想 一个方法只做一件事
    def distance(self,X_test,n_test_sample):
        #训练数据样本有多少个
        n_train_sample = self.X_train.shape[0]
        
        #计算的距离是一个数组,那么这个数组的形状事什么样的
        dist = np.zeros(shape=(n_test_sample,n_train_sample))
        
        for i in np.arange(n_test_sample):
            dist[i] += np.sqrt(np.sum(np.square(np.subtract(self.X_train,X_test[i])),axis=1))
        return dist
    
    #封装模型的准确率
    def score(self,X,y):
        y_pred = self.predict(X)
        return np.mean(y_pred==y)

案例

knn_ = KNN()
knn_.fit(X_train,y_train)
knn_.score(X_train,y_train),knn_.score(X_test,y_test)

np.argmax(np.bincount(y_train[[5,3,1,7,10]]))