机器学习-KNN分类器
K-近邻(k-Nearest Neighbors,KNN)的原理
通过测量不同特征值之间的距离来衡量相似度的方法进行分类。
KNN算法过程
训练样本集:样本集中每个特征值都已经做好类别标签;
测试样本: 测试样本中每个特征值都没有类别标签;
算法过程: 计算测试样本中特征值与训练样本集中的每个特征值之间的距离,提取与训练样本集中的特征值距离最近的前K个样本,然后选取出现次数最多的类别标签,作为测试样本的类别标签。
度量特征值之间距离的方法
(1) 欧氏距离
可称为L2范数:

其中p=2,则特征向量a=(a1,a2,…,am)和特征向量b=( b1,b2,…,bm)之间的距离为

又称欧式距离。
例如二维平面上的两点a(x1, y1)和b(x2, y2)之间的欧式距离:

d值越小,表明特征值之间距离越小,两个特征越相似。
(2) 夹角余弦
特征向量a=(a1,a2,…,am)和特征向量b=(
b1,b2,…,bm)之间的夹角余弦为:

cos值越大,表明特征值之间距离越小,两个特征越相似。
一个简单的例子
Python代码示例:
# coding: utf-8
# 作者:tany 博客:http://www.cnblogs.com/tan-v/
from numpy import *
import operator
import matplotlib.pyplot as plt def createDataSet(): # 生成训练集
group = array([[1.0, 1.1], [0.9, 1.3], [ 0, 0.1], [0.1, 0.2]])
labels = ['A', 'A', 'B', 'B']
return group, labels def showDataSet(dataSet, labels): # 显示训练集
fig = plt.figure()
ax = fig.add_subplot(111)
index = 0
for point in dataSet:
if labels[index] == 'A':
ax.scatter(point[0], point[1], c='blue')
ax.annotate("A", xy = (point[0], point[1]))
else:
ax.scatter(point[0], point[1], c='red')
ax.annotate("B", xy = (point[0], point[1]))
index += 1
plt.show() def eulerDist(inXmat, dataSet): # 使用欧式距离
diffMat = inXmat - dataSet # 输入向量分别与样本中其他的向量之差
sqDiffMat = diffMat**2 # 差值求平方
sqDistances = sqDiffMat.sum(axis=1) # axis=1将一个矩阵的每一行向量相加, 将差值相加
dist = sqDistances**0.5 # 开方
return dist def cosDist(inXmat, dataSet): # 使用夹角余弦
m = shape(inXmat)[0]
dist = zeros((m)) # 与训练集中每一个特征求距离
for i in range(m):
cos = dot(inXmat[i,:], dataSet[i,:])/(linalg.norm(inXmat[i,:])*linalg.norm(dataSet[i,:])) # 求余弦值
dist[i] = cos
return dist def KNNclassify(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0] # 行数
inXmat = tile(inX, (dataSetSize, 1)) # tile(A,reps)若reps为一个元组(m,n),则构造一个m行n列的数组,其中每个元素均为A,
# 目的是求inX分别与其他dataSet的数据间的距离
distance = eulerDist(inXmat, dataSet) # 使用欧式距离度量向量间距离
sortedDistIndicies = distance.argsort() # 对一个数组进行升序排列,结果返回的就是a中所有元素排序后各个元素在a中之前的下标 #distance = cosDist(inXmat, dataSet) # 使用夹角余弦度量向量间距离
#sortedDistIndicies = argsort(-distance) # 降序排列 classcount = {} # 字典 for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
classcount[voteIlabel] = classcount.get(voteIlabel,0) + 1 # dict.get(key, default=None) key:字典中要查找的键。
# default -- 如果指定键的值不存在时,返回该默认值。 # classcount.iteritems()返回一个迭代器。返回一个可以调用的对象(可以从操作对象中提取item)
# operator.itemgetter函数获取的不是值,而是定义了一个函数。获取对象的第1个域的值在这里使用字典中的值进行从小到大进行排序
# sorted(iterable, cmp, key, reverse),iterable指定要排序的list或者iterable,
# cmp为函数,指定排序时进行比较的函数,可以指定一个函数或者lambda函数
# key为函数,指定取待排序元素的哪一项进行排序
# reverse默认为false(升序排列),定义为True时将按降序排列。
sortedClassCount = sorted(classcount.iteritems(), key=operator.itemgetter(1), reverse=True) return sortedClassCount[0][0] dataSet, labels = createDataSet(); # 生成训练集
showDataSet(dataSet,labels) # 显示训练集
inX = array([1, 1]) # 输入一个测试样本
classLabel = KNNclassify(inX, dataSet, labels, 3) # 使用KNN进行分类
print classLabel # 输入分类之后所属的标签
执行结果:

