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邻近算法的更多相关文章

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

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

  2. 机器学习入门KNN近邻算法(一)

    1 机器学习处理流程: 2 机器学习分类: 有监督学习 主要用于决策支持,它利用有标识的历史数据进行训练,以实现对新数据的表示的预测 1 分类 分类计数预测的数据对象是离散的.如短信是否为垃圾短信,用 ...

  3. [机器学习] ——KNN K-最邻近算法

    KNN分类算法,是理论上比较成熟的方法,也是最简单的机器学习算法之一. 该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别 ...

  4. 【机器学习】机器学习入门01 - kNN算法

    0. 写在前面 近日加入了一个机器学习的学习小组,每周按照学习计划学习一个机器学习的小专题.笔者恰好近来计划深入学习Python,刚刚熟悉了其基本的语法知识(主要是与C系语言的差别),决定以此作为对P ...

  5. <机器学习实战>读书笔记--k邻近算法KNN

    k邻近算法的伪代码: 对未知类别属性的数据集中的每个点一次执行以下操作: (1)计算已知类别数据集中的点与当前点之间的距离: (2)按照距离递增次序排列 (3)选取与当前点距离最小的k个点 (4)确定 ...

  6. 最邻近算法(KNN)识别数字验证码

    应用场景   对于简单的数字型验证码的自动识别.前期已经完成的工作是通过切割将验证码图片切割成一个一个的单个数字的图片,并按照对应的数字表征类别进行分类(即哪些图片表示数字7,哪些表示8),将各种数字 ...

  7. k最邻近算法——使用kNN进行手写识别

    上篇文章中提到了使用pillow对手写文字进行预处理,本文介绍如何使用kNN算法对文字进行识别. 基本概念 k最邻近算法(k-Nearest Neighbor, KNN),是机器学习分类算法中最简单的 ...

  8. 机器学习---K最近邻(k-Nearest Neighbour,KNN)分类算法

    K最近邻(k-Nearest Neighbour,KNN)分类算法 1.K最近邻(k-Nearest Neighbour,KNN) K最近邻(k-Nearest Neighbour,KNN)分类算法, ...

  9. 机器学习:K-近邻算法(KNN)

    机器学习:K-近邻算法(KNN) 一.KNN算法概述 KNN作为一种有监督分类算法,是最简单的机器学习算法之一,顾名思义,其算法主体思想就是根据距离相近的邻居类别,来判定自己的所属类别.算法的前提是需 ...

  10. 机器学习算法及代码实现–K邻近算法

    机器学习算法及代码实现–K邻近算法 1.K邻近算法 将标注好类别的训练样本映射到X(选取的特征数)维的坐标系之中,同样将测试样本映射到X维的坐标系之中,选取距离该测试样本欧氏距离(两点间距离公式)最近 ...

随机推荐

  1. Kali Linux下安装VMware Tools

    引言 Kali Linux是基于Debian的Linux发行版, 设计用于数字取证和渗透測试.安装Kali Linux非常easy,可是安装VMware Tools的过程就有点麻烦了,由于在安装中途会 ...

  2. gridview-selector的设置

    其实它是跟listview相似的,如果你看下它跟listview的继承关系,就很容易理解了 public class GridView extends AbsListView { /** * Disa ...

  3. PHP中字符串比较的常用方法

    PHP中字符串比较的常用方法 一.总结 1.其实应该是直接等于号就可以了的 2.也可用strcmp,注意返回值 二.PHP中字符串比较的常用方法 1.按字节比较 按字节比较字符串是最常用的方法.其中可 ...

  4. HML5

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  5. 【代码】Django学习笔记

    一些设置setting.py DEBUG = True ALLOWED_HOSTS = ['*'] DATABASES = { 'default': { 'ENGINE': 'django.db.ba ...

  6. echarts统计图踩坑合集

    1:折线图条的颜色修改 series : [ { name : 'SBP(收缩压)', type : 'line', itemStyle : { normal : { lineStyle:{ colo ...

  7. js课程 6-15 js简单弹力球如何实现

    js课程 6-15 js简单弹力球如何实现 一.总结 一句话总结:a.通过document的documentElement属性获取可是区域的高: b.通过增值变为负的实现到底部后反弹 1.docume ...

  8. 【Codeforces Round #431 (Div. 2) B】 Tell Your World

    [链接]点击打开链接 [题意] n个点,x从左到右严格递增的顺序给出 让你划两条平行的,且没有相同点的直线; 使得它们俩各自最少穿过一个点. 且它们俩穿过了所有的点. [题解] 枚举第一个点和哪个点组 ...

  9. STL_算法_删除(unique、unique_copy)

    C++ Primer 学习中. . . 简单记录下我的学习过程 (代码为主) 全部容器适用 unique(b,e) unique(b,e,p) unique_copy(b1,e1,b2) unique ...

  10. [Android 性能优化系列]内存之提升篇--应用应该怎样管理内存

    大家假设喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处(http://blog.csdn.net/kifile),再次感谢 原文地 ...