K近邻算法(K-Nearest Neighbors, KNN)是一种基于实例的监督学习算法,主要用于分类和回归任务。其核心思想是:在特征空间中,对于待预测的样本,找到与其距离最近的k个已知样本(“邻居”),根据这k个邻居的类别(分类任务)或属性值(回归任务)来决定该样本的预测结果,,常用欧氏距离公式:对于两个 n 维样本点 xi=(xi1,xi2,...,xin)x_i = (x_{i1}, x_{i2}, ..., x_{in}) xi=(xi1,xi2,...,xin)和xj=(xj1,xj2,...,xjn) x_j = (x_{j1}, x_{j2}, ..., x_{jn})xj=(xj1,xj2,...,xjn),距离为:d(xi,xj)=∑k=1n(xik−xjk)2d(x_i, x_j) = \sqrt{\sum_{k=1}^n (x_{ik} - x_{jk})^2}d(xi,xj)=k=1∑n(xik−xjk)2。
以图为例,假设五角星和三角形分别代表两类不同的电影,一类是爱情片,一类是动作片。此时加入一个新样本正方形,此时需要判断该电影的类别:
选择离新样本最近的3个近邻点时(K=3)为判断依据时,这3个点由1个五角星和2个三角形组成,可以认为新样本属于三角形的类别,即新样本是一部动作片。
选择离新样本最近的5个近邻点时(K=5)为判断依据时,5个点由3个五角星和2个三角形组成,可以认为新样本属于五角星的类别,即新样本是一部爱情片。
import pandas as pd
df = pd.read_excel("./data/电影数据.xlsx")
df1 = df.iloc[:,1:]
X = df1[["动作镜头", "爱情镜头"]]
y = df1["电影类别"]
from sklearn.neighbors import KNeighborsClassifier as KNN
knn = KNN(n_neighbors=3)
# 模型训练
knn.fit(X, y)
# 预测
y_pre = knn.predict(X)
# 预测和时间对比
df2 = pd.DataFrame({
"y_true": y,
"y_pre": y_pre
})
k值的选取是有技巧的
示例代码
from sklearn.neighbors import KNeighborsRegressor
knr = KNeighborsRegressor(n_neighbors=3)
X_knr = [[1, 2],[3, 4],[5,6],[7,8],[9,10]]
y_knr = [1,2,3,4,5]
knr.fit(X_knr, y_knr)
knr.predict([[5,5]])
这边再介绍了两种数据标准化手段,他们主要是为了解决量纲问题,因为有的参数数值量级大,算距离的时候值会特大,导致其他参数影响变小,
x′=x−xminxmax−xminx^{'}= \frac{x-x_{min}}{x_{max}-x_{min}}x′=xmax−xminx−xmin
df1 = pd.read_excel("./aaaa.xlsx")
X1 = df1[["a", "b"]]
y1 = df1["分类"]
from sklearn.preprocessing import MinMaxScaler
X1_mm = MinMaxScaler().fit_transform(X1)
x∗=x−meanstdx^{*}= \frac{x-mean}{std}x∗=stdx−mean
from sklearn.preprocessing import StandardScaler
X1_s = StandardScaler().fit_transform(X)
感谢大家阅读,创造不易,点个赞呗