-tany 2017年10月4日 中秋 于杭州
人工智能从入门到专家教程资料:https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.38270209gU11fS&id=562189023765
机器学习-KNN分类器的更多相关文章
- 股票价格涨跌预测—基于KNN分类器
code{white-space: pre;} pre:not([class]) { background-color: white; }if (window.hljs && docu ...
- 【udacity】机器学习-knn最近邻算法
Evernote Export 1.基于实例的学习介绍 不同级别的学习,去除所有的数据点(xi,yi),然后放入一个数据库中,下次直接提取数据 但是这样的实现方法将不能进行泛化,这种方式只能简单的 ...
- 【cs231n作业笔记】一:KNN分类器
安装anaconda,下载assignment作业代码 作业代码数据集等2018版基于python3.6 下载提取码4put 本课程内容参考: cs231n官方笔记地址 贺完结!CS231n官方笔记授 ...
- 机器学习-KNN算法详解与实战
最邻近规则分类(K-Nearest Neighbor)KNN算法 1.综述 1.1 Cover和Hart在1968年提出了最初的邻近算法 1.2 分类(classification)算法 1.3 输入 ...
- [机器学习] ——KNN K-最邻近算法
KNN分类算法,是理论上比较成熟的方法,也是最简单的机器学习算法之一. 该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别 ...
- 机器学习——kNN(2)示例:改进约会网站的配对效果
=================================版权声明================================= 版权声明:原创文章 禁止转载 请通过右侧公告中的“联系邮 ...
- 机器学习——kNN(1)基本原理
=================================版权声明================================= 版权声明:原创文章 禁止转载 请通过右侧公告中的“联系邮 ...
- 机器学习--kNN算法识别手写字母
本文主要是用kNN算法对字母图片进行特征提取,分类识别.内容如下: kNN算法及相关Python模块介绍 对字母图片进行特征提取 kNN算法实现 kNN算法分析 一.kNN算法介绍 K近邻(kNN,k ...
- 机器学习-kNN
基于Peter Harrington所著<Machine Learning in Action> kNN,即k-NearestNeighbor算法,是一种最简单的分类算法,拿这个当机器学习 ...
随机推荐
- Spring详解(五)------AOP
这章我们接着讲 Spring 的核心概念---AOP,这也是 Spring 框架中最为核心的一个概念. PS:本篇博客源码下载链接:http://pan.baidu.com/s/1skZjg7r 密码 ...
- Ubuntu Docker Registry 搭建私有仓库
服务器版本 Ubuntu 16.04 LTS. 安装命令: $ docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --rest ...
- spring mvc:exclude-mapping错误提示
今天搭建一个java web项目时,增加了一个登录的拦截器,主要功能就是未登录的用户无法访问系统的任何页面. 先说明下我的web项目springmvc的版本以及刚开始配置的拦截器: springmvc ...
- 互联网世界中的C语言——我的golang学习笔记:1(基础语法快速过)
前言 学习任何知识都会有一个学习背景 最近,我们团队乃至我司整个云服务,上go的呼声越来越高!新服务已经开始用go开发,部分现有Java版的服务重构为go也只是时间问题而已,故相关技术积累势在必行!在 ...
- oracle 索引失效的情况分析
见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp54 1) 没有查询条件,或者查询条件没有建立索引 2) 在查询条件上 ...
- kill -3 导出 thread dump
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt361 有些Java应用服务器是在控制台上运行,如Weblogic,为了方便获 ...
- 算法学习:Pac-Man的简单对抗
Pacman项目是加州大学伯克利分校提供的一个可视化的AI学习平台.其主体利用python完成.该项目提供了丰富的说明文档,以及预先实现了一些简单的算法供参考各接口的使用. http://ai.ber ...
- CCNA+NP学习笔记—交换网络篇
本章关于企业网络的最底层--交换层,难度较低,主要为以后三层的路由做铺垫.所有笔记的分类顺序为:序章→交换层→路由层→运营商,体现了从企业网到互联网的学习顺序. 注:思科设备命令行通常不分大小写!以后 ...
- 结对编程1--基于GUI的四则运算题目生成器
最终项目详细代码(coding地址)/李志强的博客/我的详细代码/方言的博客 一.需求分析 1.实现之前项目的功能,如:除了整数之外,还要支持真分数的四则运算,真分数的运算,并且要求能处理用户的输入, ...
- 201521123040《Java程序设计》第8周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 2. 书面作业 本次作业题集集合 1.List中指定元素的删除(题目4-1) 1.1 实验总结 我们每次删除元 ...