一、算法概述

K-近邻算法(k-Nearest Neighbor,KNN)是机器学习算法中最简单最容易理解的算法。该算法的思路是:给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例, 这K个实例的多数属于某个类,就把该输入实例分类到这个类中。一般K不大于20。

优点:精度高、对异常值不敏感、无数据输入假定
缺点:计算复杂度高、空间复杂度高
适用数据范围:数值型和标称型

二、 距离

  1. 欧式距离(Euclidean Distance)
    d(x,y)=∑i=1n(xi−yi)2d(x,y) = \sqrt{\sum_{i=1}^{n} {(x_i-y_i)^2}}d(x,y)=i=1∑n​(xi​−yi​)2​
  2. 曼哈顿距离(Manhattan Distance)
    d(x,y)=∑i=1n∣xi−yi∣d(x,y) = \sum_{i=1}^{n} {|x_i-y_i|}d(x,y)=i=1∑n​∣xi​−yi​∣
  3. 余弦距离(Cosine Distance)
    cos⁡(θ)=x⃗⋅y⃗∣∣x∣∣⋅∣∣y∣∣\cos(\theta)=\frac {\vec{x}\cdot\vec{y}} {||x||\cdot||y||}cos(θ)=∣∣x∣∣⋅∣∣y∣∣x⋅y​​
  4. 杰卡德距离(Jaccard Distance)
    J(A,B)=∣A⋂B∣∣A⋃B∣J(A,B)=\frac {|A\bigcap B|} {|A\bigcup B|}J(A,B)=∣A⋃B∣∣A⋂B∣​

三、搜索近邻点的方法

1.暴力搜寻

计算所有已知样本与未知样本的距离,选出最近的K个样本进行投票。

2.KD树

构造KD树:
(1)计算训练集每个变量的方差,将最大方差的变量x作根节点的字段选择。
(2)按变量x对训练集做升序排序,以变量x的中位数为分割点划分为两个子节点,分割点保留在根节点中。
(3)重复(1)、(2)直到满足停止生产的条件为止。
KD树搜寻:
(1)测试集的数据点从某一节点开始,与划分当前节点的变量数据进行比较判断流入哪一侧子节点,直到落入对应的叶节点中。
(2)以测试集的数据点为中心,以叶节点中训练集数据点的最近距离为半径构成球体(该最近距离的点为临时近邻点),如果球体与上一层的父节点构成的分割线相交,则需要从父节点的另一侧叶节点重新搜寻近邻点,如果比刚才的临时近邻点距离更近,则更新临时近邻点。
(3)重复(2)直到找到最终的近邻点。

3.球树

构造球树:
(1)以训练集中距离最远的两个数据点的中间位置为球心构造一个超球体,则该超球体是包含所有训练集样本点的最小球体。
(2)从超球体中寻找离圆心最远的点p1,再寻找离p1最远的点p2,分别以这两个点为球心通过距离计算构造两个最小的超球体,将剩余的点划分到这两个超球体中。
(3)重复(1)、(2)直到球体无法继续划分为止。
球树搜寻:
(1)从最大或者最小的超球体开始,寻找测试集数据点落入的超球体。
(2)计算测试集数据点到所在超球体中最近点的距离d,计算测试集数据点与所在超球体成对的另一个超球体球心的距离D。如果D<d+r(对应的另一个超球体的半径),则需要回到上一层父节点对应的超球体搜寻近邻点。
(3)重复(2)直到找到最终的近邻点。

暴力搜寻简单易懂,但只适合小样本。KD树和球树虽然增加了计算复杂度,但是能在数据量较大时避免全局搜寻,提高效率。

四、K值的选择

K值太小,则模型复杂度较高,容易发生过拟合;K值太大,则会使得分类结果趋向众数的类别,从而导致分类失败。实际运用中通常采用交叉验证法来来选取最优的K值。

五、代码实现

首先是要用到的几个函数的官方文档说明。
1.

sklearn.model_selection.train_test_split(*arrays, **options)

sklearn.model_selection.cross_val_score(estimator, X, y=None, groups=None, scoring=None, cv=’warn’, n_jobs=None, verbose=0, fit_params=None, pre_dispatch=‘2*n_jobs’, error_score=’raise-deprecating’)

(1)sklearn.neighbors.KNeighborsClassifier(n_neighbors=5, weights=’uniform’, algorithm=’auto’, leaf_size=30, p=2, metric=’minkowski’, metric_params=None, n_jobs=None, **kwargs)
(2)sklearn.neighbors.KNeighborsRegressor(n_neighbors=5, weights=’uniform’, algorithm=’auto’, leaf_size=30, p=2, metric=’minkowski’, metric_params=None, n_jobs=None, **kwargs)

