算法代码[置顶] 机器学习实战之KNN算法详解

时间:2022-09-10 13:26:28

改章节笔者在深圳喝咖啡的时候突然想到的...之前就有想写几篇关于算法代码的文章,所以回家到以后就奋笔疾书的写出来发表了


前一段时间介绍了Kmeans聚类,而KNN这个算法刚好是聚类以后经常使用的匹配技巧。我们都知道python中有Numby和Scipy这两个库,还有前段时间写的matplot库,绘图用的,大家可以参考下,实际这个算法是看懂之前的一些算法的实现。

上面我就简单介绍下这个算法实现,首先我们先肯定一个事前准备好的矩阵,这个多是事前聚类出来的或者通过专家估计出来的值。

为了这个分类矩阵和标签写一个函数,这里我们把它称为createDataSe:

上面给出这个函数的代码:

def createDataSet():
group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])
labels = ['A', 'A', 'B', 'B']
return group, labels

看这篇博客的同时最好配有《机器学习实战》这本书,这本书的译者其中一个是现在项目的一个人参与者,在书中我们可以看到这样的图片:

算法代码[置顶] 机器学习实战之KNN算法详解

这样很明确的我们可以看到这4个点 和其对应的标签。

所谓KNN即我们新来一个测试点和之前我们做好标记的点计算距离,然后采取距离最近的标签作为该测试点的标签,当然你可能觉得原来是这么简单的货色,是的这个朴素的思惟,在当今的各种推荐系统,以及广告系统中,依然有所使用。

然后我们继续讲解下一段简单的代码,有了参考点,下一段当然是来测试点了,

上面我就先贴上代码:

    每日一道理
“一年之计在于春”,十几岁的年纪,正是人生的春天,别辜负了岁月老人的厚爱与恩赐。行动起来,播种梦想吧!
def classify(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0]
diffMat = tile(inX, (dataSetSize, 1))-dataSet
print(diffMat, '\n')
sqDiffMat = diffMat**2
print(sqDiffMat)
sqDistances = sqDiffMat.sum(axis=1)
print(sqDistances)
distance = sqDistances**0.5
sortedDistIndices = distance.argsort()
classCount = {}
for i in range(k):
voteIlabel = labels[sortedDistIndices[i]]
classCount[voteIlabel]= classCount.get(voteIlabel, 0)+1
sortedClassCount = sorted(classCount.items(), key = operator.itemgetter(1), reverse = True)
return sortedClassCount[0][0]

当然这个有书而且很仔细的童鞋会发现我多了几行打印代码,第一行是失掉先验数据的列数,然后第二行是产生一个与该矩阵一样巨细的矩阵并和原矩阵相减,然后失掉测试点与4个标记点的坐标差,下一行是打印,接下来就是我们将这个矩阵停止平方,然后将所有数据相加,合为一个数据,然后将其开平方,接距离停止排序,产生一个排名。

这样所有点到测试点的距离排名就都有了。

下一段for循环开始是选择前k个最近距离对该测试点停止投票,最后再次将投票结果停止排序,输出得票率最高的一个点作为最后的结果。这就是终究的标签结果。

不得不感叹一句这么短的代码完成了这多功能!

最后我再说点关于这一句的用法,这个是为了不返回异常如果没有,则增长一项,有了就增长1,这当然是最简单的KNN算法思惟的论述,但是与实际应用差了十万八千里。


classCount.get(voteIlabel, 0)

呵呵,这个也不是说这玩意没用,只是真正使用的时候多是高维空间的特征不是二维空间的特征没办法画出在空间中的点的位置。好了就说这么多吧。

附上测试调用的代码,该代码完成了(0,0)点的分类:

group, labels = createDataSet()

print(classify([0, 0], group, labels, 3))

对了还得给出程序运行的截图:

算法代码[置顶] 机器学习实战之KNN算法详解

文章结束给大家分享下程序员的一些笑话语录:

真正的程序员喜欢兼卖爆米花,他们利用CPU散发出的热量做爆米花,可以根据米花爆裂的速度听出正在运行什么程序。

---------------------------------
原创文章 By
算法和代码
---------------------------------

