机器学习实战(一)k-近邻算法

  转载请注明源出处:http://www.cnblogs.com/lighten/p/7593656.html

1.原理

  本章介绍机器学习实战的第一个算法——k近邻算法(k Nearest Neighbor),也称为kNN。说到机器学习,一般都认为是很复杂,很高深的内容,但实际上其学习门栏并不算高,具备基本的高等数学知识(包括线性代数,概率论)就可以了,甚至一些算法高中生就能够理解了。kNN算法就是一个原理很好理解的算法,不需要多好的数学功底,这是一个分类算法(另一个大类是回归),属于监督学习的范畴(还有非监督学习,监督学习需要注有标记的训练集)。

  首先,分类顾名思义就是给同一种事物分成不同的种类,比如人分成男人、女人,书分为工具书,教科书,漫画书等。要对一个事物分类,要有分类的依据,即你为什么这样划分,有时候划分的依据十分准确比如男女按性别,但很多时候是由多个因素来决定划分到哪一个类别,而不同的分类某一单一的因素又可能存在交集,这些因素在机器学习中被称之为特征,特征的选择对算法的准确率也是有影响的。个体用一组特征数据来进行描述,这样计算机处理就成了可能,分类算法所要做的就是判断这个个体所给出的特征属于哪一个类别。方法有很多,kNN采取了一个最简单的方法来判断:判断其与已知分类的训练集数据的差异,差异最小的前k个训练集个体大部分处于哪个分类该输入个体就被认作是哪个分类

  这个原理很好理解,比如判断男女,特征只有身高,体重。通常来说男人都比女人要高和重,即便女人要高,体重也比同等级的男人大部分会轻。所以对于一个输入个体来说,在已知身高、体重的情况下,求其与训练集样本的身高、体重差异,找到训练集中差异最小的k个个体,这k个个体如果大部分是男人,则输入样本就是男人,否则则是女人。选择差异最小的k个个体也就是为了避免小部分不同寻常的样本,因为男人都比女人要高和重也只是大部分情况,这样选择k个的权重,可信度就较高了。差异计算一般采用欧式距离,即各个特征相减,求平方和,开根号:

  

  上图就是差异的定义了,这样挑选出K个最小的训练集,已知这些训练集的分类,选择K个训练集大部分所属的分类就是新输入个体的分类了。

2.问题及优缺点

  kNN算法的原理简单易懂,但是在实现过程中也是有些问题需要解决的。首先我们需要关注d的计算,kNN选择的是d最小的k个训练集个体,所以d的结果合理性是很重要的。但是由该公式可以很明显的看出,d的大小很可能受到某一单一的特征影响。试想一下如果X的取值范围在1~10,Y的取值范围在1000~10000,那么d的大小严重受到Y特征的影响,那么X的作用就几乎没有了。解决该问题的方法就是将数值归一化,意思就是不管X还是Y,按照合理的放缩方法,使他们落在同一个范围区间,一般就选择0~1之间了。这个放缩方法也并不难得出,公式如下:

  优点:精度高,对异常值不敏感,无数据输入假定

  缺点:计算复杂度高、空间复杂度高

  从kNN的实现上也能看出来,其计算代价较高,每个个体都需要和所有的训练集个体进行比较,而且kNN算法无法获得指定分类的一般性特征,因此其不适合大量的训练集。

3.代码

  下面代码出自《机器学习实战》一书,原书中所有代码例子可以在网站:这里。进行下载。

def classify0(inX, dataSet, labels, k):
    dataSetSize = dataSet.shape[0]
    diffMat = tile(inX, (dataSetSize,1)) - dataSet
    sqDiffMat = diffMat**2
    sqDistances = sqDiffMat.sum(axis=1)
    distances = sqDistances**0.5
    sortedDistIndicies = distances.argsort()
    classCount={}
    for i in range(k):
        voteIlabel = labels[sortedDistIndicies[i]]
        classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
    sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)
    return sortedClassCount[0][0]

def createDataSet():
    group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
    labels = [‘A‘,‘A‘,‘B‘,‘B‘]
    return group, labels 
时间: 2024-11-05 13:33:23

机器学习实战(一)k-近邻算法的相关文章

机器学习实战笔记-K近邻算法1(分类动作片与爱情片)

K近邻算法采用测量不同特征值之间的距离方法进行分类 K近邻算法特点: 优点:精度高.对异常值不敏感.无数据输入假定. 缺点:计算复杂度高.空间复杂度高. 适用数据范围:数值型和标称型. K近邻算法原理: 存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系.输人没有标签的新数据后,将新数据的每个特征与样本集中数据对应的 特征进行比较,然后算法提取样本集中特征最相似数据(最近 邻)的分类标签.一般来说,我们只选择样本数据集中前k个最

机器学习实战笔记-K近邻算法2(改进约会网站的配对效果)

