数据挖掘-K-近邻算法

1. K-近邻算法概述

1.1 K-近邻算法介绍

1.1.1 KNN算法作用

  • KNN(K-Nearest Neighbor)最邻近分类算法是数据挖掘分类(classification)技术中最简单的算法之一,其指导思想是”近朱者赤,近墨者黑“,即由你的邻居来推断出你的类别

1.1.2 KNN 算法思想

(1)思想

  • 为了判断未知样本的类别,以所有已知类别的样本作为参照,计算未知样本与所有已知样本的距离,从中选取与未知样本距离最近的K个已知样本,根据少数服从多数的投票法则(majority-voting),将未知样本与K个最邻近样本中所属类别占比较多的归为一类
  • KNN在做回归和分类的主要区别,在于最后做预测时候的决策不同
    • 在分类预测时,一般采用多数表决法,即选取的k个邻居中占多数的类
    • 在做回归预测时,一般使用平均值法,即选取的k个邻居中的数值平均值

(2)例

  • 如下图所示,如何判断绿色圆应该属于哪一类,是属于红色三角形还是属于蓝色四方形?

    • 如果K=3,由于红色三角形所占比例为2/3,绿色圆将被判定为属于红色三角形那个类
    • 如果K=5,由于蓝色四方形比例为3/5,因此绿色圆将被判定为属于蓝色四方形类

1.1.3 KNN算法特点

  • 由于KNN最邻近分类算法在分类决策时只依据最邻近的一个或者几个样本的类别来决定待分类样本所属的类别,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合

  • KNN算法即可以应用于分类算法中,也可以应用于回归算法中。

  • KNN算法的准确性很大程度上依赖于K值的选择


1.2 KNN算法涉及的问题

1.2.1 K值的选择

(1)为什么选择K值

  • KNN算法的准确性很大程度上依赖于K值的选择,要选取合适的K值使得算法最终的结果准确性最高

(2)K值的选择过程

  • 选一个较小的值,然后通过交叉验证选择一个合适的最终值。

    • k越小,即使用较小的领域中的样本进行预测,训练误差会减小,但模型会很复杂,以至于过拟合。
    • k越大,即使用交大的领域中的样本进行预测,训练误差会增大,模型会变得简单,容易导致欠拟合。

1.2.2 距离的度量

(1)欧几里得距离

  • 使用欧几里得距离:欧几里得度量(euclidean metric)(也称欧氏距离)是一个通常采用的距离定义,指在m维空间中两个点之间的真实距离,或者向量的自然长度(即该点到原点的距离)

    • 在二维和三维空间中的欧氏距离就是两点之间的实际距离
    • 对于n维空间l两点,\(X(x_1,x_2,...x_n),Y(y_1,y_2,...,y_n)\),两者欧几里得距离:

    \(d(X,Y)=\sqrt{(x_1-y_1)^2+(x_2-y_2)^2+...+(x_n-y_n)^2}=\sqrt{\sum_{i=1}^n{(x_i-y_i)^2}}\)

(2)曼哈顿距离

  • 定义曼哈顿距离的正式意义为L1-距离或城市区块距离,也就是在欧几里德空间的固定直角坐标系上两点所形成的线段对轴产生的投影的距离总和。

    • 例如在平面上,坐标X(x1,x2)的与坐标Y(y1,y2)的曼哈顿距离为:

      \(d(X,Y)=|x_1-y_1|+|x_2-y_2|\)

曼哈顿距离-百度百科

1.2.3 加权KNN算法

(1)KNN算法的不足

  • KNN算法在分类时有个主要的不足是,当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时:

    • 该样本的K个邻居中大容量类的样本占多数,如下图所示。该算法只计算最近的邻居样本,某一类的样本数量很大,那么或者这类样本并不接近目标样本,或者这类样本很靠近目标样本。无论怎样,数量并不能影响运行结果。可以采用权值的方法(和该样本距离小的邻居权值大)来改进

