1. 基本原理
K最近邻(K-Nearest Neighbor,KNN)分类算法是最简单的机器学习算法之一,其基本思路与“近朱者赤,近墨者黑”的原理类似,当对未分类样本进行分类时,首先判断其与已分类样本之间的特征相似度,然后将其划分到大多数已分类样本所属类别之中。
已知训练样本集中每个样本对应的类别,当对新样本进行分类时,首先将新样本的特征与训练样本集中的样本特征进行比较,进而提取K个与其最相似(即在特征空间中最邻近)的已知类别的样本,然后将K个已知类别样本中包含样本数最多的类别标识分配给新样本。

2. 求解步骤
(1)计算新样本与所有已分类样本之间的特征距离(距离类型可为欧氏距离、曼哈顿距离等);
(2)按照递增次序对特征距离进行排序;
(3)选择K个特征距离最相近的已分类样本(值一般选择为奇数)。
(4)确定K个已分类样本所属类别出现的次数(投票法)。
(5)将K个已分类样本所属类别出现频率最高的类别作为新样本的预测分类。

对于k值的选择,是knn算法的重中之重

如图所示,如果k=3,圆球属于红色所示类别;而当k=5时圆球则属于蓝色所示类别。

3. 易出现的问题

问题1:数据不平衡时,如何解决?
当所属不同类别样本数量偏差较大时(即样本不平衡),易导致近邻算法失败。
例如:一个类的样本数量很大,而其他类样本数量很小,则新样本的K个近邻样本更可能属于样本数量较大的类别,因而会将其错分至样本数量较大的类别。
解决方法:距离权重。
为了提高对新样本分类的可靠性,通常需要在个已分类样本上的基础上附加相应的权重(如距离的倒数),已分类样本距离新样本越近,则为新样本分配已分类样本所属类别的权重越大。

问题2:采用什么距离?
特征空间中,两个实例点的距离是两个实例点的相似程度的反映。
K近邻算法通常采用曼哈顿距离、欧氏距离、马式距离等度量方式,其中,欧氏距离是最常用的距离计算公式,主要衡量多维空间中各个点之间的绝对距离;曼哈顿距离度量方式适用于路径的选择;马式距离适用于排除量纲并考虑特征之间的依存关系时的特征相似度度量。
在具体应用时,应当根据样本特征选择相应的距离度量,由不同的距离度量所确定的邻近样本是不同的。

问题3:特征取值之间的偏差?
在计算样本之间的相似性时,取值较大的特征可能会消减取值较小的特征对分类的影响。
如包含体重与身高的两特征向量:
X1=[80, 1.6]
X2=[60, 1.7]
在计算两者之间的相似度(如采用曼哈顿距离)时,
D(X1, X2)=|80-60|+|1.6-1.7|=20+0.1=20.1(约等于20)
由于体重特征取值较大,则取值较小的身高特征对分类的影响几乎可以忽略(实际上身高特征对分类影响可能很大)。

解决办法:将所有的数据映射同一尺度。
此问题的解决方法是将所有的样本映射同一尺度,即采用数据标准化(归一化)方法消除指标之间的量纲影响(不同评价指标往往具有不同的量纲和量纲单位,会影响到数据分析的结果)。
原始数据经过数据标准化处理后,各指标处于同一数量级,适合进行综合对比评价。

  • 归一化的方法
  1. 最小最大值归一化:通过对样本值进行线性变化,将结果值映射到[0,1]之间
    X = (X-Xmin)/(Xmax-Xmin)

  2. 调用sklearn库中的preprocessing 进行归一化

from sklearn import preprocessing
min_max_scaler = preprocessing.MinMaxScaler()
x = min_max_scaler.fit_transform(X) # X为需要归一化的数据集合  x为已归一化的结果