案例二.:使用K-近邻算法改进约会网站的配对效果 案例分析: 海伦收集的数据集有三类特征,分别是每年获得的飞行常客里程数.玩视频游戏所耗时间百分比. 每周消费的冰淇淋公升数.我们需要将新数据的每个新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签.一般来说,我们只选择样本数据集中前k个最相似的数据,这就是k-近邻算法中k的出处,通常k是不大于20的整数.最后,选择k个最相似数据中出现次数最多的分类,作为新数据的分类. 流程:在约会网站上使用K

机器学习实战笔记--k近邻算法

1 #encoding:utf-8 2 from numpy import * 3 import operator 4 import matplotlib 5 import matplotlib.pyplot as plt 6 7 from os import listdir 8 9 def makePhoto(returnMat,classLabelVector): #创建散点图 10 fig = plt.figure() 11 ax = fig.add_subplot(111) #例如参数为

《机器学习实战》-k近邻算法

目录 K-近邻算法 k-近邻算法概述 解析和导入数据 使用 Python 导入数据 实施 kNN 分类算法 测试分类器 使用 k-近邻算法改进约会网站的配对效果 收集数据 准备数据:使用 Python 解析文本文件 分析数据:使用 Matplotlib 画二维散点图 准备数据:归一化数值 测试算法:验证分类器 使用算法:构建完整可用系统 手写识别系统 准备数据 测试算法 使用算法:构建完整可用系统 总结 K-近邻算法 k-近邻分类算法概述 使用 k-近邻算法改进约会网站的配对效果 手写识别系统

机器学习实战笔记-K近邻算法3(手写识别系统)

1 准备数据:将图像转换为测试向量 这次数据集还是有两种,训练数据集和测试数据集,分别有2000个,900个. 我们将把一个32*32的二进制图像矩阵转换为1 x 1024的向量,这样前两节使用的分类器就可以处理数字图像信息了. 代码: def img2vector(filename): returnVect = zeros((1,1024)) file = open(filename) for i in range(32): line = file.readline() for j in ra

《机器学习实战》——K近邻算法

原理: (1) 输入点A,输入已知分类的数据集data (2) 求A与数据集中每个点的距离,归一化,并排序,选择距离最近的前K个点 (3) K个点进行投票,票数最多的分类即为所求 优点: 简单,可用于非线性分类 缺点: 当样本不均衡时影响投票结果: 分类结果受K值影响: 时空复杂度高:需要保存全部数据O(N),每次取前k个都要与全部数据进行计算O(N),耗费内存大且计算量大 改进: 样本均衡化 太小的K值容易受噪音影响,大的K值减小噪音但会使分类边界模糊,最合适的方法是用交叉验证确定K值:先确定

机器学习随笔01 - k近邻算法

算法名称: k近邻算法 (kNN: k-Nearest Neighbor) 问题提出: 根据已有对象的归类数据,给新对象(事物)归类. 核心思想: 将对象分解为特征,因为对象的特征决定了事对象的分类. 度量每个特征的程度,将其数字化. 所有特征值构成元组,作为该对象的坐标. 计算待检测对象和所有已知对象的距离,选择距离最接近的k个已知对象 (k近邻中的k来源于此). 这k个对象中出现次数最多的分类就是待检测对象的分类. 重要前提: 需要有一批已经正确归类了的对象存在.也就是通常说的训练数据. 重

机器学习实战python3 K近邻(KNN)算法实现

台大机器技法跟基石都看完了,但是没有编程一直,现在打算结合周志华的<机器学习>,撸一遍机器学习实战, 原书是python2 的,但是本人感觉python3更好用一些,所以打算用python3 写一遍.python3 与python2 不同的地方会在程序中标出. 代码及数据:https://github.com/zle1992/MachineLearningInAction/tree/master/ch2 k-近邻算法优点:精度高.对异常值不敏感.无数据输入假定.缺点:计算复杂度高.空间复杂度高

web安全之机器学习入门——3.1 KNN/k近邻算法

目录 sklearn.neighbors.NearestNeighbors 参数/方法 基础用法 用于监督学习 检测异常操作(一) 检测异常操作(二) 检测rootkit 检测webshell sklearn.neighbors.NearestNeighbors 参数: 方法: 基础用法 print(__doc__) from sklearn.neighbors import NearestNeighbors import numpy as np X = np.array([[-1, -1],

机器学习(四) 机器学习(四) 分类算法--K近邻算法 KNN (下)

六.网格搜索与 K 邻近算法中更多的超参数 七.数据归一化 Feature Scaling 解决方案:将所有的数据映射到同一尺度 八.scikit-learn 中的 Scaler preprocessing.py import numpy as np class StandardScaler: def __init__(self): self.mean_ = None self.scale_ = None def fit(self, X): """根据训练数据集X获得数据的均