接前面 http://www.javashuo.com/article/p-hxdatpow-he.htmlhtml
算法
而對於kNN來講,算法的模型其實就是自身的訓練數據集,因此能夠說kNN是一個不須要訓練過程的算法。機器學習
k近鄰算法是很是特殊的,能夠被認爲是沒有模型的算法學習
spa
使用scikit-learn中的kNN實現rest
#先導入咱們須要的包 from sklearn.neighbors import KNeighborsClassifier #特徵點的集合 raw_data_X = [[3.393533211, 2.331273381], [3.110073483, 1.781539638], [1.343808831, 3.368360954], [3.582294042, 4.679179110], [2.280362439, 2.866990263], [7.423436942, 4.696522875], [5.745051997, 3.533989803], [9.172168622, 2.511101045], [7.792783481, 3.424088941], [7.939820817, 0.791637231] ] #0就表明良性腫瘤,1就表明惡性腫瘤 raw_data_y = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1] #咱們使用raw_data_X和raw_data_y做爲咱們的訓練集 X_train = np.array(raw_data_X) #訓練數據集的特徵 Y_train = np.array(raw_data_y) #訓練數據集的結果(標籤) #首先咱們須要對包中的KNeighborsClassifier進行實例化,其中能夠傳入k的值做爲參數 kNN_classifier = KNeighborsClassifier(n_neighbors=6) #而後先執行fit方法進行擬合操做得出模型,將訓練數據集做爲參數傳入 kNN_classifier.fit(X_train,Y_train) #執行predict預測操做,傳入樣本數據 #由於使用scikit-learn中的kNN算法是對一組矩陣形式的數據進行一條條的預測,因此咱們傳入的樣本數據集參數也應該先轉換爲矩陣的形式 X_predict = x.reshape(1,-1) #由於咱們已知咱們傳入的數據只有一行 y_predict = kNN_classifier.predict(X_predict) In[1]: y_predict Out[1]: array([1]) #因此此時的y_predict即爲咱們所須要的樣本的預測結果 In[2]: y_predict[0] Out[2]: 1
基於scikit-learn的fit-predict模式,進行重寫咱們的Python實現,進行簡單的自定義fit和predict方法實現kNNcode
import numpy as np from math import sqrt from collections import Counter class KNNClassifier: def __init__(self, k): '''初始化KNN分類器''' #使用斷言進行斷定傳入的參數的合法性 assert k >= 1, "k must be valid" self.k = k; #此處定義爲私有變量,外部成員不可訪問進行操做 self._X_train = None self._Y_train = None def fit(seld, X_train, Y_train): '''根據訓練集X_train和Y_train訓練kNN分類器''' assert X_train.shape[0] == Y_train.shape[0],\ "the size of X_train must be equal to the size of Y_train" assert self.k <= X_train.shape[0],\ "the size of X_train must be at least k" self._X_train = X_train self._Y_train = Y_train return self #X_predict 爲傳入的矩陣形式數據 def predict(self, X_predict): '''給定待預測數據集X_train,返回表示X_predict的結果向量''' assert self._X_train is not None and self._Y_train is not None,\ "must fit before predict!" assert X_predict.shape[1] == self._X_train.shape[1],\ "the feature number of X_predict must equal to X_train" #使用私有方法_predict(x)進行對x進行預測 #循環遍歷X_predict,對其中每一條樣本數據集執行私有方法_predict(x),將預測結果存入y_predict中 y_predict = [self._predict(x) for x in X_predict] return np.array(y_predict) def _predict(self, x): '''給定單個待預測數據x,返回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] #重寫對象的「自我描述」 def __repr__(self): return "KNN(k=%d)" % self.k