机器学习之KNN算法:鸢尾花案例

一、KNN算法(又称近邻算法)

       核心思想:若一个样本在特征空间中有k个相似的样本且其中大多数同属于某一类别,那么这个样本也属于该类别。

       大白话版:我在什么地方,问我附近邻居

二、相似性的判断

        那么如何判断哪些算是近邻?我们采用距离指标来进行衡量。常见的距离指标有:欧氏距离、曼哈顿距离、切比雪夫距离、闵可夫斯基距离。其中欧氏距离最为常用。

        ①欧氏距离    

                欧氏距离就是指两点空间上的距离,该方法的公式相信很多人都比较熟悉

                计算公式:d = \left ( \sum_{k=1}^{n}\left ( x_{1k}- x_{2k}\right ) ^{2}\right )^{\frac{1}{2}}

        ②曼哈顿距离  又称城市街区距离

                该方法取自于曼哈顿城市的布局特点---横平竖直。

                任意两点之间的曼哈顿距离等于两个方向上绝对差值的和。

                推广到n维空间点上:d = \sum_{k=1}^{n}\left | x_{1k}-x_{2k} \right |

        ③切比雪夫距离

                在国际象棋中,国王能够直行、横行以及斜行,共有八个位置可以选择。

                国王从某一位置到另一个位置所需的最少步数,这个距离就是切比雪夫距离。

                例如图中位置1到位置2,至少需要三步,用公式表达的话:

d = max(\left | x_{1}-x_{2} \right |,\left | y_{1}-y_{2} \right |)

        ④闵可夫斯基距离  又称闵氏距离

                是对以上多种距离公式的概括性表示。公式为:

 d = \left ( \sum_{k=1}^{n}\left | x_{1k}-x_{2k} \right |^{p} \right )^{\frac{1}{p}}

                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)

              

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值