机器学习第一章:K-近邻算法

本文介绍了K-近邻(KNN)算法的基本概念、原理,包括距离度量、K值选择和决策规则,以及如何通过sklearn库在鸢尾花数据集上进行实际应用和预测。
摘要由CSDN通过智能技术生成

1.1K-近邻算法简介

(1)K-近邻算法(KNN)概念

定义:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中大多数属于某一个类别,则该样本也属于这个类别。

距离公式:两个样本的距离可以通过如下公式计算,又叫欧式距离。

二维平面点a(x1,y1)与b(x2,y2)之间的欧式距离:

D_{12}= \sqrt{(x_{1}-x_{2})^{2}+(y_{1}-y_{2})^{2}}

三维空间点a(x1,y1,z1)与b(x2,y2,z2)间的欧式距离:

D_{12}= \sqrt{\left ( x_{1}-x_{2} \right )^{2}+\left ( y_{1}-y_{2} \right )^{2}+\left ( z_{1}-z_{2} \right )^{2}}

n维空间点a(x11,x12,...x1n)与b(x21,x22...x2n)间的欧式距离(两个n维向量):

D_{12}=\sqrt{\sum_{k=1}^{n}(x_{1k}-x_{2k})^{2}}

(2)K-近邻算法原理

<1>. 从训练集合中获取K个离待预测样本距离最近的样本数据;
<2>. 根据获取得到的K个样本数据来预测当前待预测样本的目标属性值。

(3)KNN三要素

<1>.K值的选择:对于K值的选择,一般根据样本分布选择一个较小的值,然后通过交叉
验证来选择一个比较合适的最终值;当选择比较小的K值的时候,表示使用较小领域
中的样本进行预测,训练误差会减小,但是会导致模型变得复杂,容易过拟合;当
选择较大的K值的时候,表示使用较大领域中的样本进行预测,训练误差会增大,同
时会使模型变得简单,容易导致欠拟合;
<2>.距离的度量:一般使用欧氏距离(欧几里得距离);
<3>.决策规则:在分类模型中,主要使用多数表决法或者加权多数表决法;在回归模型
中,主要使用平均值法或者加权平均值法。

1.2KNN算法实现方式

KNN算法的重点在于找出K个最邻近的点,主要方式有以下几种:
<1>.蛮力实现(brute):计算预测样本到所有训练集样本的距离,然后选择最小的k个距
离即可得到K个最邻近点。缺点在于当特征数比较多、样本数比较多的时候,算法的
执行效率比较低;
<2>.KD树(kd_tree):KD树算法中,首先是对训练数据进行建模,构建KD树,然后再
根据建好的模型来获取邻近样本数据。
除此之外,还有一些从KD_Tree修改后的求解最邻近点的算法,比如:Ball Tree、
BBF Tree、MVP Tree等。

1.3案例:鸢尾花种类预测-流程实现

iris.csv_免费高速下载|百度网盘-分享无限制 (baidu.com)数据集

(1).K-近邻算法API

 (2).案例:鸢尾花种类预测

数据集介绍

实例数量:150(三类各有50个)

属性数量:4(数值型,数值型,帮助预测的属性和类)

 代码过程

 第一步:引入所需库

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
import numpy as np

 第二步:划分测试集占20%

 x_train, x_test, y_train, y_test = train_test_split(data, target, test_size=0.2, random_state=0)

 第三步:n_neighbors=5

 KNeighborsClassifier(n_neighbors=5)

 第四步:评价模型的准确率

KNN.fit(x_train, y_train)
# 训练集准确率
train_score = KNN.score(x_train, y_train)
# 测试集准确率
test_score = KNN.score(x_test, y_test)

 第五步:使用模型预测未知种类的鸢尾花

#待预测数据:X1=[[1.5 , 3 , 5.8 , 2.2], [6.2 , 2.9 , 4.3 , 1.3]]
 X1 = np.array([[1.5, 3, 5.8, 2.2], [6.2, 2.9, 4.3, 1.3]])
 # 进行预测
 prediction = KNN.predict(X1)
 # 种类名称
 k = iris.get("target_names")[prediction]

 完整代码

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
import numpy as np
if __name__ == '__main__':
    iris = load_iris()
    data = iris.get("data")
    target = iris.get("target")
    x_train, x_test, y_train, y_test = train_test_split(data, target, test_size=0.2, random_state=0)
    KNN = KNeighborsClassifier(n_neighbors=5)
    KNN.fit(x_train, y_train)
    train_score = KNN.score(x_train, y_train)
    test_score = KNN.score(x_test, y_test)
    print("模型的准确率:", test_score)
    X1 = np.array([[1.5, 3, 5.8, 2.2], [6.2, 2.9, 4.3, 1.3]])
    prediction = KNN.predict(X1)
    k = iris.get("target_names")[prediction]
    print("第一朵花的种类为:", k[0])
    print("第二朵花的种类为:", k[1])

 结果

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值