机器学习-最近邻算法(knn)

本文深入解析KNN算法的原理,包括加权分类、回归预测等变种,并通过Python代码实现鸢尾花数据集上的分类任务,展示了如何使用sklearn库进行数据预处理、模型训练及评估。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近邻算法

最近邻算法是机器学习算法中比较简单的一种算法了,下面用图阐述一下该算法。
在这里插入图片描述在这里插入图片描述
上面笔记只说了knn的最常出现的一种分类方式,下面还将补充一些其他方式。

knn加权分类:
加权的多数投票法;对于k个样本,每个样本到待测样本的距离的倒数作为当前样本的权重系数,在k个样本中,统计各个类别对应权重的累加和,最终将权重系数最大的那个对应类别作为待测样本的类别。

knn回归预测:
将k个样本的y值的均值作为待测样本的预测值。

knn加权回归预测:
对于k个样本,每个样本到待测样本的距离的倒数作为当前样本的权重系数,然后权重系数归一化,最后将归一化的权重和y一起做一个加权均值的操作,将最终的均值作为预测值。

下面是代码部分:

```python
from sklearn.datasets import load_iris        #导入数据包
from sklearn.model_selection import train_test_split, GridSearchCV        #导入把数据集分为测试集和训练集的包
from sklearn.preprocessing import StandardScaler          #导入数据归一化的包
from sklearn.neighbors import KNeighborsClassifier        #导入knn邻近算法的包
#(from sklearn.neighbors import KNeighborsRegressor       #导入knn邻近算法的包 )

class KNN(object):
    # 获取鸢尾花数据 三个类别(山鸢尾/0,虹膜锦葵/1,变色鸢尾/2),每个类别50个样本,每个样本四个特征值(萼片长度,萼片宽度,花瓣长度,花瓣宽度)
    def get_iris_data(self):      #生成数据的函数
        iris = load_iris()        #获取鸢尾花数据(该数据的数据类型是一个字典)
        iris_data = iris.data      #提出鸢尾花的特征数据
        iris_target = iris.target   #提出鸢尾花的标签数据
        return iris_data, iris_target     #返回一个包含特征数据和标签数据的元组

    def run(self):
        # 1.获取鸢尾花的特征值,标签值
        iris_data, iris_target = self.get_iris_data()   
        # 2.将数据分割成训练集和测试集 test_size=0.25表示将25%的数据用作测试集
        x_train, x_test, y_train, y_test = train_test_split(iris_data, iris_target, test_size=0.25)
        # 3.特征工程(对特征值进行标准化处理,即数据归一化)
        std = StandardScaler()     #创建一个数据标准化的对象
        x_train = std.fit_transform(x_train)   #对特征值的训练集做数据标准化   
        x_test = std.transform(x_test)        #对特征值的测试集做数据标准化
        # 4.送入算法
        knn = KNeighborsClassifier(n_neighbors=5) # 创建一个KNN算法实例,n_neighbors默认为5,后续通过网格搜索获取最优参数
        knn.fit(x_train, y_train) # 将训练集送入算法来训练knn模型
        y_predict = knn.predict(x_test) # 获取预测结果
        print("准确率:",knn.score(x_test, y_test))      #输出预测的准确率

if __name__ == '__main__':
    knn = KNN()         #   实例化一个knn对象
    knn.run()           #调用knn对象里的run方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值