统计学习方法之k近邻法
统计学习方法之k近邻法1. k近邻算法Input:Input:Input:T={(x1,y1),(x2,y2),⋯ ,(xN,yN)}其中,xi∈X⊆Rn为实例的特征向量T=\left\{\left(x_{1}, y_{1}\right),\left(x_{2}, y_{2}\right), \cdots,\left(x_{N}, y_{N}\right)\right\}其中,x_{i} \in
统计学习方法之k近邻法
1. k近邻算法
Input:Input:Input:
- T={(x1,y1),(x2,y2),⋯ ,(xN,yN)}其中,xi∈X⊆Rn为实例的特征向量T=\left\{\left(x_{1}, y_{1}\right),\left(x_{2}, y_{2}\right), \cdots,\left(x_{N}, y_{N}\right)\right\} 其中, x_{i} \in \mathcal{X} \subseteq \mathbf{R}^{n} 为实例的特征向量T={(x1,y1),(x2,y2),⋯,(xN,yN)}其中,xi∈X⊆Rn为实例的特征向量
- yi∈Y={c1,c2,⋯ ,cK}为实例的别,i=1,2,⋯ ,Ny_{i} \in \mathcal{Y}=\left\{c_{1}, c_{2}, \cdots, c_{K}\right\} 为实例的别, i=1,2, \cdots, Nyi∈Y={c1,c2,⋯,cK}为实例的别,i=1,2,⋯,N
- 实例特征向量x实例特征向量 x实例特征向量x
Output:Output:Output:
- 实例x所属的类y实例x所属的类y实例x所属的类y
Algorithm:Algorithm:Algorithm:
- 根据给定的距离度量,在训练集TTT中找出与xxx最近邻的kkk个点,涵盖这kkk个点的xxx的邻域记作Nk(x)N_k(x)Nk(x)
- 在Nk(x)N_k(x)Nk(x)中根据分类决策规则决定xxx的类别yyy
y=argmaxcj∑xi∈Nk(x)I(yi=cj),i=1,2,⋯ ,N;j=1,2,⋯ ,Ky=\arg \max _{c_{j}} \sum_{x_{i} \in N_{k}(x)} I\left(y_{i}=c_{j}\right), \quad i=1,2, \cdots, N ; j=1,2, \cdots, Ky=argcjmaxxi∈Nk(x)∑I(yi=cj),i=1,2,⋯,N;j=1,2,⋯,K
2. k近邻模型
2.1 距离度量
特征空间中两个实例点的距离是两个实例点相似程度的反映。
- 闵可夫斯基距离距离:
Lp(xi,xj)=(∑l=1n∣xi(l)−xj(l)∣p)1pL_{p}\left(x_{i}, x_{j}\right)=\left(\sum_{l=1}^{n}\left|x_{i}^{(l)}-x_{j}^{(l)}\right|^{p}\right)^{\frac{1}{p}}Lp(xi,xj)=(l=1∑n∣∣∣xi(l)−xj(l)∣∣∣p)p1
- 欧式距离:
Lp2(xi,xj)=(∑l=1n∣xi(l)−xj(l)∣2)12L_{p2}\left(x_{i}, x_{j}\right)=\left(\sum_{l=1}^{n}\left|x_{i}^{(l)}-x_{j}^{(l)}\right|^{2}\right)^{\frac{1}{2}}Lp2(xi,xj)=(l=1∑n∣∣∣xi(l)−xj(l)∣∣∣2)21
- 曼哈顿距离:
L1(xi,xj)=∑l=1n∣xi(l)−xj(l)∣L_{1}\left(x_{i}, x_{j}\right)=\sum_{l=1}^{n}\left|x_{i}^{(l)}-x_{j}^{(l)}\right|L1(xi,xj)=l=1∑n∣∣∣xi(l)−xj(l)∣∣∣
- 切比雪夫距离:
L∞(xi,xj)=maxl∣xi(l)−xj(l)∣L_{\infty}\left(x_{i}, x_{j}\right)=\max _{l}\left|x_{i}^{(l)}-x_{j}^{(l)}\right|L∞(xi,xj)=lmax∣∣∣xi(l)−xj(l)∣∣∣
2.2 k值的选择
k值的选择会对k近邻法的结果产生重大影响
- k值的减小就意味着整体模型变得复杂,容易发生过拟合。
- k值的增大就意味着整体的模型变得简单,容易使预测发生错误。
- 在应用中,一般取一个比较小的数值。通常采用交叉验证法来选取最优的k值
2.3 分类决策规则
k近邻法中的分类决策规则一般为多数表决。
分类函数为:
f:Rn→{c1,c2,...,ck}f:R^n \rightarrow\{c_1,c_2,...,c_k\}f:Rn→{c1,c2,...,ck}
误分类概率:
P(Y≠f(X))=1−P(Y=f(X))P(Y \not= f(X)) = 1 - P(Y=f(X)) P(Y=f(X))=1−P(Y=f(X))
实例 x∈Xx \in \mathcal{X}x∈X;最近邻的k个训练实例点构成集合Nk(x)N_k(x)Nk(x)。如果涵盖Nk(x)N_k(x)Nk(x)区域的类别为cjc_jcj,那么误分类率为:
1k∑xi∈Nk(x)I(yi≠cj)=1−1k∑xi∈Nk(x)I(yi=cj)\frac{1}{k} \sum_{x_{i} \in N_{k}(x)} I\left(y_{i} \neq c_{j}\right)=1-\frac{1}{k} \sum_{x_{i} \in N_{k}(x)} I\left(y_{i}=c_{j}\right)k1xi∈Nk(x)∑I(yi=cj)=1−k1xi∈Nk(x)∑I(yi=cj)
要使误分类率最小即经验风险最小,就要使1k∑xi∈Nk(x)I(yi=cj)\frac{1}{k} \sum_{x_{i} \in N_{k}(x)} I\left(y_{i}=c_{j}\right)k1∑xi∈Nk(x)I(yi=cj)最大,也就是多数表决。
3. 算法实现
# 导入所需的库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
# 加载数据
iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['label'] = iris.target
df
| sepal length (cm) | sepal width (cm) | petal length (cm) | petal width (cm) | label | |
|---|---|---|---|---|---|
| 0 | 5.1 | 3.5 | 1.4 | 0.2 | 0 |
| 1 | 4.9 | 3.0 | 1.4 | 0.2 | 0 |
| 2 | 4.7 | 3.2 | 1.3 | 0.2 | 0 |
| 3 | 4.6 | 3.1 | 1.5 | 0.2 | 0 |
| 4 | 5.0 | 3.6 | 1.4 | 0.2 | 0 |
| ... | ... | ... | ... | ... | ... |
| 145 | 6.7 | 3.0 | 5.2 | 2.3 | 2 |
| 146 | 6.3 | 2.5 | 5.0 | 1.9 | 2 |
| 147 | 6.5 | 3.0 | 5.2 | 2.0 | 2 |
| 148 | 6.2 | 3.4 | 5.4 | 2.3 | 2 |
| 149 | 5.9 | 3.0 | 5.1 | 1.8 | 2 |
150 rows × 5 columns
# 展示数据
x_idx = iris.feature_names[0]
y_idx = iris.feature_names[1]
plt.scatter(df[:50][x_idx], df[:50][y_idx], label='0')
plt.scatter(df[50:100][x_idx], df[50:100][y_idx], label='1')
plt.xlabel('sepal length')
plt.ylabel('sepal width')
plt.legend()
plt.show()

# 准备数据
data = np.array(df.iloc[:100, [0, 1, -1]])
X, y = data[:,:-1], data[:,-1]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
test_point = [[6, 3]]
plt.scatter(df[:50][x_idx], df[:50][y_idx], label='0')
plt.scatter(df[50:100][x_idx], df[50:100][y_idx], label='1')
plt.plot(test_point[0][0], test_point[0][1], 'bo', label='test_point')
plt.xlabel('sepal length')
plt.ylabel('sepal width')
plt.legend()
plt.show()

from sklearn.neighbors import KNeighborsClassifier
clf = KNeighborsClassifier()
clf.fit(X_train, y_train)
clf.predict(test_point)
array([1.])
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)