用python实现线性回归算法

用python实现线性回归算法importnumpyasnpimportmatplotlib.pyplotaspltfromsklearn.model_selectionimporttrain_test_splitnp.random.seed(123)x=2np.random.rand(500,1)y=5+3x+np.random.rand(500,1)*3fig=plt.figure(figsi…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

本文是根据https://blog.csdn.net/dqcfkyqdxym3f8rb0/article/details/79767043这篇博客写出来的。其中的公式什么的可以去这个博客里面看。
本文主要讲述的是关于其中的线性回归算法中每一段的意思,以供自己以后参考学习。

import numpy as np #引入numpy科学计算库
import matplotlib.pyplot as plt #引入绘图库
from sklearn.model_selection import train_test_split#从sklearn里面引出训练与测试集划分
np.random.seed(123) #随机数生成种子
x=2*np.random.rand(500,1)#随机生成一个0-2之间的,大小为(500,1)的向量
y=5+3*x+np.random.randn(500,1)#随机生成一个线性方程的,大小为(500,1)的向量
fig=plt.figure(figsize=(8,6))#确定画布大小
plt.scatter(x,y)#设置为散点图
plt.title("Dataset")#标题名
plt.xlabel("First feature")#x轴的标题
plt.ylabel("Second feature")#y轴的标题
plt.show()#绘制出来

用python实现线性回归算法
通过观察此图,可以发现x轴的大小限制在0-2之间,而y则是根据是那上面的线性方程y=5+3*x+n,这个n是一个呈正态分布的随机量。
上面的一切都是在随机生成数据,为的就是能够自己生成一个小型的数据集。

x_train,x_test,y_train,y_test=train_test_split(x,y)#将上面得到的数据集进行划分,按照3:1的比例分给训练集
                                                                           #和测试集
print(f'Shape x_train:{x_train.shape}')#输出x轴训练集的大小
print(f'Shape y_train:{y_train.shape}')#同上
print(f'Shape x_test:{x_test.shape}')#同上
print(f'Shape y_test:{y_test.shape}')#同上

Shape x_train:(375, 1)
Shape y_train:(375, 1)
Shape x_test:(125, 1)
Shape y_test:(125, 1)

上面的数据就是上一代码块所能得到输出。从此我们可以看出,数据集已经成功按照3:1的比例分成了训练集和测试集。
现在开始写线性回归的类:

class LinearRegression:#类名
    def _init_(self):#初始化
        pass#什么也不做,只是单纯的防止语句错误
    def train_gradient_descent(self,x,y,learning_rate=0.01,n_iters=100):#梯度下降法训练,x,y不用解释,
     #学习率就是学习的速度,n_iters是迭代的次数
        n_samples,n_features=x.shape#将x的大小x=500,y=1分别分给样品和特征
        self.weights=np.zeros(shape=(n_features,1))#以下都是第零步,给权值赋为0,这里的n_features==1
        self.bias=0#偏差赋值为0
        costs=[]#申请一个损失数组
        
        for i in range(n_iters):#迭代n_iters次
            y_predict=np.dot(x,self.weights)+self.bias#第一步:y_predict=X*w+b
            cost=(1/n_samples)*np.sum((y_predict-y)**2)#第二步,得训练集的损失
            costs.append(cost)#将损失加到损失数组里面
            
            if i%100==0:#每过一百次输出一下损失
                print(f"Cost at iteration{i}:{cost}")
            
            dJ_dw=(2/n_samples)*np.dot(x.T,(y_predict-y))#第三步 第一个公式,得对应偏导数的梯度
            dJ_db=(2/n_samples)*np.sum((y_predict-y))#第三步 第二个公式
            
            self.weights=self.weights-learning_rate*dJ_dw#第四步 第一个公式,刷新权值
            self.bias=self.bias-learning_rate*dJ_db#第四步 第二个公式,刷新偏差
            
        return self.weights,self.bias,costs#返回所得参数
    def train_normal_equation(self,x,y):#正规的方程训练
        self.weights=np.dot(np.dot(np.linalg.inv(np.dot(x.T,x)),x.T),y)#正规方程公式
        self.bias=0
        
        return self.weights,self.bias
    def predict(self,x):
        return np.dot(x,self.weights)+self.bias

以下步骤,皆属于复制的置顶博客中的 步骤
a) 梯度下降法

第 0 步:

用0 (或小的随机值)来初始化权重向量和偏置量,或者直接使用正态方程计算模型参数

第 1 步(只有在使用梯度下降法训练时需要):

计算输入的特征与权重值的线性组合,这可以通过矢量化和矢量传播来对所有训练样本进行处理:在这里插入图片描述

其中 X 是所有训练样本的维度矩阵,其形式为在这里插入图片描述;· 表示点积。

第 2 步(只有在使用梯度下降法训练时需要):

用均方误差计算训练集上的损失:
在这里插入图片描述
第 3 步(只有在使用梯度下降法训练时需要):

对每个参数,计算其对损失函数的偏导数:

在这里插入图片描述

所有偏导数的梯度计算如下:

在这里插入图片描述

第 4 步(只有在使用梯度下降法训练时需要):

更新权重向量和偏置量:

在这里插入图片描述
其中,表示学习率。

b) 正态方程(封闭形式解):
在这里插入图片描述
其中 X 是一个矩阵,其形式为在这里插入图片描述,包含所有训练样本的维度信息。

regressor=LinearRegression() #梯度下降法的一个实例化对象
w_trained,b_trained,costs=regressor.train_gradient_descent(x_train,y_train,learning_rate=0.005,n_iters=600)
   #对该对象进行训练,并获取训练之后的权值与偏差
