KNN 手动实现

KNN 算法

KNN 的实质是根据 预测值 与训练集之间的距离来进行分类。

下面代码使用 欧氏距离来表示点集之间的距离,具体代码如下:

class Knn():
    
    def fit(self, X, y):
        self.X_train = X
        self.y_train = y
        
    def predict(self, X, k):
        
        X_train = self.X_train
        y_train = self.y_train
        
        X = np.tile(X,(X_train.shape[0],1))
        
        diff = (X_train - X) ** 2
        
        diff.sum(axis = 1) ** 0.5  # sum 函数只能是 h.sum(axis = 1)
        
        rank = diff_sum.argsort()  # 返回的排序是从小到大排序的
        
        result = {}
        for i in range(k):
            vote = y_train[rank[i]]
            result[vote] = result.get(vote,0) + 1
            
        # 取出最大的值
        # 这里没用排序,而是用了遍历,节省了时间和空间复杂度
        max_c = 0                        
        num = -1
        
        for k, v in result:
            if (v > max_c):
                max_c = v
                num = k
        return num

这里用到一个numpy 的内置函数来返回排序之后的index:

np.argsort()

这个函数的返回值是从小到大排序之后的 index,如果想要返回从大到小的 index,应该进行如下操作:

a = np.random.randint(0,100,3)
a.argsort() # 从小到大
(-a).argsort() # 从大到小

a.sum(axis = 1) 表示横着求和

引包形式:

from sklearn.neighbors import KNeighborsClassifier  # 从 sklearn 里面引包

knn = KNeighborsClassifier(n_neighbors = k)         # 创建一个model
knn.fit(X_train, y_train)
y_pred = knn.predict(X_test)

你可能感兴趣的:(ML算法代码)