【机器学习算法】K-近邻算法 (KNN)

K-近邻算法简介

K Nearest Neighbor算法又叫KNN算法,这个算法是机器学习里面一个比较经典的算法, 总体来说KNN算法是相对比较容易理解的算法。

  • 定义

如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。即通过你的"邻居"来判断你属于哪个类别

  • K近邻 (k-Nearest Neighbors,KNN) 算法是一种分类算法

  • 1968年由 Cover 和 Hart 提出,应用场景有字符识别、文本分类、图像识别等领域。

  • 该算法的思想是:一个样本与数据集中的k个样本最相似,如果这k个样本中的大多数属于某一个类别,则该样本也属于这个类别。

实现流程

1)计算已知类别数据集中的点与当前点之间的距离

2)按距离递增次序排序

3)选取与当前点距离最小的k个点

4)统计前k个点所在的类别出现的频率

5)返回前k个点出现频率最高的类别作为当前点的预测分类


Scikit-learn

scikit-learn是一个建立在Scipy基础上的用于机器学习的Python模块。scikit-learn包含众多顶级机器学习算法,主要有六大基本功能,分别是分类回归聚类数据降维模型选择数据预处理

sklearn优势:文档多且规范,包含的算法多,实现起来容易。

在这里插入图片描述


k近邻算法API

  • 机器学习流程:
    • 1.获取数据集
      • sklearn.datasets
        • datasets.load_*()
        • datasets.fetch_*()
    • 2.数据基本处理
      • seaborn.lmplot( )
        • sns.lmplot( )
      • sklearn.model_selection.train_test_split(arrays, *options)
    • 3.特征工程
      • sklearn.preprocessing
        • sklearn.preprocessing.MinMaxScaler (feature_range=(0,1)… )
          • MinMaxScalar.fit_transform( )
        • sklearn.preprocessing.StandardScaler()
          • StandardScaler.fit_transform( )
    • 4.机器学习
      • sklearn.neighbors.KNeighborsClassifier(n_neighbors=5)
      • sklearn.model_selection.GridSearchCV(estimator, param_grid=None,cv=None)
      • fit( )
    • 5.模型评估
      • predict( )
      • score( )
    • 模型保存与加载
      • from sklearn.externals import joblib
        • 保存:joblib.dump(estimator, ‘test.pkl’)
        • 加载:estimator = joblib.load(‘test.pkl’)

详细见后文


距离度量

1. 欧式距离(Euclidean Distance)

欧氏距离是最容易直观理解的距离度量方法,我们小学、初中和高中接触到的两个点在空间中的距离一般都是指欧氏距离。

二维平面上点 a ( x 1 , y 1 ) a(x_{1},y_{1}) a(x1,y1) b ( x 2 , y 2 ) b(x_{2},y_{2}) b(x2,y2)间的欧式距离:

d 12 = ( x 1 − x 2 ) 2 + ( y 1 + y 2 ) 2 d_{12} = \sqrt{(x_{1}-x_{2})^{2}+(y_{1}+y_{2})^{2}} d12=(x1x2)2+(y1+y2)2

三维空间点 a ( x 1 , y 1 , z 1 ) a(x_{1},y_{1},z_{1}) a(x1,y1,z1) b ( x 2 , y 2 , z 2 ) b(x_{2},y_{2},z_{2}) b(x2,y2,z2)间的欧式距离:

d 12 = ( x 1 − x 2 ) 2 + ( y 1 + y 2 ) 2 + ( z 1 + z 2 ) 2 d_{12} = \sqrt{(x_{1}-x_{2})^{2}+(y_{1}+y_{2})^{2}+(z_{1}+z_{2})^{2}} d12=(x1x2)2+(y1+y2)2+(z1+z2)2

n维空间点 a ( x 11 , x 12 , . . . , x 1 n ) a(x_{11},x_{12},...,x_{1n}) a(x11,x12,...,x1n) b ( x 21 , x 22 , . . . , x 2 n ) b(x_{21},x_{22},...,x_{2n}) b(x21,x22,...,x2n)间的欧式距离:

d 12 = ∑ k = 1 n ( x 1 k − x 2 k ) 2 d_{12} = \sqrt{\sum_{k=1}^{n}(x_{1k}-x_{2k})^{2}} d12=k=1n(x1kx2k)2

【例】

import numpy as np
vec1 = np.array([1,1,1])
vec2 = np.array([2,2,2])

# 方法一
distance= np.sqrt(np.sum(np.square(vec1-vec2)))
print(distance)					# 1.7320508075688772

# 方法二
distance = np.linalg.norm(vec1-vec2)
print(distance)					# 1.7320508075688772

2. 曼哈顿距离(Manhattan Distance)

在曼哈顿街区要从一个十字路口开车到另一个十字路口,驾驶距离显然不是两点间的直线距离。这个实际驾驶距离就是“曼哈顿距离”。曼哈顿距离也称为“城市街区距离”(City Block distance)。
在这里插入图片描述
二维平面两点 a ( x 1 , y 1 ) a(x_1,y_1) a(x1,y1) b ( x 2 , y 2 ) b(x_2,y_2) b(x2,y2)间的曼哈顿距离:
d 12 = ∣ x 1 − x 2 ∣ + ∣ y 1 − y 2 ∣ d_{12} = |x_1 - x_2| + |y_1 - y_2| d12=x1x2+y1y2

n维空间点 a ( x 11 , x 12 , . . . , x 1 n ) a(x_{11} ,x_{12},...,x_{1n}) a(x11,x12,...,x1n) b ( x 21 , x 22 , . . . , x 2 n ) b(x_{21} ,x_{22},...,x_{2n}) b(x21,x22,...,x2n)间的曼哈顿距离:
d 12 = ∑ k = 1 n ∣ x 1 k − x 2 k ∣ d_{12} = \sum_{k=1}^{n} |x_{1k} - x_{2k}| d12=k=1nx1k

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值