fig=plt.figure(figsize=(8,6))#设置画布大小
plt.plot(np.arange(600),costs)#设置绘画内容,x轴为迭代次数,y轴为训练集的损失
plt.title("Development of cost during training")#标题
plt.xlabel("Numbers of iterations: ")#x轴标题
plt.ylabel("Cost")#y轴标题
plt.show()#显示

在这里插入图片描述

n_samples,_=X_train.shape#这里想要的只有训练集的行数,_代表的也是一个变量名,只是为1,为什么用
                                            #相当于被抛弃的那种。之所以写在这里,也是为了防止程序出错
n_samples_test,_=X_test.shape#这里想要的是测试集的行数

y_p_train=regressor.predict(X_train)#计算训练集中的特征与权值的线性组合,借鉴梯度下降法中的第一步
y_p_test=regressor.predict(X_test)#计算测试集中的特征与权值的线性组合
error_train=(1/n_samples)*np.sum((y_p_train-y_train)**2)#这里计算的是训练集的的误差
error_test=(1/n_samples_test)*np.sum((y_p_test-y_test)**2)#这里计算的是测试集的的误差
print(f"error on training set:{np.round(error_train,4)}")#输出训练集的误差,保留四位小数
print(f"error on testing set:{np.round(error_test)}")#输出测试集的误差

Error on training set: 1.0955

Error on test set: 1.0
以上为上代码块的输出。

X_b_train=np.c_[np.ones(n_samples),X_train]#按行进行组合两个矩阵,组合之后的矩阵大小为(375,2)
X_b_test=np.c_[np.ones(n_samples_test),X_test]#按行进行组合两个矩阵,,组合之后的矩阵大小为(125,2)
reg_normal=LinearRegression()#建立一个使用正态方程的实例化对象
w_trained=reg_normal.train_normal_equation(X_b_train,y_train)#使用了正态方程训练之后的权值

以上代码块是正态方程的训练。

y_p_train=reg_normal.predict(X_b_train)#计算正态训练集中的特征与权值的线性组合,借鉴梯度下降法中的第一步
y_p_test=reg_normal.predict(X_b_test)#计算正态测试集中的特征与权值的线性组合
error_train=(1/n_samples)*np.sum((y_p_train-y_train)**2)#下面这四个我就不赘述了!解释就在前面的代码块中
error_test=(1/n_samples_test)*np.sum((y_p_test-y_test)**2)
print(f"Error on training set:{np.round(error_train,4)}")
print(f"Error on test set:{np.round(error_test,4)}")

Error on training set: 1.0228

Error on test set: 1.0432
以上是上面代码块的输出。

fig=plt.figure(figsize=(8,6))#设置画布大小
plt.scatter(X_train,y_train)#绘制训练集的散点图
plt.scatter(X_test,y_p_test)#绘制测试集的散点图,注意这里的y_p_test是正态之后的测试集的y
plt.xlabel("First feature")#x轴的标题
plt.ylabel("Second feature")#y轴的标题
plt.show()#显示

在这里插入图片描述

完结撒花!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/171755.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java实现并查集

    Java实现并查集喝杯 82 年的 Java 压压惊这次需要介绍的就是并查集并查集的简单应用就是连通图 网络通信连接等等总之很重要那么先说一下这次的算法是 1 union find 简单并查集 2 quick union 优化的并查集 3 加权值 quick union 处理了 2 的最坏情况 4 路径压缩加权值 quick union 如果只是想要一下算法 你可以直接跳到最后看第 4 个算法接下来 我

    2025年6月1日
    5
  • GPU Parallel Computing

    GPU Parallel Computing

    2021年9月15日
    105
  • 实例与数据库的区别_mysql数据库实例是什么

    实例与数据库的区别_mysql数据库实例是什么mysql目前是开源界应用最为广泛的数据库软件了。相对于重量级的商业产品如oracle、DB2、SQLServer等,Mysql最大的特点就是开源免费。个人用户可以down一个下来,自己搭个网站玩玩。大型互联网企业诸如阿里、网易之类的也可以针对mysql做mysql集群和存储引擎的开发。今天主要是想解释一下mysql体系中,数据库和数据库实例的概念。很多人都在用mysql,也有很多人认为数据库就…

    2022年10月21日
    2
  • fillna函数用法_fill…with

    fillna函数用法_fill…withinplace参数的取值:True、FalseTrue:直接修改原对象False:创建一个副本,修改副本,原对象不变(缺省默认)method参数的取值:{‘pad’,‘ffill’,‘backfill’,‘bfill’,None},defaultNonepad/ffill:用前一个非缺失值去填充该缺失值backfill/bfill:用下一个非缺失值填充该缺失…

    2022年8月12日
    9
  • 运行jar包的命令_命令行打jar包

    运行jar包的命令_命令行打jar包使用cmd运行jar包使用命令行运行iar包使用windows运行jar包怎么在命令行工具中运行jar包呢?找到jar包的位置选中文件所在位置导航栏并输入cmd此时进入命令行工具输入Java-jarHelloWord.jar(注意空格)输入完Java-jar之后可以按tab键找到jar包名字enter…

    2022年10月4日
    2
  • python把数据存入txt_python数据保存为csv文件

    python把数据存入txt_python数据保存为csv文件参考:Python中文件的读取和写入PYTHON将list或/dict对象写入txt/json文件python(如何将数据写入本地txt文本文件)python中文件写入TXTPython中将变量按行写入txt文本中python把变量写入txt文件。Python读写文件python文件操作Python之文件读写Python程序输出到文件中python把一个unicode字符串…

    2022年10月2日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号