接前面 https://www.cnblogs.com/Liuyt-61/p/11738399.html

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

  • 而对于kNN来说,算法的模型其实就是自身的训练数据集,所以可以说kNN是一个不需要训练过程的算法。

  • k近邻算法是非常特殊的,可以被认为是没有模型的算法

  • 为了和其他算法统一,可以认为训练数据集就是模型本身

使用scikit-learn中的kNN实现

  1. #先导入我们需要的包
  2. from sklearn.neighbors import KNeighborsClassifier
  3.  
  4. #特征点的集合
  5. raw_data_X = [[3.393533211, 2.331273381],
  6. [3.110073483, 1.781539638],
  7. [1.343808831, 3.368360954],
  8. [3.582294042, 4.679179110],
  9. [2.280362439, 2.866990263],
  10. [7.423436942, 4.696522875],
  11. [5.745051997, 3.533989803],
  12. [9.172168622, 2.511101045],
  13. [7.792783481, 3.424088941],
  14. [7.939820817, 0.791637231]
  15. ]
  16. #0就代表良性肿瘤,1就代表恶性肿瘤
  17. raw_data_y = [, , , , , , , , , ]
  18. #我们使用raw_data_X和raw_data_y作为我们的训练集
  19. X_train = np.array(raw_data_X) #训练数据集的特征
  20. Y_train = np.array(raw_data_y) #训练数据集的结果(标签)
  21.  
  22. #首先我们需要对包中的KNeighborsClassifier进行实例化,其中可以传入k的值作为参数
  23. kNN_classifier = KNeighborsClassifier(n_neighbors=)
  24. #然后先执行fit方法进行拟合操作得出模型,将训练数据集作为参数传入
  25. kNN_classifier.fit(X_train,Y_train)
  26. #执行predict预测操作,传入样本数据
  27. #因为使用scikit-learn中的kNN算法是对一组矩阵形式的数据进行一条条的预测,所以我们传入的样本数据集参数也应该先转换为矩阵的形式
  28. X_predict = x.reshape(,-) #因为我们已知我们传入的数据只有一行
  29. y_predict = kNN_classifier.predict(X_predict)
  30. In[]: y_predict
  31. Out[]: array([])
  32. #所以此时的y_predict即为我们所需要的样本的预测结果
  33. In[]: y_predict[]
  34. Out[]:

基于scikit-learn的fit-predict模式,进行重写我们的Python实现,进行简单的自定义fit和predict方法实现kNN

  1. import numpy as np
  2. from math import sqrt
  3. from collections import Counter
  4.  
  5. class KNNClassifier:
  6.  
  7. def __init__(self, k):
  8. '''初始化KNN分类器'''
  9. #使用断言进行判定传入的参数的合法性
  10. assert k >= , "k must be valid"
  11. self.k = k;
  12. #此处定义为私有变量,外部成员不可访问进行操作
  13. self._X_train = None
  14. self._Y_train = None
  15.  
  16. def fit(seld, X_train, Y_train):
  17. '''根据训练集X_train和Y_train训练kNN分类器'''
  18. assert X_train.shape[] == Y_train.shape[],\
  19. "the size of X_train must be equal to the size of Y_train"
  20. assert self.k <= X_train.shape[],\
  21. "the size of X_train must be at least k"
  22.  
  23. self._X_train = X_train
  24. self._Y_train = Y_train
  25. return self
  26.  
  27. #X_predict 为传入的矩阵形式数据
  28. def predict(self, X_predict):
  29. '''给定待预测数据集X_train,返回表示X_predict的结果向量'''
  30. assert self._X_train is not None and self._Y_train is not None,\
  31. "must fit before predict!"
  32. assert X_predict.shape[] == self._X_train.shape[],\
  33. "the feature number of X_predict must equal to X_train"
  34.  
  35. #使用私有方法_predict(x)进行对x进行预测
  36. #循环遍历X_predict,对其中每一条样本数据集执行私有方法_predict(x),将预测结果存入y_predict中
  37. y_predict = [self._predict(x) for x in X_predict]
  38. return np.array(y_predict)
  39.  
  40. def _predict(self, x):
  41. '''给定单个待预测数据x,返回x的预测结果值'''
  42. '''此处的代码逻辑和重写之前的代码逻辑一样'''
  43. distances = [sqrt(np.sum(x_train - x) ** ) for x_train in self._X_train]
  44. nearest = np.argsort(distances)
  45.  
  46. topk_y = [self._Y_train[i] for i in nearest[:self.k]]
  47. votes = Counter(topk_y)
  48. return votes.most_common()[][]
  49.  
  50. #重写对象的“自我描述”
  51. def __repr__(self):
  52. return "KNN(k=%d)" % self.k

