三要素:距离度量、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近邻算法的更多相关文章

  1. 机器学习实战-k近邻算法

    写在开头,打算耐心啃完机器学习实战这本书,所用版本为2013年6月第1版 在P19页的实施kNN算法时,有很多地方不懂,遂仔细研究,记录如下: 字典按值进行排序 首先仔细读完kNN算法之后,了解其是用 ...

  2. 机器学习之K近邻算法(KNN)

    机器学习之K近邻算法(KNN) 标签: python 算法 KNN 机械学习 苛求真理的欲望让我想要了解算法的本质,于是我开始了机械学习的算法之旅 from numpy import * import ...

  3. 【机器学习】k近邻算法(kNN)

    一.写在前面 本系列是对之前机器学习笔记的一个总结,这里只针对最基础的经典机器学习算法,对其本身的要点进行笔记总结,具体到算法的详细过程可以参见其他参考资料和书籍,这里顺便推荐一下Machine Le ...

  4. 第四十六篇 入门机器学习——kNN - k近邻算法(k-Nearest Neighbors)

    No.1. k-近邻算法的特点 No.2. 准备工作,导入类库,准备测试数据 No.3. 构建训练集 No.4. 简单查看一下训练数据集大概是什么样子,借助散点图 No.5. kNN算法的目的是,假如 ...

  5. 机器学习之K近邻算法

    K 近邻 (K-nearest neighbor, KNN) 算法直接作用于带标记的样本,属于有监督的算法.它的核心思想基本上就是 近朱者赤,近墨者黑. 它与其他分类算法最大的不同是,它是一种&quo ...

  6. [机器学习实战] k邻近算法

    1. k邻近算法原理: 存在一个样本数据集,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系.输入没有标签的新数据后,将新数据的每个特征与样本集中数据对 ...

  7. 【机器学习】K近邻算法——多分类问题

    给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例,这K个实例的多数属于某个类,就把该类输入实例分为这个类. KNN是通过测量不同特征值之间的距离进行分类.它的的思路是:如 ...

  8. 机器学习2—K近邻算法学习笔记

    Python3.6.3下修改代码中def classify0(inX,dataSet,labels,k)函数的classCount.iteritems()为classCount.items(),另外p ...

  9. 机器学习03:K近邻算法

    本文来自同步博客. P.S. 不知道怎么显示数学公式以及排版文章.所以如果觉得文章下面格式乱的话请自行跳转到上述链接.后续我将不再对数学公式进行截图,毕竟行内公式截图的话排版会很乱.看原博客地址会有更 ...

  10. 机器学习实战 - python3 学习笔记(一) - k近邻算法

    一. 使用k近邻算法改进约会网站的配对效果 k-近邻算法的一般流程: 收集数据:可以使用爬虫进行数据的收集,也可以使用第三方提供的免费或收费的数据.一般来讲,数据放在txt文本文件中,按照一定的格式进 ...

随机推荐

  1. [转载]Winform等待窗口的实现(附源代码)

    在开发Winform程序的时候,经常会用到等待窗口(如网络通讯.数据库连接等需要一定时间来执行的操作),这样可以给用户提供更好的体验. 等待窗口的主要功能是一边执行需要等待的操作,一边显示一个等待界面 ...

  2. BT5下安装Metasploit4.5方法

    BT5与Ubuntu下安装最新版Metasploit4.5方法:(先把老版本的MSF uninstall,BT5自带的老版本Metasploit没有办法升级!) 1.下载Metasploit下的Lin ...

  3. WINDOWS 2008 SERVER域用户自动登陆

    The user I wanted to auto-logon as didn’t have a password, this reg hack worked instead: HKEY_LOCAL_ ...

  4. Mysql 批量建表存储过程

    最近项目中用到了使用存储过程批量建表的功能,记录下来: USE db_test_3; drop procedure if EXISTS `createTablesWithIndex`; create ...

  5. 在Qt中使用sleep(包含为win and *nix下sleep函数的实现及用法)

    http://blog.csdn.net/tingsking18/article/details/5304254 关于sleep函数,我们先来看一下他的作用:sleep函数是使调用sleep函数的线程 ...

  6. Import Items – Validation Multiple Languages Description

            ð  提交标准请求创建和更新物料,因语言环境与处理次序方式等因素,造成物料中英(更多语言)描述和长描述混乱刷新. 症状: >>> Submit Standard Op ...

  7. Android开发UI之控件-Android-PullToRefresh

    下拉刷新,使用的是Android-PullToRefresh,Github--https://github.com/chrisbanes/Android-PullToRefresh PullToRef ...

  8. C#如何获取真实IP地址

    大家获取用户IP地址常用的方法是   C# 代码   复制 string IpAddress = ""; if((HttpContext.Current.Request.Serve ...

  9. 【转】ubuntu 12.04英文版设置成中文版

    原文网址:http://blog.csdn.net/hhbgk/article/details/7958776 适用于ubuntu 12.04英文版的系统,其它版本的设置应该是大同小异的. 进入ubu ...

  10. ruby编程语言-学习笔记2(第4章 表达式和操作符)

    对属性和数组元素的赋值 o.m + = 1  ===>o.m = (o.m()+ 1)  # 对 o.m()这个方法的结果+1 对数组元素的赋值也是通过 方法调用来完成. 0.[] = 1 == ...