4. python中 scikit-learn库的使用

  • KNN库的导入方法如下:
    from sklearn.neighbors import KNeighborsClassifier
  • 主函数形式为:
    class sklearn.neighbors.KNeighborsClassifier(n_neighbors=5, weights=‘uniform’, p=2, metric=‘minkowski’)
  • 主要参数:
    n_neighbors:相邻样本的数量(默认值为 5)。
    weights(权重):用于预测的权重函数(默认为 ‘uniform’)。可选参数有‘uniform’(统一的权重,在每一个邻居区域里的点的权重都是一样的)、‘distance’(权重点等于他们距离的倒数。使用此函数,更近的邻居对于所预测的点的影响更大)。
    p:用于Minkowski 距离参数(默认值为 2);p = 1, 相当于使用曼哈顿距离;p = 2,相当于使用欧几里得距离。

5. 应用实例

构建一组训练数据(训练样本)对测试数据进行分类并绘图显示:
#训练样本(前4个为A类,后3个为B类)
x_train = np.array([[4, 5], [6, 7], [4.8, 7], [5.5, 8], [7, 8], [10, 11], [9, 14]])
y_train = [‘A’, ‘A’, ‘A’, ‘A’, ‘B’, ‘B’, ‘B’]
#测试样本(6个)
x_test = np.array([[3.5, 7], [9, 13], [8.7, 10], [5, 6], [7.5, 8], [9.5, 12]])

# 图表正确显示中文
from pylab import mpl
mpl.rcParams['font.sans-serif']=['SimHei']
mpl.rcParams['axes.unicode_minus']=Falseimport numpy as np
import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsClassifier#训练样本(前4个为A类,后3个为B类)
x_train = np.array([[4, 5], [6, 7], [4.8, 7], [5.5, 8], [7, 8], [10, 11], [9, 14]])
y_train = ['A', 'A', 'A', 'A', 'B', 'B', 'B']
#测试样本(6个)
x_test = np.array([[3.5, 7], [9, 13], [8.7, 10], [5, 6], [7.5, 8], [9.5, 12]])#KNN分类预测
knn = KNeighborsClassifier(n_neighbors=3,p=2)
knn.fit(x_train, y_train)
y_predict = knn.predict(x_test) #T=0/1
#显示结果
plt.xlabel('X'); plt.ylabel('Y'); plt.title('KNN')
plt.plot(x_train[0:4,0], x_train[0:4,1], color='red', marker='o', label='One Class (A)', linestyle='') #显示”A”类
plt.plot(x_train[4:8,0], x_train[4:8,1], color='blue', marker='s', label='Two Class (B)', linestyle='') #显示”B”类
for i in range(len(x_test)): #显示预测结果if y_predict[i] == 'A':plt.plot(x_test[i,0], x_test[i,1], color='green', marker='o')plt.text(x_test[i,0]-0.3, x_test[i,1]+0.3, str(i) + '->A')else:plt.plot(x_test[i,0], x_test[i,1], color='green', marker='s')plt.text(x_test[i,0]-0.3, x_test[i,1]+0.3, str(i) + '->B')
plt.legend(loc='upper left')
plt.grid(True)
plt.show()