(2)加权方式

  • 反函数

    • 该方法最简单的形式是返回距离的倒数,比如距离d,权重1/d。有时候,完全一样或非常接近的商品权重会很大甚至无穷大。基于这样的原因,在距离求倒数时,在距离上加一个常量:\(weight = \frac{1}{distance + const}\)
    • 这种方法的潜在问题是,它为近邻分配很大的权重,稍远一点的会衰减的很快。虽然这种情况是我们希望的,但有时候也会使算法对噪声数据变得更加敏感
  • 高斯函数
    • \(f(x)=ae^N\),\(N=-\frac{(x-b)^2}{2c^2},a,b,c∈R\)
    • 高斯函数在距离为0的时候权重为1,随着距离增大,权重减少,但不会变为0

(3)具体算法

  • 在处理离散型数据时,将这k个数据用权重区别对待,预测结果与第n个数据的label相同的概率:

    • \(P_n=\frac{W_n}{\sum_{i=1}^kW_i}\)
    • 例:设有共选取5个最近点,A(1),B(2),C(2),D(2),E(3)(后面为距离,AB属于类1,CDE属于类2),为求简单,设权重为距离的倒数,\(\sum_{i=1}^kW_i=\frac{17}{6}\),得各权重WA(\(\frac{17}{6}\)),WB(\(\frac{17}{12}\)),WC(\(\frac{17}{12}\)),WD(\(\frac{17}{12}\)),WE(\(\frac{17}{18}\)),则1类的总权重为\(W_1 = \frac{17}{4}=4.25\),\(W_2=\frac{73}{18}=4.0555\),得该点属于1类
  • 在处理数值型数据时,并不是对这k个数据简单的求平均,而是加权平均:通过将每一项的距离值\(D_i\)乘以对应权重\(W_i\),然后将结果累加。求出总和后,在对其除以所有权重之和,
    • 对于k个点 i类 点的预测结果:
    • \(f(x) = \frac{\sum_{i=1}^kD_iW_i}{\sum_{i=1}^kW_i}\)
  • 每预测一个新样本的所属类别时,都会对整体样本进行遍历,可以看出kNN的效率实际上是十分低下的

加权KNN算法 参考


1.3 KNN算法实现

1.3.1 算法步骤

  1. 计算测试数据与各个训练数据之间的距离

  2. 按照距离的递增关系进行排序

  3. 选取距离最小的K个点

  4. 确定前K个点所在类别的出现频率

  5. 返回前K个点中出现频率最高的类别作为测试数据的预测分类


1.4 Python 实现KNN算法

1.4.1 sklearn包使用

  • 调用sklearn包实例:
from sklearn.datasets import load_iris
from sklearn.model_selection import cross_val_score
import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsClassifier #读取鸢尾花数据集
iris = load_iris()
x = iris.data
y = iris.target
k_range = range(1, 31)
k_error = []
#循环,取k=1到k=31,查看误差效果
for k in k_range:
knn = KNeighborsClassifier(n_neighbors=k)
#cv参数决定数据集划分比例,这里是按照5:1划分训练集和测试集
scores = cross_val_score(knn, x, y, cv=6, scoring='accuracy')
k_error.append(1 - scores.mean()) #画图,x轴为k值,y值为误差值
plt.plot(k_range, k_error)
plt.xlabel('Value of K for KNN')
plt.ylabel('Error')
plt.show()

sklearn执行KNN算法

