机器学习——kNN(1)基本原理
=================================版权声明=================================
版权声明:原创文章 禁止转载
请通过右侧公告中的“联系邮箱(wlsandwho@foxmail.com)”联系我
勿用于学术性引用。
勿用于商业出版、商业印刷、商业引用以及其他商业用途。
本文不定期修正完善。
本文链接:http://www.cnblogs.com/wlsandwho/p/7512119.html
耻辱墙:http://www.cnblogs.com/wlsandwho/p/4206472.html
=======================================================================
很显然我没有足够的巩俐,啊功力去讲解机器学习的大道理,但是我愿意把我的读书笔记分享出来。
当然,我保留版权。
=======================================================================
关于kNN算法的伪代码描述,我这里得写一下,因为《机器学习实践》这本书里写的不是很清楚。(当然我的用词更通俗,毕竟不能照抄原文啊:)
1 计算目标点与数据集中每个点的距离。
这个求距离的算法应当是根据实际情况具体问题具体分析采取的。书中使用的是欧几里德几何体系里的两点之间的距离。对,就是初中学的那个。
2 对距离的结果按照从小到大的顺序排序。
这里要记录哪个结果是由哪个点产生的。总不能排序之后结果排序了,但是对应点找不到了吧?
3 从结果中取前k个点。
kNN算法之所以叫kNN算法,是因为它选取了前k个点。
4 记录这k个点对应类别的频率。
比方说在这k个点中,a类出现了5次,b类出现了2次,c类出现了7次
5 取出现频率最高的类别作为结果。
通俗地讲,就是发现跟a有5成像,跟b有2成像,跟c有7成像。当然是选最像的啦。
=======================================================================
话是这么说,看起来也很简单。但是用指定的编程语言实现,就得看对于该语言的熟练程度了。
比方说,我用C++写的话,比较麻烦的地方是矩阵运算,其他就很简单了。
但是用Python的话,我需要熟悉相关的类库和代码。
=======================================================================
对于我这种只看过《Python编程:从入门到实践》的人来说,看《机器学习与实践》的代码还是要查资料的。
要理解下面的内容:
1 tile(x,(m,n))
通俗的说就是把指定的块x,按行复制m次,按列复制n次。m和n是可以取0的,但这没有意义,因为把没有复制了0次,还是没有啊:)
为什么我说的是块x呢?因为这个x可以是一个数,也可以是一个矩阵。对,大学线性代数课程里对矩阵运算时,就是可以把某一部分看成一个子矩阵的。这个同理。
2 x.sum(axis=?)
手册上说,是垂直求和还是水平求和。
3 a.argsort()
这个得画个图。一图胜千言。输入5316,输出2103。
贴出示例小代码有助于理解。毕竟我们用事实说话。
from numpy import *
import operator r=array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
rows=r.shape[0]
print(rows) x=[5,6]
xxx=tile(x,(3,2))
print(xxx) a=array([5,3,1,6])
#1,3, 5, 6
#2,1, 0, 3
b=a.argsort()
print(b)
print(b[0]) c={}
c['c']=1
c["b"]=2
c["a"]=1
c["a"]=c.get('a')+5
print(c["a"]) d=sorted(c.items(),key=operator.itemgetter(1),reverse=True)
print(d)
print(d[0][0]) mm=array([[1,2,3],[5,6,7]])
print(mm.sum(axis=0))
print(mm.sum(axis=1))
=======================================================================
好了,可以贴我的kNN代码了。Python的风格不习惯,随手写了下。
from numpy import *
import operator def create_data_set():
group=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
labels=["A","A","B","B"] return group,labels def classify_kNN(dest,sample,labels,k):
rows=sample.shape[0]
dests=tile(dest,(rows,1))
res=(((dests-sample)**2).sum(axis=1))**0.5
resrank=res.argsort() clfy={} for i in range(k):
index=resrank[i]
sometype=labels[index]
clfy[sometype]=clfy.get(sometype,0)+1 sclfy=sorted(clfy.items(),key=operator.itemgetter(1),reverse=True) return sclfy[0][0]
这是算法。
下面是调用。
g,l=create_data_set()
r=classify_kNN([0.5,0.6],g,l,2)
print(r)
这个是结果
=======================================================================
那么问题来了:
新分类值是否可以加入样本扩充原来的数据?
机器学习——kNN(1)基本原理的更多相关文章
- [机器学习] ——KNN K-最邻近算法
KNN分类算法,是理论上比较成熟的方法,也是最简单的机器学习算法之一. 该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别 ...
- 机器学习--kNN算法识别手写字母
本文主要是用kNN算法对字母图片进行特征提取,分类识别.内容如下: kNN算法及相关Python模块介绍 对字母图片进行特征提取 kNN算法实现 kNN算法分析 一.kNN算法介绍 K近邻(kNN,k ...
- 机器学习-kNN
基于Peter Harrington所著<Machine Learning in Action> kNN,即k-NearestNeighbor算法,是一种最简单的分类算法,拿这个当机器学习 ...
- kNN算法基本原理与Python代码实践
kNN是一种常见的监督学习方法.工作机制简单:给定测试样本,基于某种距离度量找出训练集中与其最靠近的k各训练样本,然后基于这k个“邻居”的信息来进行预测,通常,在分类任务中可使用“投票法”,即选择这k ...
- 机器学习-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算法是用来分类的. 这个算法是如何来分类的呢? 看下图,你可以想想下图中的 『绿色圆点』 ...
随机推荐
- thinkinginjava学习笔记03_基本语法
由于java是c系语言,基本保留c语言的所有基本操作,就快速过一下: java中的基本操作符仅仅对基本类型有效:=.==.!=对所有对象有效(值传递),String类支持+.+=; 在对基本数据进行算 ...
- C#面向插件级别的软件开发 - 开源研究系列文章
在现在的面向对象的分析与设计软件开发过程中,最开始就是面向对象的软件开发.但是,在实际的软件开发过程中,很多都是面向接口的开发方式,这种是一种面向对象开发的模式.但是,今天笔者给大家带来的是面向插件的 ...
- Java Web高级编程(二)
使用会话维持状态 一.会话 为了实现关联同一个用户端的多个请求和这些请求之间数据的共享,需要用到会话,会话用于维持请求和请求之间的状态.从服务器的角度,当用户的Web浏览器打开第一个链接到服务器的套接 ...
- jmeter测试
时间过得飞快,转眼间就到了公司半个月了,这是第三周上班,从上班到现在感觉自己什么都没有做,只是写了一些前台的验证,况且我的前台并不是很熟,js学了很久也快忘记了,看了看插件也不咋会用,但是自己也写了点 ...
- JS大小写字母转换
var a = "ABCd"; console.log(a.toLowerCase());//转换成小写 console.log(a.toUpperCase());//转换成大写
- Java第二章----对象和类
从第一章到第二章整整隔了一个月的时间,这速度也是慢的无语了.因为这个月负责开发公司一个SaaS类型APP,忙的昏天暗地终于上线了,这才有时间写个博客.本章还是以概念为主,有点枯燥重在理解. 第一节:对 ...
- winform socket编程之TCPListener
运行结果: 服务端代码 using System; using System.Collections.Generic; using System.ComponentModel; using Syste ...
- Java学习笔记9(面向对象二:this、继承、抽象类)
就近原则: 类中的方法中的变量和成员变量重名时,调用类的方法时候,生效的是方法中的变量,如果方法中没有定义变量,才会去成员变量中寻找 于是,提出了this关键字,为了区分重名问题 public cla ...
- python 命令
pip list 可以查看已经安装的插件 pip show name 可以查看插件的信息(如:pip show selenium) pip install selenium==[version num ...
- Windows平台下的内存泄漏检测
在C/C++中内存泄漏是一个不可避免的问题,很多新手甚至有许多老手也会犯这样的错误,下面说明一下在windows平台下如何检测内存泄漏. 在windows平台下内存泄漏检测的原理大致如下. 1. 在分 ...