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

算法名称: k近邻算法 (kNN: k-Nearest Neighbor)

问题提出: 根据已有对象的归类数据,给新对象(事物)归类。

核心思想:

  1. 将对象分解为特征,因为对象的特征决定了事对象的分类。
  2. 度量每个特征的程度,将其数字化。
  3. 所有特征值构成元组,作为该对象的坐标。
  4. 计算待检测对象和所有已知对象的距离,选择距离最接近的k个已知对象 (k近邻中的k来源于此)。
  5. 这k个对象中出现次数最多的分类就是待检测对象的分类。

重要前提: 需要有一批已经正确归类了的对象存在。也就是通常说的训练数据。

重要优势:

  1. 精度高,
  2. 对训练数据中的异常值不敏感

重大缺陷:

  1. 计算量大,由于每次的运算结果都对以后的判定无帮助,所以每次判定都需要利用所有的数据重新计算。
  2. 存储量大,由于每次都要重新计算,所有需要一直带着训练数据。

现实范例: 给电影分类。

算法过程:

  1. 特征化:为简化问题,假设电影只有两个分类:爱情片和动作片。 那么我们可以将电影分解为两个特征:接吻和打斗.
  2. 特征数字化: 统计每部电影,包括待检测的电影,中接吻和打斗的次数,假设分别为x和y.
  3. 坐标化: 每部电影的接吻次数和达到次数就是该电影的坐标(x,y)
  4. 计算距离: dist=sqrt((x0-x1)**2+(y0-y1)**2)
  5. k近邻:选dist最小的k个
  6. 如果这k部电影中爱情片多,那么待检测电影就是爱情片,否则为动作片。

扩展范例: 手写识别

列出这个范例的原因是,乍一看,手写识别和对象归类没有关系。但是实际上是有关系的。为了简化问题,我们把范围缩小一点,变成手写识别数字。通过回答下面几个问题,就能知道如何套用kNN算法了。

  1. 已知对象和待检测对象是什么? 回答: 已知对象:系统中存储的预先采集到的手写输入内容,待检测对象:用户的每一次手写输入内容。
  2. 输入内容具体是什么? 如何特征化? 回答: 将输入面看做一个二维矩阵,笔迹扫过的地方是1,其它地方是0。这个矩阵得有大小,可以自己确定,比如32*64, 64*128等. 特征就是这个矩阵中的所有位置。也就是说,这个矩阵包含多少个点,就算有多少个特征。
  3. 每个特征的值是什么? 既然特征表示的是矩阵中特定位置的点,那么特征的值就是这个位置的矩阵元素,为0或者为1
  4. 如何构成坐标? 回答:将矩阵所有行按顺序连接起来,构成一个巨长的行,这就是对象的坐标

扩展思维:

  1. 特征权重化,算法的核心过程,没有考虑特征的重要程度。

更多信息,请参考:https://en.wikipedia.org/wiki/K-nearest_neighbors_algorithm

时间: 2024-08-02 15:14:06

机器学习随笔01 - 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值:先确定

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获得数据的均

从K近邻算法、距离度量谈到KD树、SIFT+BBF算法

从K近邻算法.距离度量谈到KD树.SIFT+BBF算法 从K近邻算法.距离度量谈到KD树.SIFT+BBF算法 前言 前两日,在微博上说:“到今天为止,我至少亏欠了3篇文章待写:1.KD树:2.神经网络:3.编程艺术第28章.你看到,blog内的文章与你于别处所见的任何都不同.于是,等啊等,等一台电脑,只好等待..”.得益于田,借了我一台电脑(借他电脑的时候,我连表示感谢,他说“能找到工作全靠你的博客,这点儿小忙还说,不地道”,有的时候,稍许感受到受人信任也是一种压力,愿我不辜负大家对我的信任)