接下来是代码。

1.分类

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn import model_selection
from sklearn import neighbors
from sklearn import metricsdata=pd.read_excel(r'C:\Users\sc\Desktop\data.xlsx')
#拆分为训练集和测试集
predictors=['pre1','pre2','pre3','pre4','pre5']
classification=['class']
x_train,x_test,y_train,y_test=model_selection.train_test_split(data[predictors], data[classification],test_size=0.25,random_state=1234)
#设置k值集合
K=np.arange(1,int(np.ceil(np.log2(data.shape[0]))))
#存储不同k值的平均准确率
accuracy=[]
for k in K:#使用10折交叉验证的方法,比对每一k值下KNN模型的预测准确率cv_result=model_selection.cross_val_score(neighbors.KNeighborsClassifier(n_neighbors=k,
weights='distance'),x_train,y_train,cv=10,scoring='accuracy')accuracy.append(cv_result.mean())#查询最大平均准确率的下标
arg_max=np.array(accuracy).argmax()
#绘制折线图
plt.rcParams['font.sans-serif']=['Microsoft YaHei'] #中文和负号正常显示
plt.rcParams['axes.unicode_minus']=False
plt.plot(K,accuracy) #折线图
plt.scatter(K,accuracy) #散点图
plt.text(K[arg_max],accuracy[arg_max],'最佳k值为%s' % int(K[arg_max]))
plt.show() #显示图形#以最佳K值构建模型
knn_class=neighbors.KNeighborsClassifier(n_neighbors=int(K[arg_max]),weights='distance')
knn_class.fit(x_train,y_train)
predict=knn_class.predict(x_test)#模型评估
print('Confusion Matrix:\n',pd.crosstab(y_test,predict)) #构建混淆矩阵
print('Overall Accuracy:',metrics.scorer.accuracy_score(y_test,predict)) #整体准确率
print('Assessment Report:\n',metrics.classification_report(y_test,predict)) #模型评估报告



从混淆矩阵来看,主要还是集中在主对角线,说明预测正确的占多数;而整体预测准确率为91%;从模型评估报告来看,第一列表示预测精度(预测正确的类别个数/该类别预测的所有个数),第二列表示预测覆盖率(预测正确的类别个数/该类别实际的所有个数),第三列是前两列的加权结果,第四列是类别实际的样本个数。

2.预测

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn import model_selection
from sklearn import neighbors
from sklearn import metrics
from sklearn.preprocessing import minmax_scaledata=pd.read_excel(r'C:\Users\sc\Desktop\data.xlsx')
#数据归一化,消除量纲影响
predictors=data.columns[:-1]
X=minmax_scale(data[predictors])
#拆分为训练集和测试集
x_train,x_test,y_train,y_test=model_selection.train_test_split(X, data.classify,test_size=0.25,random_state=1234)#设置k值集合
K=np.arange(1,int(np.ceil(np.log2(data.shape[0]))))
#存储不同k值的平均MSE
mse=[]
for k in K:#使用10折交叉验证的方法,比对每一k值下KNN模型的MSEcv_result=model_selection.cross_val_score(neighbors.KNeighborsRegressor(n_neighbors=k,
weights='distance'),x_train,y_train,cv=10,scoring='neg_mean_squared_error')mse.append((-1*cv_result).mean()) #将负数转换为正数
#查询最小均方误差的下标
arg_min=np.array(mse).argmin()#绘制折线图
plt.rcParams['font.sans-serif']=['Microsoft YaHei'] #中文和负号正常显示
plt.rcParams['axes.unicode_minus']=False
plt.plot(K,mse) #折线图
plt.scatter(K,mse) #散点图
plt.text(K[arg_min],mse[arg_min],'最佳k值为%s' % int(K[arg_min]))
plt.show() #显示图形#以最佳K值构建模型
knn_reg=neighbors.KNeighborsRegressor(n_neighbors=int(K[arg_min]),weights='distance')
knn_reg.fit(x_train,y_train)
predict=knn_reg.predict(x_test)#模型评估
print('MSE:',metrics.mean_squared_error(y_test,predict)) #均方误差越小越好

参考文献:
[1]scikit-learn官方文档:http://scikit-learn.org/stable/index.html
[2]Peter Harrington.《机器学习实战》.人民邮电出版社,2013-6
[3]刘顺祥.《从零开始学Python数据分析与挖掘》.清华大学出版社,2018

