机器学习01-kNN邻近算法
k-近邻算法
概述:k-近邻算法採用測量不同特征值之间的距离方法进行分类
长处:精度高、对于异常值不敏感。无数据输入假定
缺点:计算复杂度高,空间复杂度高,而且它没有办法各处基础数据的一些内部信息数据。
算法描写叙述:存在一个准确的数据集合样本。称作训练样本集,样本集合中每一个item都附带自己所属分类标签。当须要推断新数据的分类是,仅仅须要计算特征数据和样本数据中最类似的分类标签,选择k个最类似的标签,k个标签中占比最多的即为目标标签。
详细分类算法
#-*- coding=utf-8 -*-
from numpy import *
import operator
##简单的kNN算法实现
#dataSet是训练数据集合。每行代表每一个训练数据的每一个特征值
#labels 相应dataSet每一个训练数据的class标签
#inX 表示待分类的特征数据
def classify0(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0] # 获取測试集合大小
#求每一个输入特征值和每一个測试集合总的特征值的超时
#首先须要使用tile将特征值扩展为和測试集合相等大小的矩阵
diffMat = tile(inX, (dataSetSize, 1)) - dataSet
#取平方
sqlDiffMat = diffMat ** 2
sumMat = sqlDiffMat.sum(axis=1)
distances = sumMat ** 0.5
#获取排序信息
#比如:array([9,1,3,0]) -> array([3,1,2,0]) 升序标签
sortIndicies = distances.argsort()
classCount = {}
#取距离最小的前k个相应的标签统计信息
for i in range(k):
label = labels[sortIndicies[i]]
classCount[label] = classCount.get(label,0) + 1
#取最大的
sortedClassCount = sorted(classCount.iteritems(), key = operator.itemgetter(1), reverse=True)
return sortedClassCount[0][0]
关于特征数据
不同的特征,详细的数据值波动区间是不同的,比如特征A取值范围在[1000,10000],可是特征B取值范围在[0,10],假设直接使用这种特征数据进行KNN算法运算。会出现的一个问题,高区间的特征对结果的影响远远大于低区间的特征值,因此我们须要对我们的特征数据做归一化处理,即将全部特征值处理到同样的区间范围中。
详细算法:((特征值-min)/(max - min)) -> [0,1]区间范围
from numpy import *
import operator
#用于将一个不同范围域的特征值归一化到统一的[0,1]之间
def normData(dataSet):
#获取每一个特征的最大值
maxValue = dataSet.max(0)
#获取每一个特征的最小值
minValue = dataSet.min(0)
ranges=maxValue-minValue
#将数据归一到同一个范围
normalDataSet = zeros(shape(dataSet))
m = dataSet.shape[0]
normalDataSet = dataSet - tile(ranges,(m,1))
#除于最大值
normalDataSet = normalDataSet/tile(maxValue,(m,1))
return normalDataSet, ranges, minValues
关于可视化特征数据
怎样判别我们取得的特征数据集合适合使用knn进行分类训练?
在做数据观察时我们往往须要通过可视化方式去观察我们的特征数据和label的分布,这个时候就须要用到Python的一个图形工具matplotlib。
特征和分类数据:testSet.txt
3.542485 1.977398 -1
3.018896 2.556416 -1
7.551510 -1.580030 1
2.114999 -0.004466 -1
8.127113 1.274372 1
7.108772 -0.986906 1
8.610639 2.046708 1
2.326297 0.265213 -1
3.634009 1.730537 -1
0.341367 -0.894998 -1
3.125951 0.293251 -1
2.123252 -0.783563 -1
0.887835 -2.797792 -1
7.139979 -2.329896 1
1.696414 -1.212496 -1
8.117032 0.623493 1
8.497162 -0.266649 1
4.658191 3.507396 -1
8.197181 1.545132 1
1.208047 0.213100 -1
1.928486 -0.321870 -1
2.175808 -0.014527 -1
7.886608 0.461755 1
3.223038 -0.552392 -1
3.628502 2.190585 -1
7.407860 -0.121961 1
7.286357 0.251077 1
可视化脚本:
from numpy import *
import matplotlib
import matplotlib.pyplot as plt
##read file
fr = open('testSet.txt')
lines = fr.readlines()
dataSet = zeros((len(lines),1))
labels = []
index = 0
for line in lines:
items = line.strip().split('\t')
dataSet[index:] = items[0:2]
labels.append(items[-1])
#matplot
fx = plt.figure()
ax = fx.add_subplot(111)
#将数组转换为矩阵
dataSet = matrix(dataSet)
colora = tile(50, len(lines))
#这里的colora是为了通过颜色区分不同的labels, cmap代表颜色map,默认是yard, s是每一个点的大小,alpha是每一个点的透明度
ax.scatter(dataSet[:,0], dataSet[:,1], c=colora * labels, cmap='autum', s=50, alpha=0.3)
plt.show()
机器学习01-kNN邻近算法的更多相关文章
- [机器学习实战] k邻近算法
1. k邻近算法原理: 存在一个样本数据集,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系.输入没有标签的新数据后,将新数据的每个特征与样本集中数据对 ...
- 机器学习入门KNN近邻算法(一)
1 机器学习处理流程: 2 机器学习分类: 有监督学习 主要用于决策支持,它利用有标识的历史数据进行训练,以实现对新数据的表示的预测 1 分类 分类计数预测的数据对象是离散的.如短信是否为垃圾短信,用 ...
- [机器学习] ——KNN K-最邻近算法
KNN分类算法,是理论上比较成熟的方法,也是最简单的机器学习算法之一. 该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别 ...
- 【机器学习】机器学习入门01 - kNN算法
0. 写在前面 近日加入了一个机器学习的学习小组,每周按照学习计划学习一个机器学习的小专题.笔者恰好近来计划深入学习Python,刚刚熟悉了其基本的语法知识(主要是与C系语言的差别),决定以此作为对P ...
- <机器学习实战>读书笔记--k邻近算法KNN
k邻近算法的伪代码: 对未知类别属性的数据集中的每个点一次执行以下操作: (1)计算已知类别数据集中的点与当前点之间的距离: (2)按照距离递增次序排列 (3)选取与当前点距离最小的k个点 (4)确定 ...
- 最邻近算法(KNN)识别数字验证码
应用场景 对于简单的数字型验证码的自动识别.前期已经完成的工作是通过切割将验证码图片切割成一个一个的单个数字的图片,并按照对应的数字表征类别进行分类(即哪些图片表示数字7,哪些表示8),将各种数字 ...
- k最邻近算法——使用kNN进行手写识别
上篇文章中提到了使用pillow对手写文字进行预处理,本文介绍如何使用kNN算法对文字进行识别. 基本概念 k最邻近算法(k-Nearest Neighbor, KNN),是机器学习分类算法中最简单的 ...
- 机器学习---K最近邻(k-Nearest Neighbour,KNN)分类算法
K最近邻(k-Nearest Neighbour,KNN)分类算法 1.K最近邻(k-Nearest Neighbour,KNN) K最近邻(k-Nearest Neighbour,KNN)分类算法, ...
- 机器学习:K-近邻算法(KNN)
机器学习:K-近邻算法(KNN) 一.KNN算法概述 KNN作为一种有监督分类算法,是最简单的机器学习算法之一,顾名思义,其算法主体思想就是根据距离相近的邻居类别,来判定自己的所属类别.算法的前提是需 ...
- 机器学习算法及代码实现–K邻近算法
机器学习算法及代码实现–K邻近算法 1.K邻近算法 将标注好类别的训练样本映射到X(选取的特征数)维的坐标系之中,同样将测试样本映射到X维的坐标系之中,选取距离该测试样本欧氏距离(两点间距离公式)最近 ...
随机推荐
- windows删除多余启动引导项
方法1: 按快捷键win+r,打开运行界面,输入msconfig. 点击确定,进入系统配置,选择引导选项卡,如图: 选中你不需要的启动项,点击下面的删除按钮即可.删除完成之后点击确定,重启计算机就可以 ...
- dlopen 方式调用 Linux 的动态链接库
在dlopen()函数以指定模式打开指定的动态链接库文件.并返回一个句柄给 dlsym()的调用进程. 使用 dlclose()来卸载打开的库. 功能:打开一个动态链接库,并返回动态链接库的句柄 包括 ...
- 3. CONFIGURATION官网剖析(博主推荐)
不多说,直接上干货! 一切来源于官网 http://kafka.apache.org/documentation/ 3. CONFIGURATION 3.1 Broker Configs 3.2 Pr ...
- [ Eclipse ] [ Problem ] Eclipse 無法開啟問題
因為 Eclipse 在設定環境的過程掛掉太多次,擷取一些網路上優秀的文章當作備份 http://www.ewdna.com/2013/12/Eclipse-Loading-Workbench.htm ...
- Qt 图片浏览器 实现图片的放大缩小翻转等功能
图片的功能 源码: wiget.h #ifndef WIDGET_H #define WIDGET_H #include <QPixmap> #include <QImage> ...
- matlab 局部特征检测与提取(问题与特征)
物体识别:SIFT 特征: 人脸识别:LBP 特征: 行人检测:HOG 特征: 0. 常见手工设计的低级别特征 manually designed low-level features 语音:高斯混合 ...
- [RxJS] How To get the results of two HTTP requests made in sequence
switchMap can chain two HTTP requests together, creating one request based on the results of the fir ...
- JQuery EasyUI Combobox 实现省市二级联动菜单
//编辑改动或新增页面联动能够这样写 jQuery(function(){ // 省级 $('#province').combobox({ valueField:'itemvalue', //值字段 ...
- C++ 中的异或操作^
好好的利用异或能够产生奇妙的效果. 异或运算的性质: 不论什么一个数字异或它自己都等于0.也就是说.假设我们从头到尾依次异或数组中的每个数字,那么终于的结果刚好是那个仅仅出现一次的数字.由于那些出现两 ...
- 详解javascript的深拷贝与浅拷贝
1. 认识深拷贝和浅拷贝 javascript中一般有按值传递和按引用传递两种复制,按值传递的是基本数据类型(Number,String,Boolean,Null,Undefined),一般存放于内存 ...