算法代码[置顶] 机器学习实战之KNN算法详解的更多相关文章

  1. 机器学习实战之kNN算法

    机器学习实战这本书是基于python的,如果我们想要完成python开发,那么python的开发环境必不可少: (1)python3.52,64位,这是我用的python版本 (2)numpy 1.1 ...

  2. 吴裕雄--天生自然python机器学习实战:K-NN算法约会网站好友喜好预测以及手写数字预测分类实验

    实验设备与软件环境 硬件环境:内存ddr3 4G及以上的x86架构主机一部 系统环境:windows 软件环境:Anaconda2(64位),python3.5,jupyter 内核版本:window ...

  3. 《机器学习实战》kNN算法及约会网站代码详解

    使用kNN算法进行分类的原理是:从训练集中选出离待分类点最近的kkk个点,在这kkk个点中所占比重最大的分类即为该点所在的分类.通常kkk不超过202020 kNN算法步骤: 计算数据集中的点与待分类 ...

  4. 机器学习实战 之 KNN算法

    现在 机器学习 这么火,小编也忍不住想学习一把.注意,小编是零基础哦. 所以,第一步,推荐买一本机器学习的书,我选的是Peter harrigton 的<机器学习实战>.这本书是基于pyt ...

  5. 《机器学习实战》KNN算法实现

    本系列都是参考<机器学习实战>这本书,只对学习过程一个记录,不做详细的描述! 注释:看了一段时间Ng的机器学习视频,感觉不能光看不练,现在一边练习再一边去学习理论! KNN很早就之前就看过 ...

  6. &lbrack;置顶&rsqb;&NewLine; MVC输出缓存&lpar;OutputCache参数详解)

    1.学习之前你应该知道这些 几乎每个项目都会用到缓存,这是必然的.以前在学校时做的网站基本上的一个标准就是1.搞定增删改查2.页面做的不要太差3.能运行(ps真的有这种情况,答辩验收的时候几个人在讲台 ...

  7. &lbrack;置顶&rsqb; Android开发之MediaPlayerService服务详解&lpar;一&rpar;

    前面一节我们分析了Binder通信相关的两个重要类:ProcessState 和 IPCThreadState.ProcessState负责打开Binder 驱动,每个进程只有一个.而 IPCThre ...

  8. &lbrack;置顶&rsqb; 安卓UI组件之ListView详解

    ListView是很常见的一个UI组件,在许多App中都很常用,其意思就是可滚动的列表,使用ListView必须使用Adapter(适配器),常用的适配器友谊ArrayAdapter,SimpleAd ...

  9. 机器学习之路--KNN算法

    机器学习实战之kNN算法   机器学习实战这本书是基于python的,如果我们想要完成python开发,那么python的开发环境必不可少: (1)python3.52,64位,这是我用的python ...

随机推荐

  1. XE5 ImageList的BUG&quest;

    今天做界面, 在imagelist里加载一个带有半透明通道的PNG图, 结果发现图片居然发暗, 如下: 原图: IDE里加载以后的图: 明显变暗...查询了源码, 无果 然后又用2010去测试, 发现 ...

  2. Android IOS WebRTC 音视频开发总结(七十)-- 移动端音视频技术优化的七个方向

    最近直播很火,很多朋友对背后的技术比较感兴趣,所以今天我们整理一篇关于移动端视频优化的文章,这篇文章是我朋友在一个技术大会上分享过的,更多内容请关注我们的微信公众号:rtcblacker 视频直播为什 ...

  3. 【Markdown】notepad&plus;&plus; 支持 markdown语法、预览

    Notepad++中支持Markdown   最近在学习Markdown语言的使用,很想在XP主机上使用Markdown的离线编辑器,但MarkdownPad.作业部分的离线客户端都不能再XP上运行, ...

  4. Chrome 浏览器地址栏直接搜索太慢的解决方案

    用Chrome经常直接把要搜索的内容写在地址栏, 回国就搜索,但最近发现搜索结果出来得太慢,要刷新好几次才行. 解决方案如下: 打开Chrome的"设置", 找到”管理搜索引擎“, ...

  5. Linode VPS上架日本东京2号机房,性能速度评测报告(推荐)

    我非常喜欢的海外免备案vps品牌linode日本机房长期缺货,中国用户想买都买不到.不过近日,陆续有国内朋友收到了Linode邀请,Tokyo 2日本东京机房开启内测,很快正式上架销售. 苦等太久的站 ...

  6. frp 初探

    条件: (1) 服务器端要有公网 IP (2) 客户端能上网,能够访问服务器的公网 IP 下载 https://github.com/fatedier/frp/releases 根据服务器和客户端的操 ...

  7. vue环境配置 vue-cli脚手架

    vue 环境配置步骤: 第一步: 在官网下载node,Node  下载地址 http://nodejs.cn/ 并安装node.检测node是否安装成功, 按 “windows+r”  进入cmd命令 ...

  8. spark中的combineByKey函数的用法

    一.函数的源码 /** * Simplified version of combineByKeyWithClassTag that hash-partitions the resulting RDD ...

  9. WebForm从客户端中检测到有潜在危险的Request&period;Form 值的处理办法

    从客户端中检测到有潜在危险的 Request.Form 值由于在.net中,Request时出现有HTML或Javascript等字符串时,系统会认为是危险性值.立马报错上面的错误. 如:在网页的Te ...

  10. &lpar;转)C++初始化与赋值

    来源:http://www.cnblogs.com/chio/archive/2008/10/06/1305145.html 先来个区别说明:赋值操作是在两个已经存在的对象间进行的,而初始化是要创建一 ...