数据挖掘-K-近邻算法的更多相关文章

  1. 数据挖掘算法(一)--K近邻算法 (KNN)

    数据挖掘算法学习笔记汇总 数据挖掘算法(一)–K近邻算法 (KNN) 数据挖掘算法(二)–决策树 数据挖掘算法(三)–logistic回归 算法简介 KNN算法的训练样本是多维特征空间向量,其中每个训 ...

  2. 数据挖掘入门系列教程(三)之scikit-learn框架基本使用(以K近邻算法为例)

    数据挖掘入门系列教程(三)之scikit-learn框架基本使用(以K近邻算法为例) 简介 scikit-learn 估计器 加载数据集 进行fit训练 设置参数 预处理 流水线 结尾 数据挖掘入门系 ...

  3. 从K近邻算法谈到KD树、SIFT+BBF算法

    转自 http://blog.csdn.net/v_july_v/article/details/8203674 ,感谢july的辛勤劳动 前言 前两日,在微博上说:“到今天为止,我至少亏欠了3篇文章 ...

  4. <转>从K近邻算法、距离度量谈到KD树、SIFT+BBF算法

    转自 http://blog.csdn.net/likika2012/article/details/39619687 前两日,在微博上说:“到今天为止,我至少亏欠了3篇文章待写:1.KD树:2.神经 ...

  5. 用Python从零开始实现K近邻算法

    KNN算法的定义: KNN通过测量不同样本的特征值之间的距离进行分类.它的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别.K通 ...

  6. Python3入门机器学习 - k近邻算法

    邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一.所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代 ...

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

    转载自:http://blog.csdn.net/v_july_v/article/details/8203674/ 从K近邻算法.距离度量谈到KD树.SIFT+BBF算法 前言 前两日,在微博上说: ...

  8. 【机器学习】k近邻算法(kNN)

    一.写在前面 本系列是对之前机器学习笔记的一个总结,这里只针对最基础的经典机器学习算法,对其本身的要点进行笔记总结,具体到算法的详细过程可以参见其他参考资料和书籍,这里顺便推荐一下Machine Le ...

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

    #encoding:utf-8 from numpy import * import operator import matplotlib import matplotlib.pyplot as pl ...

  10. k近邻算法的Java实现

    k近邻算法是机器学习算法中最简单的算法之一,工作原理是:存在一个样本数据集合,即训练样本集,并且样本集中的每个数据都存在标签,即我们知道样本集中每一数据和所属分类的对应关系.输入没有标签的新数据之后, ...

随机推荐

  1. Spring源码阅读笔记05:自定义xml标签解析

    在上篇文章中,提到了在Spring中存在默认标签与自定义标签两种,并且详细分析了默认标签的解析,本文就来分析自定义标签的解析,像Spring中的AOP就是通过自定义标签来进行配置的,这里也是为后面学习 ...

  2. EF6.0 下sql语句自动生成的参数类型decimal(18,2)修改

    很多时候我们需要对插入到数据库的数据的精度做一个控制,例如sql server下保留6位小数使用numeric(10,6) .而到c#里对应的数据类型就是decimal ,但是使用EF6.0的crea ...

  3. MATLAB神经网络(4) 神经网络遗传算法函数极值寻优——非线性函数极值寻优

    4.1 案例背景 \[y = {x_1}^2 + {x_2}^2\] 4.2 模型建立 神经网络训练拟合根据寻优函数的特点构建合适的BP神经网络,用非线性函数的输入输出数据训练BP神经网络,训练后的B ...

  4. 029.核心组件-Controller Manager

    一 Controller Manager原理 1.1 Controller Manager概述 一般来说,智能系统和自动系统通常会通过一个"控制系统"来不断修正系统的工作状态.在K ...

  5. 033.Kubernetes集群安全-API Server认证及授权

    一 Kubernetes集群安全 1.1 安全机制 Kubernetes通过一系列机制来实现集群的安全控制,其中包括API Server的认证授权.准入控制机制及保护敏感信息的Secret机制等.集群 ...

  6. 浅谈 HTTP中Get与Post的区别

    浅谈 HTTP中Get与Post的区别 存在的误区 有人说 HTTP 协议下的 Get 请求参数长度是有大小限制的,最大不能超过XX,而 Post 是无限制的,看到这里,我想他们定是看多了一些以讹传讹 ...

  7. 阅读GitHub源码的正确打开方式

    前言 近来发现阅读开源项目上手就整最新的代码不合适,缺少项目迭代的具体实现过程,想着若是可以看到针对问题的提交代码就好了,所以就有了本篇博客. 以文主要涉及:如何fork开源项目,如何保证本地仓库代码 ...

  8. MySQL语句-关于表单的操作总结(新手)

    MySQl表的操作: 主键的添加: CREATE TABLE 表名(列名称 数据类型--id INT PRIMARY KEY AUTO_INCREMENT,列名称2 数据类型,············ ...

  9. Map-->HashMap练习(新手)

    //导入的包.import java.util.*;//创建的一个类.public class zylx1 { //公共静态的主方法. public static void main(String[] ...

  10. 云CRM和本地CRM哪个更好

    现在CRM系统按照服务器部署方式的不同分为本地CRM和云CRM两种,本地CRM需要在企业内部部署服务器,而云CRM的服务器则是安装在云服务器上面,很多企业可能不知道应该选择云CRM还是本地CRM.下面 ...