scikit-learn中的机器学习算法封装——kNN

接前面 http://www.javashuo.com/article/p-hxdatpow-he.htmlhtml

  • 回过头来看这张图,什么是机器学习?就是将训练数据集喂给机器学习算法,在上面kNN算法中就是将特征集X_train和Y_train传给机器学习算法,而后拟合(fit)出一个模型,而后输入样例到该模型进行预测(predict)输出结果。算法

  • 而对于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
相关文章
相关标签/搜索