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

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

  • 回过头来看这张图,什么是机器学习?就是将训练数据集喂给机器学习算法,在上面kNN算法中就是将特征集X_train和Y_train传给机器学习算法,然后拟合(fit)出一个模型,然后输入样例到该模型进行预测(predict)输出结果。
  • 而对于kNN来说,算法的模型其实就是自身的训练数据集,所以可以说kNN是一个不需要训练过程的算法。
  • k近邻算法是非常特殊的,可以被认为是没有模型的算法
  • 为了和其他算法统一,可以认为训练数据集就是模型本身

使用scikit-learn中的kNN实现

#先导入我们需要的包
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方法实现kNN

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

原文地址:https://www.cnblogs.com/Liuyt-61/p/11748720.html

时间: 2025-01-17 09:38:56

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

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

不同于其它的机器学习模型,EM算法是一种非监督的学习算法,它的输入数据事先不需要进行标注.相反,该算法从给定的样本集中,能计算出高斯混和参数的最大似然估计.也能得到每个样本对应的标注值,类似于kmeans聚类(输入样本数据,输出样本数据的标注).实际上,高斯混和模型GMM和kmeans都是EM算法的应用. 在opencv3.0中,EM算法的函数是trainEM,函数原型为: bool trainEM(InputArray samples, OutputArray logLikelihoods=n

机器学习算法之:KNN

基于实例的学习方法中,最近邻法和局部加权回归法用于逼近实值或离散目标函数,基于案例的推理已经被应用到很多任务中,比如,在咨询台上存储和复用过去的经验:根据以前的法律案件进行推理:通过复用以前求解的问题的相关部分来解决复杂的调度问题.      基于实例方法的一个不足是,分类新实例的开销可能很大.这是因为几乎所有的计算都发生在分类时,而不是在第一次遇到训练样例时.所以,如何有效地索引训练样例,以减少查询时所需计算是一个重要的实践问题.此类方法的第二个不足是(尤其对于最近邻法),当从存储器中检索相似

机器学习算法之 KNN(k最近算法)

KNN算法 存在一个训练样本集合,里面有n个训练数据,每个训练数据有m个特征.每个训练数据都标明了相对应的分类.比如: 其中一条数据有四个特征:体重,翼展等,也有相对应的种属. 则KNN算法就是将一条未知种属的数据的每个特征与训练样本集合中的每条数据对应的特征进行比较,然后算法提取样本集合特征最相似数据(最近邻)的分类标签.一般选择样本数据集合中前K个最相似的数据,这就是K-近邻算法中k的出处. 最后选择k个最相似数据中出现次数最多的分类,作为新数据的分类. (可以大概理解为将一条数据与样本中每

机器学习算法&#183;KNN

机器学习算法应用·KNN算法 一.问题描述 验证码目前在互联网上非常常见,从学校的教务系统到12306购票系统,充当着防火墙的功能.但是随着OCR技术的发展,验证码暴露出的安全问题越来越严峻.目前对验证码的识别已经有了许多方法,例如CNN,可以直接输入图片进行识别.验证码分为许多种类,本文以传统的字符验证码作为研究对象,进行图片分割成单一图片作为训练集,构架以测KNN,决策树或者朴素贝叶斯这三个算法为核心的验证码识别算法,进一步体会三个算法的特点. 二.数据准备 2.1数据说明 对于比较简单的字

机器学习算法原理解析——分类

1. KNN分类算法原理及应用 1.1 KNN概述 K最近邻(k-Nearest Neighbor,KNN)分类算法是最简单的机器学习算法. KNN算法的指导思想是“近朱者赤,近墨者黑”,由你的邻居来推断你的类型. 本质上,KNN算法就是用距离来衡量样本之间的相似度. 1.2 算法图示 从训练集中找到和新数据最接近的k条记录,然后根据多数类来决定新数据类别 算法涉及3个主要因素 1) 训练数据集 2) 距离或相似度的计算衡量 3) k的大小 算法描述 1) 已知两类“先验”数据,分别是蓝方块和红

转:机器学习算法原理解析 - 分类

转:http://www.cnblogs.com/swordfall/p/9517988.html 常见分类模型与算法 距离判别法,即最近邻算法KNN: 贝叶斯分类器: 线性判别法,即逻辑回归算法: 决策树: 支持向量机: 神经网络: 1. KNN分类算法原理及应用 1.1 KNN概述 K最近邻(k-Nearest Neighbor,KNN)分类算法是最简单的机器学习算法. KNN算法的指导思想是"近朱者赤,近墨者黑",由你的邻居来推断你的类型. 本质上,KNN算法就是用距离来衡量样本

简单易学的机器学习算法——基于密度的聚类算法DBSCAN

一.基于密度的聚类算法的概述 最近在Science上的一篇基于密度的聚类算法<Clustering by fast search and find of density peaks>引起了大家的关注(在我的博文"论文中的机器学习算法--基于密度峰值的聚类算法"中也进行了中文的描述).于是我就想了解下基于密度的聚类算法,熟悉下基于密度的聚类算法与基于距离的聚类算法,如K-Means算法之间的区别. 基于密度的聚类算法主要的目标是寻找被低密度区域分离的高密度区域.与基于距离的聚

机器学习算法---KNN

KNN最邻近规则,主要应用领域是对未知事物的识别,即判断未知事物属于哪一类,判断思想是,基于欧几里得定理,判断未知事物的特征和哪一类已知事物的的特征最接近: K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一.该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别.KNN算法中,所选择的邻居都是已经正确分类的对象.该方法在定类决策上只依据最邻近的一个或

【机器学习算法实现】kNN算法__手写识别——基于Python和NumPy函数库

[机器学习算法实现]系列文章将记录个人阅读机器学习论文.书籍过程中所碰到的算法,每篇文章描述一个具体的算法.算法的编程实现.算法的具体应用实例.争取每个算法都用多种语言编程实现.所有代码共享至github:https://github.com/wepe/MachineLearning-Demo     欢迎交流指正! (1)kNN算法_手写识别实例--基于Python和NumPy函数库 1.kNN算法简介 kNN算法,即K最近邻(k-NearestNeighbor)分类算法,是最简单的机器学习算