机器学习基础算法一:KNN算法回归实验

KNN回归实验

一、基础知识

  • 什么是回归: 回归实际上就是“最佳拟合”。根据已有的数据拟合出一条最佳的直线、曲线、超平面或函数等,用于预测其它数据的目标值。如已知一系列的点(x,y),我们可能就可以拟合出一条最佳的直线y=kx+b。那么如果已知自变量x,要预测目标值y的话,就可以直接带入到该直线方程中求出y。回归的目的就是预测数值型的目标值
  • 分类与回归的区别: 分类是判断对应类别,而回归的输出是一个具体值。

二、算法实现

  1. 前期数据处理:
    import numpy as np
    import pandas as pd
    
    # 增加表格的列数行数和每行的宽度以此让数据集完整表示
    pd.set_option('display.max_rows', 500)
    pd.set_option('display.max_columns', 500)
    pd.set_option('display.width', 1000)
    # 提取鸢尾花的数据集
    data = pd.read_csv(r"E:\Machine learning data\Iris\Iris.csv")
    #删除不需要的列,进行回归操作,类别信息没有用处。axis=1表示列,inplace=True表示就地删除。
    data.drop(["Unnamed: 0","Species"],axis=1,inplace=True) 
    # 删除重复记录
    data.drop_duplicates(inplace=True)
    
  2. KNN回归算法的实现
  • 实现代码:
    class KNN:
    """使用Python实现k近邻算法。(回归预测)
    该算法用于回归预测,根据前3个特征属性,寻找最近的k个邻居,
    然后再根据k个邻居的第四个特征属性,去预测当前样本的第4个特征值。
    """
    def __init__(self,k):
        """
        初始化方法
        Paramets
        ------
        k:int
            邻居个数
        """
        self.k = k
    
    def fit(self,X,y):
        """
        训练方法。
        Parameters
        ------
        X:类数组类型(特征矩阵)。形状为[样本数量,特征数量]
            带训练的样本特征(属性)
        y:类数组类型(目标标签)。形状为[样本数量]
            每个样本的目标值(标签)
        """
        # 注意,要将X与y转换成ndarray数组的形式,方便统一进行操作。
        self.X = np.asarray(X)
        self.y = np.asarray(y)
    
    def predict(self,X):
        """根据参数传递的X,对样本数据进行预测
        Parameter:
        ------
        X:类数组类型。形状为[样本数量,特征数量]
            待测试的样本特征(属性)
    
        Return:
        -----
        result:数组类型。
            预测的结果值。
        """
        # 将X转换成数组类型
        X = np.asarray(X)
        # 保存预测的结果值
        result = []
        for x in X:
            # 计算距离。(计算与训练集中每个X的距离)
            dis = np.sqrt(np.sum((x-self.X )** 2,axis=1))
            # 返回数组排序后,每个元素在原数组中(排序之前的数据)的索引
            index = dis.argsort()
            # 取前k个距离最近的索引(在原数组中的索引)
            index = index[:self.k]
            # 计算均值,然后加入到结果列表中。
            result.append(np.mean(self.y[index]))
        return np.array(result)
    
    t = data.sample(len(data),random_state=0)
    train_X = t.iloc[:120,:-1]
    train_y = t.iloc[:120,-1]
    test_X = t.iloc[120:,:-1]
    test_y = t.iloc[120:,-1]
    knn = KNN(k=3)
    knn.fit(train_X,train_y)
    result = knn.predict(test_X)
    # 用与表示预测值与实际值的相差度
    print("预测值与实际值的相差度:",np.mean(np.sum(result-test_y) ** 2))
    print("预测值:",result)
    print("实际值:",test_y.values)
    
  • 实验结果:
    在这里插入图片描述
  1. 可视化操作
  • 导入所需包并进行一些必要设置
    import matplotlib as mpl
    import matplotlib.pyplot as plt
    # 默认情况下,matplotlib不支持中文显示,我们需要进行设置
    # 设置字体为黑体,以支持中文显示。
    mpl.rcParams["font.family"] = "SimHei"
    # 设置在中文字体时,能够正常的显示负号(-)
    mpl.rcParams["axes.unicode_minus"] = False
    
  • 图表绘制
    # 图表绘制:
    plt.figure(figsize=(10,10)) # 调整画布大小
    # 绘制预测值
    plt.plot(result,"ro-",label="预测值")
    # 绘制真实值
    plt.plot(test_y.values,"go--",label="真实值")
    plt.title("kNN回归预测展示")
    plt.xlabel("节点序号")
    plt.ylabel("花瓣宽度")
    plt.legend()
    plt.show()
    
  • 图表展示
    在这里插入图片描述

三、总结

  1. 一般可以用节点距离的倒数来表示权重。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值