机器学习之K近邻算法原理+应用实例相关推荐

  1. 机器学习:K近邻算法

    一.K-近邻算法简介 1 什么是K-近邻算法 根据你的"邻居"来推断出你的类别 1.1 K-近邻算法(KNN)概念 K Nearest Neighbor算法又叫KNN算法,这个算法 ...

  2. 统计学习方法笔记(一)-k近邻算法原理及python实现

    k近邻法 k近邻算法 算法原理 距离度量 距离度量python实现 k近邻算法实现 案例地址 k近邻算法 kkk近邻法(kkk-NN)是一种基本分类和回归方法. 算法原理 输入:训练集 T={(x1, ...

  3. 机器学习:k近邻算法(KNN)介绍

    k近邻算法是一种最简单最经典的机器学习算法之一.该算法的原理为:当对测试样本进行分类时,首先通过扫描训练样本集,找到与该测试样本最相似的k个训练样本,根据这个样本的类别进行投票确定测试样本的类别.也可 ...

  4. k近邻算法原理c语言,实验二 K-近邻算法及应用

    作业信息 一.[实验目的] 理解K-近邻算法原理,能实现算法K近邻算法: 掌握常见的距离度量方法: 掌握K近邻树实现算法: 针对特定应用场景及数据,能应用K近邻解决实际问题. 二.[实验内容] 实现曼 ...

  5. 机器学习:K近邻算法(K-NN)

    K近邻(K-Nearest Neighbor, KNN)是一种最经典和最简单的有监督学习方法之一,它非常有效而且易于掌握. 1 K近邻算法概述 一个样本与数据集中的k个样本最相似, 如果这k个样本中的 ...

  6. python机器学习---1. K近邻算法

    机器学习的方法是基于数据产生的"模型" (model) 的算法,也称"学习算法" (learning algorithm).包括有监督学习(supervised ...

  7. 机器学习之k近邻算法

    本文的代码基于书本<机器学习实战> 概念 k-近邻算法采用测量不同特征值之间距离的方法进行分类.工作原理是:存在一个样本数据集合,称作训练样本集,样本中每个数据都存在标签.输入没有标签的新 ...

  8. 【MATLAB】Parzen窗与K近邻算法原理与代码详解

    文章目录 1.非参数估计原理 2.Parzen窗 2.1.算法原理 2.2.Matlab实现与参数探究 3.K近邻 3.1.算法原理 3.2.Matlab实现与参数探究 1.非参数估计原理 \qqua ...

  9. 【机器学习】K近邻算法(K-NearestNeighbors , KNN)详解 + Java代码实现

    文章目录 一.KNN 基本介绍 二.KNN 核心思想 三.KNN 算法流程 四.KNN 优缺点 五.Java 代码实现 KNN 六.KNN 改进策略 一.KNN 基本介绍 邻近算法,或者说K最邻近(K ...

最新文章

  1. 关于Access数据库执行Update语句后,不报错,但影响行数总是返回0的问题
  2. go标准库的学习-time
  3. visual2019没有勾选的在如何加入_发票管理系统完成升级,勾选认证平台改头换面,你所有的问题都在这里!...
  4. 【转载】C++知识库内容精选 尽览所有核心技术点
  5. 【kafka】kafka 查看 GroupCoordinator 以及 kafka Group dead 消费组死掉 以及 GroupCoordinatorRequest 使用
  6. 百度地图出现网格,不显示地图
  7. mkfs 格式化分区并创建文件系统
  8. STM32串口调试一直打印 00 00
  9. 谷歌云服务器的ip是什么ip,看到有人在问谷歌云的IP段问题,我推荐几个自用觉得不错的...
  10. stm32f401 边沿捕获_stm32f401ret6例程 嵌入式1 STM32F401开发实战1—LED闪烁和串口收发数据 - 硬件设备 - 服务器之家...
  11. icloud与mysql_ICloud 应用实例(一)
  12. 2022年Java就业方向有哪些?
  13. 省市县地址联动插件distpicker 代码及示例
  14. 对接钉钉消息通知_接入钉钉API发送企业消息
  15. KeyError: 2
  16. GIT Enter passphrase for key 'xxx': 已解决
  17. Nothing is impossble_七夕小子_新浪博客
  18. 使用css3和h5实现幻灯片,点击切换图片效果
  19. 如何获取三维标签的轮廓表示
  20. Unable to load vocabulary from file. Please check that the provided vocabulary is accessible and not

热门文章

  1. 029-Swing实现简单计算器功能
  2. Mutisim 免费版下载配置教程(贸泽版)
  3. Transmission 下载完成后自动关机
  4. 钉钉低代码是什么,能干什么?
  5. springboot整合mybatis错误 Invalid bound statement (not found): com.yuan.mapper.UserMapper.getUserList
  6. 网络地址转换--静态NAT
  7. 网站移动端APP渗透测试安全检测方案
  8. badboy和jmeter的下载安装及使用
  9. 关于淘宝与Amazon的首页比较
  10. 谁的饭量大 c语言编程,c语言第一章第一节 认识变量(示例代码)