机器学习算法-- K 近邻算法(KNN)
我用一个 「预测电影类型」 的例子来讲解 K 近邻算法(KNN),保证你轻松理解原理和实现步骤!
🎬 例子背景
假设你是电影平台的程序员,现在有一批电影数据,包含两个特征:
-
打斗镜头次数(动作片通常更多)
-
亲吻镜头次数(爱情片通常更多)
已知这些电影的类别(标签),比如《战狼》是动作片,《泰坦尼克号》是爱情片。现在有一部新电影(打斗 80 次,亲吻 10 次),如何用 KNN 判断它的类型?
📚 KNN 原理解析
1. 核心思想
“近朱者赤,近墨者黑” —— 新电影的类别由它最相似的 K 个邻居的类别投票决定。
2. 关键步骤
-
计算距离:新电影和所有已知电影的距离(比如欧氏距离)。
-
找邻居:选出距离最近的 K 个电影(比如 K=3)。
-
投票决定:这 K 个电影中,哪种类型多,新电影就属于哪类。
3. 距离公式(欧氏距离)
比如新电影 A (80,10) 和已知电影 B (100,5) 的距离:
距离 = √[(80-100)² + (10-5)²] = √(400 + 25) ≈ 20.6
🛠️ 代码实现(Python)
用 scikit-learn
库快速实现:
from sklearn.neighbors import KNeighborsClassifier
import numpy as np# 1. 准备数据(打斗次数,亲吻次数)
X = np.array([[100, 5], [90, 8], [5, 90], [2, 100]]) # 特征
y = np.array(["动作片", "动作片", "爱情片", "爱情片"]) # 标签# 2. 创建KNN模型(K=3)
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X, y) # 训练模型# 3. 预测新电影
new_movie = np.array([[80, 10]])
prediction = knn.predict(new_movie)print(f"预测结果:{prediction[0]}") # 输出:动作片
代码解释:
-
X
是特征数据,y
是对应的标签。 -
n_neighbors=3
表示选择最近的 3 个邻居投票。 -
新电影
[80, 10]
的 3 个邻居大概率是动作片,所以预测为动作片。
🌟 关键细节
-
如何选 K 值?
-
K 太小(如 K=1):容易受噪声影响(比如邻居恰好是标错的数据)。
-
K 太大:可能忽略局部特征(比如周围全是爱情片,但新电影其实是动作片)。
-
经验法则:从 K=5 开始尝试,用交叉验证调整。
-
-
特征缩放很重要!
-
如果“打斗次数”范围是 0-100,而“亲吻次数”是 0-1,距离计算会被打斗次数主导。
-
解决方法:用
StandardScaler
标准化特征。
-
-
适合场景
-
小数据集、简单分类(比如手写数字识别)。
-
不适合大数据集(计算距离慢)或高维数据(维度灾难)。
-
🤔 举个反例
如果新电影是 [50, 50]
(打斗和亲吻镜头一样多),KNN 可能难以判断——这时需要更复杂的模型(比如决策树或神经网络)。
总结:KNN 就是“跟着邻居走”,简单但强大!试着用它预测你身边的数据吧(比如根据身高体重判断性别)🎯