KNN算法
某一未知样本的类别是在特征空间里距离它最近的k个样本中,居于大多数的类别
计算两个样本
A
(
a
1
,
a
2
,
a
3
)
A(a_1, a_2, a_3)
A(a1,a2,a3),
B
(
b
1
,
b
2
,
b
3
)
B(b_1, b_2, b_3)
B(b1,b2,b3)之间的距离,距离计算公式有多种,这里举出常用的两种:
- 欧氏距离: d A B = ( a 1 − b 1 ) 2 + ( a 2 − b 2 ) 2 + ( a 3 − b 3 ) 2 d_{AB}=\sqrt{(a_1-b_1)^2+(a_2- b_2)^2+(a_3-b_3)^2} dAB=(a1−b1)2+(a2−b2)2+(a3−b3)2
- 曼哈顿距离: d A B = ∣ a 1 − b 1 ∣ + ∣ a 2 − b 2 ∣ + ∣ a 3 − b 3 ∣ d_{AB}=|a_1-b_1|+|a_2-b_2|+|a_3-b_3| dAB=∣a1−b1∣+∣a2−b2∣+∣a3−b3∣
k
k
k值若太小,容易受到异常值的影响
k
k
k值若太大,容易受到样本数量分布的影响
在鸢尾花数据集上使用KNN算法
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
# 获取数据
iris = load_iris()
# 划分数据集
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=22)
# 标准化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
# 使用训练集的标准差和平均值,因此这里用的是transform而不是fit_transform
x_test = transfer.transform(x_test)
# KNN调用
estimator = KNeighborsClassifier(n_neighbors=3)
estimator.fit(x_train, y_train)
# 模型评估
score = estimator.score(x_test, y_test)
print(score)
输出最后的准确率