一、KNN算法(又称近邻算法)
核心思想:若一个样本在特征空间中有k个相似的样本且其中大多数同属于某一类别,那么这个样本也属于该类别。
大白话版:我在什么地方,问我附近邻居
二、相似性的判断
那么如何判断哪些算是近邻?我们采用距离指标来进行衡量。常见的距离指标有:欧氏距离、曼哈顿距离、切比雪夫距离、闵可夫斯基距离。其中欧氏距离最为常用。
①欧氏距离
欧氏距离就是指两点空间上的距离,该方法的公式相信很多人都比较熟悉
计算公式:
②曼哈顿距离 又称城市街区距离
该方法取自于曼哈顿城市的布局特点---横平竖直。
任意两点之间的曼哈顿距离等于两个方向上绝对差值的和。
推广到n维空间点上:
③切比雪夫距离
在国际象棋中,国王能够直行、横行以及斜行,共有八个位置可以选择。
国王从某一位置到另一个位置所需的最少步数,这个距离就是切比雪夫距离。
例如图中位置1到位置2,至少需要三步,用公式表达的话:
④闵可夫斯基距离 又称闵氏距离
是对以上多种距离公式的概括性表示。公式为:
p是一个变量,当p=1时就是曼哈顿距离
当p=2时就是欧氏距离
当p->无穷时就是切比雪夫距离
三、案例讲解--鸢尾花
在python中有关于机器学习的类库sklearn,这里我们通过该库中鸢尾花数据集来实现近邻算法。注:以下均在jupyter lab中运行。
# 1.导包
from sklearn.neighbors import KNeighborsClassifier,KNeighborsRegressor
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 装载数据
from sklearn.datasets import load_iris
X,y = load_iris(return_X_y=True)
# 数据集划分成训练集和测试集,比例8:2
x_train, x_test, y_train, y_test = train_test_split(X,y,train_size=0.8,random_state=42)
# 特征工程,进行数据预处理--标准化
# 创建标准化对象scaler
scaler = StandardScaler()
# 对训练集进行标准化操作并赋值
x_train_scaled = scaler.fit_transform(x_train)
# 用训练集的均值和方差对测试集进行标准化
x_test_scaled = scaler.transform(x_test)
# 模型训练
# 创建近邻分类对象,指定超参数k为2
knn = KNeighborsClassifier(n_neighbors=2)
# 生成模型
knn.fit(x_train_scaled,y_train)
# 用模型预测
# 用模型对训练集进行预测
x_train_pre = knn.predict(x_train_scaled)
# 用模型对测试集进行预测
x_test_pre = knn.predict(x_test_scaled)
# 模型评估
acc1 = accuracy_score(y_train,x_train_pre)
acc2 = accuracy_score(y_test,x_test_pre)
print(acc1)
print(acc2)