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_*()
- sklearn.datasets
- 2.数据基本处理
- seaborn.lmplot( )
- sns.lmplot( )
sklearn.model_selection.train_test_split
(arrays, *options)
- seaborn.lmplot( )
- 3.特征工程
- sklearn.preprocessing
- sklearn.preprocessing.MinMaxScaler (feature_range=(0,1)… )
- MinMaxScalar.fit_transform( )
sklearn.preprocessing.StandardScaler()
- StandardScaler.fit_transform( )
- sklearn.preprocessing.MinMaxScaler (feature_range=(0,1)… )
- sklearn.preprocessing
- 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’)
- from sklearn.externals import joblib
- 1.获取数据集
详细见后文
距离度量
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=(x1−x2)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=(x1−x2)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=1∑n(x1k−x2k)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=∣x1−x2∣+∣y1−y2∣
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=1∑n∣x1k−