scikit-learn中的机器学习算法封装——kNN的更多相关文章

  1. 在opencv3中的机器学习算法

    在opencv3.0中,提供了一个ml.cpp的文件,这里面全是机器学习的算法,共提供了这么几种: 1.正态贝叶斯:normal Bayessian classifier    我已在另外一篇博文中介 ...

  2. 在opencv3中实现机器学习算法之:利用最近邻算法(knn)实现手写数字分类

    手写数字digits分类,这可是深度学习算法的入门练习.而且还有专门的手写数字MINIST库.opencv提供了一张手写数字图片给我们,先来看看 这是一张密密麻麻的手写数字图:图片大小为1000*20 ...

  3. opencv3中的机器学习算法之:EM算法

    不同于其它的机器学习模型,EM算法是一种非监督的学习算法,它的输入数据事先不需要进行标注.相反,该算法从给定的样本集中,能计算出高斯混和参数的最大似然估计.也能得到每个样本对应的标注值,类似于kmea ...

  4. 机器学习算法之——KNN、Kmeans

    一.Kmeans算法 kmeans算法又名k均值算法.其算法思想大致为:先从样本集中随机选取 kk 个样本作为簇中心,并计算所有样本与这 kk 个“簇中心”的距离,对于每一个样本,将其划分到与其距离最 ...

  5. 在opencv3中的机器学习算法练习:对OCR进行分类

    OCR (Optical Character Recognition,光学字符识别),我们这个练习就是对OCR英文字母进行识别.得到一张OCR图片后,提取出字符相关的ROI图像,并且大小归一化,整个图 ...

  6. 机器学习算法之:KNN

    基于实例的学习方法中,最近邻法和局部加权回归法用于逼近实值或离散目标函数,基于案例的推理已经被应用到很多任务中,比如,在咨询台上存储和复用过去的经验:根据以前的法律案件进行推理:通过复用以前求解的问题 ...

  7. (原创)(四)机器学习笔记之Scikit Learn的Logistic回归初探

    目录 5.3 使用LogisticRegressionCV进行正则化的 Logistic Regression 参数调优 一.Scikit Learn中有关logistics回归函数的介绍 1. 交叉 ...

  8. 机器学习算法·KNN

    机器学习算法应用·KNN算法 一.问题描述 验证码目前在互联网上非常常见,从学校的教务系统到12306购票系统,充当着防火墙的功能.但是随着OCR技术的发展,验证码暴露出的安全问题越来越严峻.目前对验 ...

  9. (原创)(三)机器学习笔记之Scikit Learn的线性回归模型初探

    一.Scikit Learn中使用estimator三部曲 1. 构造estimator 2. 训练模型:fit 3. 利用模型进行预测:predict 二.模型评价 模型训练好后,度量模型拟合效果的 ...

随机推荐

  1. Connection reset by peer引发的思考

    http://www.mamicode.com/info-detail-506381.html

  2. [转]jkeyll的安装步骤

    链接地址:https://nxjniexiao.github.io/2018/08/17/jkeyll-install/

  3. 【JS新手教程】LODOP打印复选框选中的内容

    在html中,复选框是常见的使用之一,本文介绍如何获取选中的复选框的值,并用LODOP打印.给需要为一组的复选框,复选框的checkbox设置相同的name属性,设置不同的id,然后设置需要的valu ...

  4. LODOP关联后眉脚条码的遮挡的一种情况

    前面的博文中,有介绍层级关系,最先输出的打印项在下层,后输出的在上层,但是最近发现了一种例外,就是前面有关联的情况下,后面把一个条码设置为页眉页脚项,眉脚项和前面关联其他的项的那个项位置重合,虽然这个 ...

  5. box-sizing:border-box 将元素的内边距和边框都设定在宽高内计算

    http://www.w3school.com.cn/cssref/pr_box-sizing.asp box-sizing: content-box|border-box|inherit; 值 描述 ...

  6. console.log()和alert()的区别

    一直都是知道console.log()和alert()是有区别的,但是具体有什么区别就不清楚了,后来在权威指南里注意到了说alert()具有侵入性才来查一查两者的具体区别. 查询到的区别: alert ...

  7. 用Python打开文件夹

    用Python读取文件夹, 然后打开文件 下面读取到文件的每一个内容, 然后加上路径 import os path = r'../Downloads/text/content' for filenam ...

  8. istio网格可视化kiali部署

    前提: 已经安装了kubernetes 已经熟悉如何安装istio 熟悉kubernetes 和 istio 基本使用 注意文章红色加粗字体能上网 tip kubernetes 安装:centos7 ...

  9. java当中JDBC当中的transaction例子

    [学习笔记] 7.jdbc的transaction例子: import java.sql.*; public class MySQlTransaction1 { public static void ...

  10. Word 文档内超级链接跳转到书签

    1. 前言 在Word文档内如何实现一些跳转的超链接呢?Word中,一些外部链接,我们通常叫作超链接,内部链接我们可以叫书签.如何在文档中如何使用书签,跳转到指定位置? 这里我在网上随便找了一份模拟试 ...