1. 程式人生 > >機器學習---scikit-learn中KNN演算法的封裝

機器學習---scikit-learn中KNN演算法的封裝

1,工具準備,python環境,pycharm

2,在機器學習中,KNN是不需要訓練過程的演算法,也就是說,輸入樣例可以直接呼叫predict預測結果,訓練資料集就是模型。當然這裡必須將訓練資料和訓練標籤進行擬合才能形成模型。

3

3,在pycharm中建立新的專案工程,並在專案下新建KNN.py檔案。

import numpy as np
from math import sqrt
from collections import Counter

class KNNClassifier:
    def __init__(self,k):
        """初始化KNN分類器"""
        assert  k >= 1
        """斷言判斷k的值是否合法"""
        self.k = k
        self._X_train = None
        self._y_train = None

    def fit(self,X_train,y_train):
        """根據訓練資料集X_train和Y_train訓練KNN分類器,形成模型"""
        assert X_train.shape[0] == y_train.shape[0]
        """資料和標籤的大小必須一樣
        assert self.k <= X_train.shape[0]
        """k的值不能超過資料的大小"""
        self._X_train = X_train
        self._y_train = y_train
        return self

    def predict(self,X_predict):
        """必須將訓練資料集和標籤擬合為模型才能進行預測的過程"""
        assert self._X_train is not None and self._y_train is not None
        """訓練資料和標籤不可以是空的"""
        assert X_predict.shape[1]== self._X_train.shape[1]
        """待預測資料和訓練資料的列(特徵個數)必須相同"""
        y_predict = [self._predict(x) for x in X_predict]
        return np.array(y_predict)

    def _predict(self,x):
        """給定單個待測資料x,返回x的預測資料結果"""
        assert x.shape[0] == self._X_train.shape[1]
        """x表示一行資料,即一個數組,那麼它的特徵資料個數,必須和訓練資料相同
        distances = [sqrt(np.sum((x_train - x)**2))for x_train in self._X_train]
        nearest = np.argsort(distances)
        topk_y = [self._y_train[i] for i in nearest[:self.k]]
        votes = Counter(topk_y)
        return votes.most_common(1)[0][0]

4,新建test.py檔案,引入KNNClassifier物件。

from KNN.py import KNNClassifier
raw_data_x = [[3.393,2.331],
              [3.110,1.781],
              [1.343,3.368],
              [3.582,4.679],
              [2.280,2.866],
              [7.423,4.696],
              [5.745,3.533],
              [9.172,2.511],
              [7.792,3.424],
              [7.939,0.791]]
raw_data_y = [0,0,0,0,0,1,1,1,1,1]
X_train = np.array(raw_data_x)
y_train = np.array(raw_data_y)
x = np.array([9.880,3.555])

# 要將x這個矩陣轉換成2維的矩陣,一行兩列的矩陣
X_predict = x.reshape(1,-1)

"""1,建立一個物件,設定K的值為6"""
knn_clf = KNNClassifier(6)

"""2,將訓練資料和訓練標籤融合"""
knn_clf.fit(X_train,y_train)

"""3,經過2才能跳到這裡,傳入待預測的資料"""
y_predict = knn_clf.predict(X_predict)
print(y_predict)