《机器学习实战》——K近邻算法
三要素:距离度量、k值选择、分类决策
原理:
(1) 输入点A,输入已知分类的数据集data
(2) 求A与数据集中每个点的距离,归一化,并排序,选择距离最近的前K个点
(3) K个点进行投票,票数最多的分类即为所求
优点:
简单,可用于非线性分类
缺点:
当样本不均衡时影响投票结果;
分类结果受K值影响;
时空复杂度高:需要保存全部数据O(N),每次取前k个都要与全部数据进行计算O(N),耗费内存大且计算量大
改进:
样本均衡化
太小的K值容易受噪音影响,大的K值减小噪音但会使分类边界模糊,最合适的方法是用交叉验证确定K值:先确定较小的k,。
建立kd树木来较少距离计算:依次选x轴、y轴中位数重复切分超平面,直到子区域没有实例;先从根找叶子,再从叶子回退递归地查找最近点,回退到根节点、或满足条件终止(未必是最优解)。
代码:
# coding: utf-8
from numpy import * class KNN(object):
def __init__(self, inX, dataStr, k=20):
group, labels = self.loadData(dataStr)
if array(inX).shape != array(group[0]).shape:
raise ValueError("the shapes of inX are wrong!")
self.classify = self.classifyer(inX, group, labels, k) def loadData(self, dataStr):
data = [it.strip().split("\t") for it in dataStr.strip().split("\n")]
group = [map(float, it[:2]) for it in data]
labels = [it[2] for it in data]
return group, labels def getDistance(self, vectorA, vectorB):
vectorA = array(vectorA); vectorB = array(vectorB)
if vectorA.shape != vectorB.shape:
raise ValueError("the shapes of input array are different!")
else:
print vectorA, vectorB
return sum((vectorA - vectorB)**2)**0.5 def classifyer(self, inX, group, labels, k):
k = min(k, len(labels))
distances = [self.getDistance(it, inX) for it in group]
sortedDistIndices = array(distances).argsort().tolist()
voter = dict()
for i in range(k):
voteLabel = labels[sortedDistIndices[i]]
voter[voteLabel] = voter.get(voteLabel, 0) + 1
classify = min(voter.items(), key = lambda x: x[1])[0]
return classify if __name__=="__main__":
data = "1\t1.1\tA\n1\t1\tA\n0\t0\tB\n0\t0.1\tB\n"
inX = [1,2]
a = KNN(inX, data).classify
《机器学习实战》——K近邻算法的更多相关文章
- 机器学习实战-k近邻算法
写在开头,打算耐心啃完机器学习实战这本书,所用版本为2013年6月第1版 在P19页的实施kNN算法时,有很多地方不懂,遂仔细研究,记录如下: 字典按值进行排序 首先仔细读完kNN算法之后,了解其是用 ...
- 机器学习之K近邻算法(KNN)
机器学习之K近邻算法(KNN) 标签: python 算法 KNN 机械学习 苛求真理的欲望让我想要了解算法的本质,于是我开始了机械学习的算法之旅 from numpy import * import ...
- 【机器学习】k近邻算法(kNN)
一.写在前面 本系列是对之前机器学习笔记的一个总结,这里只针对最基础的经典机器学习算法,对其本身的要点进行笔记总结,具体到算法的详细过程可以参见其他参考资料和书籍,这里顺便推荐一下Machine Le ...
- 第四十六篇 入门机器学习——kNN - k近邻算法(k-Nearest Neighbors)
No.1. k-近邻算法的特点 No.2. 准备工作,导入类库,准备测试数据 No.3. 构建训练集 No.4. 简单查看一下训练数据集大概是什么样子,借助散点图 No.5. kNN算法的目的是,假如 ...
- 机器学习之K近邻算法
K 近邻 (K-nearest neighbor, KNN) 算法直接作用于带标记的样本,属于有监督的算法.它的核心思想基本上就是 近朱者赤,近墨者黑. 它与其他分类算法最大的不同是,它是一种&quo ...
- [机器学习实战] k邻近算法
1. k邻近算法原理: 存在一个样本数据集,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系.输入没有标签的新数据后,将新数据的每个特征与样本集中数据对 ...
- 【机器学习】K近邻算法——多分类问题
给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例,这K个实例的多数属于某个类,就把该类输入实例分为这个类. KNN是通过测量不同特征值之间的距离进行分类.它的的思路是:如 ...
- 机器学习2—K近邻算法学习笔记
Python3.6.3下修改代码中def classify0(inX,dataSet,labels,k)函数的classCount.iteritems()为classCount.items(),另外p ...
- 机器学习03:K近邻算法
本文来自同步博客. P.S. 不知道怎么显示数学公式以及排版文章.所以如果觉得文章下面格式乱的话请自行跳转到上述链接.后续我将不再对数学公式进行截图,毕竟行内公式截图的话排版会很乱.看原博客地址会有更 ...
- 机器学习实战 - python3 学习笔记(一) - k近邻算法
一. 使用k近邻算法改进约会网站的配对效果 k-近邻算法的一般流程: 收集数据:可以使用爬虫进行数据的收集,也可以使用第三方提供的免费或收费的数据.一般来讲,数据放在txt文本文件中,按照一定的格式进 ...
随机推荐
- oracle删除表的方法
1. 删除oracle表中的所有数据而不删除表: 语法: TRUNCATE TABLE table_name; 使用这条语句只是删除表中的全部数据,不是删除表,这种方式也叫做截断表,这种方式比使用de ...
- Ubuntu14.04建立WiFi热点
整理自Ubuntu 下建立WiFi热点的方法 Ubuntu14.04 Deepin2014分享WiFi 亲测成功 方法一:network manager 用Ubuntu自带的network manag ...
- 独立两套DJANGO+CELERY配置(生产+测试)时要注意的一些细节
1,生产的NGINX环境,要指定自己的目录,而不是PROJ默认的. upstream ism_host { server ; } server { listen ; server_name local ...
- DHTMLX 前端框架 建立你的一个应用程序 教程(十一)--添加/删除表格中的记录
添加/删除表格中的记录 我们的最终功能是在表格中添加删除 我们通过单机工具栏上的按钮来实现添加删除 当我们单击添加按钮的时候, 表单中 第一行默认填写New contact 光标自动聚焦 当用户点击删 ...
- 关于checkbox的checked属性和change事件
jquery中的attr和prop有什么区别? To retrieve and change DOM properties such as the checked, selected, or disa ...
- Yii url createUrl redirect相关
一篇文章: 在yii中明明白白生成网址: 在Yii中经常要生成URL,不管是为了自动跳转还是仅仅是一个链接.下面对Yii中的URL生成做了一个总结.提示:以下controllerX代表控制器X,act ...
- YII CJson类
CJson文档: http://www.yiiframework.com/doc/api/1.1/CJSON CJson::encode可以编码任何类型的数据:源码如下: public static ...
- 【HDOJ】1297 Children’s Queue
递推,最近发现自己做递推的题总是没有思路.下周多练习.对于f(n)可以在第n个位置为男生,此时共有f(n-1)种情况:若在第n个位置为女生,因此第n-1个位置也必须为女生.此时有两种情况,一种情况是在 ...
- WCF - Creating WCF Service
http://www.tutorialspoint.com/wcf/wcf_creating_service.htm Creating a WCF service is a simple task u ...
- 一步步写STM32 OS【四】OS基本框架
一.上篇回顾 上一篇文章中,我们完成了两个任务使用PendSV实现了互相切换的功能,下面我们接着其思路往下做.这次我们完成OS基本框架,即实现一个非抢占式(已经调度的进程执行完成,然后根据优先级调度等 ...