什么是K-近邻算法
- K-近邻算法(KNN)的原理
K Nearest Neighbor算法有叫KNN算法。这个算法是机器学习里面一个比较经典的算法,总体来说KNN是相对比较容易理解的算法。
- 定义
如果一个样本在特征空间中的k个最相似(即特征空间中最近邻)的样本中的大多数属于某一个类别,则该样本也属于这个类别。 - KNN的核心思想是:根据你的“邻居“推断出你的类别。
- 距离公式
两个样本的距离可以通过如下公式计算。
(1)欧式距离:
例如:a(a1,a2,a3),b(b1,b2,b3)
(2)曼哈顿距离
(3)名科夫斯基距离(欧式距离和曼哈顿距离是名科夫斯基距离的一个推广)
电影类型分析
假设现在有几部电影:
电影名称 | 打斗镜头 | 接吻镜头 | 电影类型 |
Cailfornia Man | 3 | 104 | 爱情片 |
He’s not Realy into dues | 2 | 100 | 爱情片 |
Bautiful Woman | 1 | 81 | 爱情片 |
Kevin Longblade | 101 | 10 | 打斗片 |
Robo Slayer 3000 | 99 | 5 | 打斗片 |
Amped lI | 98 | 2 | 打斗片 |
? | 18 | 90 | 未知 |
其中?电影不知道类别,如何去预测?可以使用KNN算法的思想:
电影名称 | 与未知电影的距离 |
Cailfornia Man | 20.5 |
He’s not Realy into dues | 18.7 |
Bautiful Woman | 19.2 |
Kevin Longblade | 115.3 |
Robo Slayer 3000 | 117.4 |
Amped lI | 118.9 |
K-近邻算法API
sklearn.neighbors.KNeighborslassifier(n_neighbors=5,algorithm='auto')
- n neighbors: int,可选(默认=5) , k_neighbors查询默认使用的邻居
- algorithm: {‘auto’, ‘ball_tee’, ‘kd_tee’, ‘brute’}, 可选用于计算最近邻居的
算法: 'ball tree’将会使用BallTree, "kd tree将使用KDTree. 'auto’将尝试根据传递给ft方法的值来决定最合适的算法。(不同实现方式影响效率)
案例1:鸢尾花种类预测
- 数据集介绍
Iris数据集是常用的分类数据集,是一种多重变量分析的数据集,关于数据集的具体介绍: - 具体实现过程:
(1)导入包:
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
(2)编写KNN分类函数:
def knn_iris():
'''
用KNN算法对鸢尾花进行分类
:return:
'''
# 1.获取数据
iris = load_iris()
# 2.划分数据集
x_train, x_test ,y_train, y_test = train_test_split(iris.data, iris.target, random_state= 6)
# 3.特征工程:标准化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 4.KNN算法预估算
estimator = KNeighborsClassifier(n_neighbors=3)
estimator.fit(x_train,y_train)
# 5.模型评估
# (1)直接比对真实值和预测值
y_predict = estimator.predict(x_test)
print("y_predict:\n", y_predict)
print("比对真实值和预测值:\n", y_test == y_predict)
# (2)计算准确率
score = estimator.score(x_test, y_test)
print("准确率为:\n",score)
return None
(3)调用 knn_iris()函数:
if __name__ == "__main__":
# 代码1:用KNN算法对鸢尾花进行分类
knn_iris()
(4)结果:
3. 结果分析:
- k值取多大?有什么影响?
k值取得过小,容易受异常值的影响。k之取得过大。容易受到样本不均衡的影响。 - 性能问题
距离计算上面,时间复杂度高
- 总结
优点:简单,易于理解,易于实现,无需训练
缺点:
(1)懒惰算法,对测试样本分类时的计算量大,内存开销大
(2)必须指定K值,K值选择不当则分类精度不能保证
使用场景:
小数据集,几千~几万样本,具体场景具体业务去测试。