机器学习十大经典算法之K-近邻算法(学习笔记整理)相关推荐

  1. 机器学习十大经典算法之岭回归和LASSO回归

    机器学习十大经典算法之岭回归和LASSO回归(学习笔记整理:https://blog.csdn.net/weixin_43374551/article/details/83688913

  2. 机器学习十大经典算法:深入浅出聊贝叶斯决策(贝叶斯公式,最小风险贝叶斯,最小错误贝叶斯)

    前言    常听人说,在学习一个东西时,如果能够深入浅出的讲给别人听,才算是真的懂了.最近正好在学模式识别,于是就用它来练笔了.贝叶斯决策(Bayes Decision) 是十大经典机器学习算法之一, ...

  3. pagerank数据集_机器学习十大经典算法-PageRank(附实践代码)

    Yo, yo, check it out. 保证看完不晕倒... 如果公式让你脑瓜疼,请忽略公式,或者忽略脑瓜. Kagging咖金:推荐系统之关联规则(附实践代码)​zhuanlan.zhihu.c ...

  4. 机器学习十大经典算法

    本文介绍了机器学习新手需要了解的 10 大算法,包括线性回归.Logistic 回归.朴素贝叶斯.K 近邻算法等. 在机器学习中,有一种叫做「没有免费的午餐」的定理.简而言之,它指出没有任何一种算法对 ...

  5. chapter2 机器学习之KNN(k-nearest neighbor algorithm)--K近邻算法从原理到实现

    一.引入 K近邻算法作为数据挖掘十大经典算法之一,其算法思想可谓是intuitive,就是从训练集里找离预测点最近的K个样本来预测分类 因为算法思想简单,你可以用很多方法实现它,这时效率就是我们需要慎 ...

  6. k近邻算法_机器学习分类算法之k近邻算法

    本编文章将介绍机器学习入门算法-k近邻算法,将会用demo演示机器学习分类算法. 在先介绍算法时,先回顾分类和回归的区别.像文章分类识别也是这样处理的,如1代表体育,2代表科技,3代表娱乐属于分类问题 ...

  7. 机器学习算法基础——k近邻算法

    23.k-近邻算法以及案例预测入住位置 24.K-近邻算法案例 分类算法-k近邻算法(KNN) 定义:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本 ...

  8. 机器学习十大经典算法之决策树

    机器学习经典十大算法 机器学习/人工智能的子领域在过去几年越来越受欢迎.目前大数据在科技行业已经炙手可热,而基于大量数据来进行预测或者得出建议的机器学习无疑是非常强大的.一些最常见的机器学习例子,比如 ...

  9. 机器学习十大经典算法之AdaBoost

    集成学习Boosting 集成学习大致可分为两大类:Bagging和Boosting.Bagging一般使用强学习器,其个体学习器之间不存在强依赖关系,容易并行.Boosting则使用弱分类器,其个体 ...

最新文章

  1. 私有云管理-Windows Azure Pack
  2. 服务器市场严酷竞争下的众生相
  3. jittor和pytorch 生成网络对比之clustergan
  4. pymysql.err.InterfaceError: (0, '')
  5. C# 并行任务——Parallel类
  6. LVM--逻辑卷管理
  7. GPIO应用开发方法【ZT】
  8. 编译c语言源程序得到的目标文件可以直接在dos环境中运行,c语言练习题一.doc
  9. C++语言基础 例程 命名空间要解决的问题
  10. Vegas系列Movie Studio录制音频/乐的方法
  11. [转]asp.net中打印ReportViewer报表
  12. Win虚拟机查询不到自己的IP地址
  13. 数字信号处理基础知识
  14. java word 添加图片_java – 在word文档中插入图片
  15. 如此详细的尾灯模组方案,不看看吗?
  16. Java内存区域与Java内存模型
  17. 拉普拉斯变换卷积法处理非齐次线性微分方程通解
  18. 2021年度中国科学之十大进展
  19. 在你转角看不到的温柔
  20. qlabel显示两行_QLabel 类(老九学堂C++会员友情翻译,不喜勿喷)

热门文章

  1. CSDN又被挂马了?
  2. 聚焦降本增效,用户满意度成达内教育增长“晴雨表”
  3. Python入门介绍
  4. 京东软件测试岗:惨不忍睹的三面,幸好做足了准备,月薪17k,已拿offer
  5. python自动点赞软件_python3 爬虫学习:自动给你心上人的微博点赞(一)
  6. 题解1202Pell数列
  7. nginx设置连接超时解决504 gateway timeout
  8. 前方高能:人工智能“进军”互联网市场,企业该如何接招?
  9. 数据系统架构-7.数据智能
  10. EL:底物化学计量决定中国南方森林整个演替过程中的固氮作用