机器学习-kNN(1)
一 kNN算法简介
kNN(K-Nearest Neighbor)工作原理:存在一个样本数据集合,也称为训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类对应的关系。输入没有标签的数据后,将新数据中的每个特征与样本集中数据对应的特征进行比较,提取出样本集中特征最相似数据(最近邻)的分类标签。一般来说,我们只选择样本数据集中前k个最相似的数据,这就是k近邻算法中k的出处,通常k是不大于20的整数。最后选择k个最相似数据中出现次数最多的分类作为新数据的分类。
说明:KNN没有显示的训练过程,它是“懒惰学习”的代表,它在训练阶段只是把数据保存下来,训练时间开销为0,等收到测试样本后进行处理。
优点:
- 解决分类问题
- 天然可以解决多分类问题
- 思想简单,要过强大
缺点:
- 最大的缺点
如果训练集有m个样本,n个特征,则预测每一个新的数据,需要O(m*n)
优化:使用树结构:KD-Tree, Ball-Tree
- 高度数据相关
- 预测的结果不具有可解释性
- 维数灾难
随着维数的增加,看似两个距离非常近的点,距离会越来越大。所以kNN不适合高维度的数据,解决方法:PCA 降维处理
二 一个简单的例子
现有十组肿瘤数据,raw_data_x 分别是肿瘤大小和肿瘤时间,raw_data_y代表的是 良性肿瘤和恶性肿瘤,x代表的是测试数据,并用蓝色区分,我们需要通过kNN算法判断其实良性肿瘤还是恶性肿瘤。通过matplotlib绘制散点图如下:
- import numpy as np
- import matplotlib.pyplot as plt
- 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]]
- raw_data_y = [0,0,0,0,0,1,1,1,1,1]
- x = np.array([8.093607318,3.365731514])
- x_train = np.array(raw_data_x)
- y_train = np.array(raw_data_y)
- plt.scatter(x_train[y_train==0,0],x_train[y_train==0,1],color='g')
- plt.scatter(x_train[y_train==1,0],x_train[y_train==1,1],color='r')
- plt.scatter(x[0],x[1],color='b')
- plt.show()
运行结果:
上图中 绿色为良性肿瘤,红色为恶性肿瘤,蓝色为需要判断的样本。
整体思路为:
1、计算每个样本与蓝点的距离
2、将计算出来的距离进行排序
3、取出前k个样本
4、统计前k个样本中出现频率最多的种类
5、输出判断结果
说明:这里的距离指得是 明可夫斯基距离
根据以上思路,可以编写一下代码:
- import numpy as np
- import matplotlib.pyplot as plt
- 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]]
- raw_data_y = [0,0,0,0,0,1,1,1,1,1]
- x = np.array([8.093607318,3.365731514])
- x_train = np.array(raw_data_x)
- y_train = np.array(raw_data_y)
- plt.scatter(x_train[y_train==0,0],x_train[y_train==0,1],color='g')
- plt.scatter(x_train[y_train==1,0],x_train[y_train==1,1],color='r')
- plt.scatter(x[0],x[1],color='b')
- plt.show()
- # 在原有基础上添加以下代码
- from math import sqrt
- from collections import Counter
- # 计算每个样本到目标的距离
- distances = [sqrt(np.sum((e-x)**2)) for e in x_train]
- #将计算的距离进行排序,并返回对应的索引
- nearest = np.argsort(distances)
- # 取前6个样本
- k = 6
- # 将最近的k个样本取出来,topK_y 中为样本种类
- topK_y = [y_train[i] for i in nearest[:k]]
- # 统计topK_y中的种类和数量
- votes = Counter(topK_y)
- # 获取最多数量的样本
- votes.most_common(1)
- # 获取最多样本的种类
- predict_y = votes.most_common(1)[0][0]
- print("肿瘤类型:",predict_y)
运行结果:
- 肿瘤类型: 1
- 以上就是通过kNN算法进行类型判断的简易过程。
三 使用scikit-learn中的kNN
有了以上的基础,使用scikit-learn中的kNN应该就比较容易了。
- from sklearn.neighbors import KNeighborsClassifier
- import numpy as np
- import matplotlib.pyplot as plt
- 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]]
- 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([8.093607318,3.365731514])
- # 生成一个k为6 kNN的对象
- kNN_classifier = KNeighborsClassifier(n_neighbors=6)
- # 将训练数据写入
- kNN_classifier.fit(x_train,y_train)
- # 预测数据
- y_predict = kNN_classifier.predict(x.reshape(1,-1))
- # 输出预测结果
- print(y_predict )
需要详细描述,查看 官方文档
机器学习-kNN(1)的更多相关文章
- [机器学习] ——KNN K-最邻近算法
KNN分类算法,是理论上比较成熟的方法,也是最简单的机器学习算法之一. 该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别 ...
- 机器学习——kNN(1)基本原理
=================================版权声明================================= 版权声明:原创文章 禁止转载 请通过右侧公告中的“联系邮 ...
- 机器学习--kNN算法识别手写字母
本文主要是用kNN算法对字母图片进行特征提取,分类识别.内容如下: kNN算法及相关Python模块介绍 对字母图片进行特征提取 kNN算法实现 kNN算法分析 一.kNN算法介绍 K近邻(kNN,k ...
- 机器学习-kNN
基于Peter Harrington所著<Machine Learning in Action> kNN,即k-NearestNeighbor算法,是一种最简单的分类算法,拿这个当机器学习 ...
- 机器学习-KNN算法详解与实战
最邻近规则分类(K-Nearest Neighbor)KNN算法 1.综述 1.1 Cover和Hart在1968年提出了最初的邻近算法 1.2 分类(classification)算法 1.3 输入 ...
- 第四十六篇 入门机器学习——kNN - k近邻算法(k-Nearest Neighbors)
No.1. k-近邻算法的特点 No.2. 准备工作,导入类库,准备测试数据 No.3. 构建训练集 No.4. 简单查看一下训练数据集大概是什么样子,借助散点图 No.5. kNN算法的目的是,假如 ...
- 机器学习 KNN算法原理
K近邻(K-nearst neighbors,KNN)是一种基本的机器学习算法,所谓k近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表.比如:判断一个人的人品,只需要观察 ...
- 机器学习-KNN分类器
1. K-近邻(k-Nearest Neighbors,KNN)的原理 通过测量不同特征值之间的距离来衡量相似度的方法进行分类. 2. KNN算法过程 训练样本集:样本集中每个特征值都已经做好类别 ...
- ML02: 机器学习KNN 算法
摘要: 一张图说清楚KNN算法 看下图,清楚了吗? 没清楚的话,也没关系,看完下面几句话,就清楚了. KNN算法是用来分类的. 这个算法是如何来分类的呢? 看下图,你可以想想下图中的 『绿色圆点』 ...
- 机器学习——kNN(2)示例:改进约会网站的配对效果
=================================版权声明================================= 版权声明:原创文章 禁止转载 请通过右侧公告中的“联系邮 ...
随机推荐
- CCF——数列分段201509-1
问题描述 给定一个整数数列,数列中连续相同的最长整数序列算成一段,问数列中共有多少段? 输入格式 输入的第一行包含一个整数n,表示数列中整数的个数. 第二行包含n个整数a1, a2, …, an,表示 ...
- laravel获取当前认证用户登录
可以通过Auth门面访问认证用户: 要在方法上面声明 use Auth: 获取当前认证用户使用 $user = Auth::user(); 获取用户认证ID $id = Auth::id;
- webgl 深度缓冲
传统的画2d画布就是后画的会盖在先画的上面,但是在画一些三维图形时,这很难控制 深度缓冲区的作用就是区分颜色所在的层次,防止把被遮挡住的颜色显示出来. 深度缓冲很强大,用起来很简单 开启深度缓冲(测试 ...
- Android Studio- 把项目提交到SVN中操作方法
第一步 下载SVN,下载完成之后,需要吧command line client tools点击修改安装 然后Crash Reporter点击选择取消安装 如果不进行该操作,则可能在C:\Program ...
- this.$http & vue
this.$http & vue https://github.com/pagekit/vue-resource Alias axios to Vue.prototype.$http http ...
- HDU4747——2013 ACM/ICPC Asia Regional Hangzhou Online
啦啦啦. 这是杭州网赛的一个题目,当时没做出来,当然这个想法确实比较难想到. 题目质量很高,这个题目也很特别,以前都没做过类似的题目.让我又一次体验了线段树的强大力量. 题目的意思是给你n个数a1-a ...
- bzoj3663/4660CrazyRabbit && bzoj4206最大团
题意 给出平面上N个点的坐标,和一个半径为R的圆心在原点的圆.对于两个点,它们之间有连边,当且仅当它们的连线与圆不相交.求此图的最大团. 点数<=2000,坐标的绝对值和半径<=5000. ...
- bzoj2969 矩形粉刷 概率期望
此题在bzoj是权限题,,,所以放另一个oj的链接 题解: 因为期望线性可加,所以可以对每个方格单独考虑贡献.每个方格的贡献就为至少被粉刷过一次的概率×1(每个格子的最大贡献就是1...)每个方格至少 ...
- 制作VR视频播放器
最近VR火的不要不要的,但是综合起来,VR资源最多的还是全景图片和全景视频,今天在这里给大家简单介绍一下如何用Unity制作简单的VR视频播放器. 首先找到EasyMovieTexture这个插件,A ...
- ORACLE获取某个时间段之间的月份列表
返回1-31,或者1-12,或者某个 select rownum from dual connect by rownum<31 就是connect by http://marcospri ...