基于jupyter notebook的python编程-----利用梯度下降算法求解多元线性回归方程,并与最小二乘法求解进行精度对比目录

  • 一、梯度下降算法的基本原理
    • 1、梯度下降算法的基本原理
  • 二、题目、表格数据、以及python环境搭建
    • 1、多元线性回归分析求解题目
    • 2、准备的多元线性回归方程的变量的表格数据
    • 3、搭建python环境
  • 三、梯度下降算法求解多元线性回归的方程的python代码实现
    • 1、导入基本库、数据,并为变量赋值
    • 2、定义系数初始值以及学习率和迭代次数
    • 3、定义最小二乘法函数-损失函数(代价函数)
    • 4、定义梯度下降算法求解线性回归方程系数python函数
    • 5、代用函数,进行系数求解,并打印
    • 6、画出回归方程线性拟合图
    • 7、题目的整体python代码
    • 8、运行结果如下所示:
  • 四、最小二乘法法求解多元线性回归方程的python代码实现
    • 1、完整的python代码如下:
    • 2、运行结果如下
  • 六、两种方法求解多元线性回归方程的精度对比
    • 1、对运行结果的对比

梯度下降算法是迭代法的一种,可以用于求解最小二乘问题(线性和非线性都可以),在求解机器学习算法的模型参数,即无约束优化问题时,梯度下降(Gradient Descent)是最常采用的方法之一。
在机器学习中,基于基本的梯度下降法发展了两种梯度下降方法,分别为随机梯度下降法和批量梯度下降法。
所以,本次博客,林君学长将带大家了解,如何通过梯度下降算法,求解回归曲线的方程,并与最小二乘法求解方程的精度进行对比

一、梯度下降算法的基本原理

1、梯度下降算法的基本原理

1)、梯度下降算法的基本原理就是通过多次迭代,求得与精度值匹配的最后结果,他的迭代公式如下所示:


2)、梯度下降算法的特点

梯度下降法是一个最优化算法,通常也称为最速下降法。最速下降法是求解无约束优化问题最简单和最古老的方法之一,虽然现在已经不具有实用性,但是许多有效算法都是以它为基础进行改进和修正而得到的。最速下降法是用负梯度方向为搜索方向的,最速下降法越接近目标值,步长越小,前进越慢。

二、题目、表格数据、以及python环境搭建

1、多元线性回归分析求解题目

1)、多元线性回归的题目描述如下:
为求得某个地区的商品店的月营业额是与店铺的面积相关性大,还是与该店距离车站距离的相关性大,需要我们以店铺面积、距离车站的距离、以及月营业额建立线性回归方程,并求解该方程,和相关系数:

2、准备的多元线性回归方程的变量的表格数据

1)、该题目所用的数据如下所示:


从左到右,一次为店铺面积、距离车站距离和月营业额!

3、搭建python环境

1)、打开Windows终端命令行,输入jupyter notebook,打开我们的jupyter工具,如下所示:

2)、在jupyter的web网页中创建python文件,如下所示:

3)、现在就可以在jupyter的代码行里面输入我们的代码啦!

三、梯度下降算法求解多元线性回归的方程的python代码实现

1、导入基本库、数据,并为变量赋值

import numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
data=np.genfromtxt('D:/面积距离车站数据.csv',delimiter=',')
x_data=data[:,:-1]
y_data=data[:,2]

2、定义系数初始值以及学习率和迭代次数

#定义学习率、斜率、截据
#设方程为y=theta1*x1+theta2*x2+theta0
lr=0.00001
theta0=0
theta1=0
theta2=0
#定义最大迭代次数,因为梯度下降法是在不断迭代更新k与b
epochs=10000

3、定义最小二乘法函数-损失函数(代价函数)

#定义最小二乘法函数-损失函数(代价函数)
def compute_error(theta0,theta1,theta2,x_data,y_data):totalerror=0for i in range(0,len(x_data)):#定义一共有多少样本点totalerror=totalerror+(y_data[i]-(theta1*x_data[i,0]+theta2*x_data[i,1]+theta0))**2return totalerror/float(len(x_data))/2

通过代价方程,求解迭代过程中的错误率哦!直观看出求解误差

4、定义梯度下降算法求解线性回归方程系数python函数

#梯度下降算法求解参数
def gradient_descent_runner(x_data,y_data,theta0,theta1,theta2,lr,epochs):m=len(x_data)for i in range(epochs):theta0_grad=0theta1_grad=0theta2_grad=0for j in range(0,m):theta0_grad-=(1/m)*(-(theta1*x_data[j,0]+theta2*x_data[j,1]+theta2)+y_data[j])theta1_grad-=(1/m)*x_data[j,0]*(-(theta1*x_data[j,0]+theta2*x_data[j,1]+theta0)+y_data[j])theta2_grad-=(1/m)*x_data[j,1]*(-(theta1*x_data[j,0]+theta2*x_data[j,1]+theta0)+y_data[j])theta0=theta0-lr*theta0_gradtheta1=theta1-lr*theta1_gradtheta2=theta2-lr*theta2_gradreturn theta0,theta1,theta2

该函数的主要功能就是利用梯度下降算法进行系数的求解,通过多次的迭代,完成近视值的求解!

5、代用函数,进行系数求解,并打印

#进行迭代求解
theta0,theta1,theta2=gradient_descent_runner(x_data,y_data,theta0,theta1,theta2,lr,epochs)
print('结果:迭代次数:{0} 学习率:{1}之后 a0={2},a1={3},a2={4},代价函数为{5}'.format(epochs,lr,theta0,theta1,theta2,compute_error(theta0,theta1,theta2,x_data,y_data)))
print("多元线性回归方程为:y=",theta1,"X1+",theta2,"X2+",theta0)

6、画出回归方程线性拟合图

#画图
ax=plt.figure().add_subplot(111,projection='3d')
ax.scatter(x_data[:,0],x_data[:,1],y_data,c='r',marker='o')
x0=x_data[:,0]
x1=x_data[:,1]
#生成网格矩阵
x0,x1=np.meshgrid(x0,x1)
z=theta0+theta1*x0+theta2*x1
#画3d图
ax.plot_surface(x0,x1,z)
ax.set_xlabel('area')
ax.set_ylabel('distance')
ax.set_zlabel("Monthly turnover")
plt.show()

7、题目的整体python代码

import numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
data=np.genfromtxt('D:/面积距离车站数据.csv',delimiter=',')
x_data=data[:,:-1]
y_data=data[:,2]
#定义学习率、斜率、截据
#设方程为y=theta1x1+theta2x2+theta0
lr=0.00001
theta0=0
theta1=0
theta2=0
#定义最大迭代次数,因为梯度下降法是在不断迭代更新k与b
epochs=10000
#定义最小二乘法函数-损失函数(代价函数)
def compute_error(theta0,theta1,theta2,x_data,y_data):totalerror=0for i in range(0,len(x_data)):#定义一共有多少样本点totalerror=totalerror+(y_data[i]-(theta1*x_data[i,0]+theta2*x_data[i,1]+theta0))**2return totalerror/float(len(x_data))/2
#梯度下降算法求解参数
def gradient_descent_runner(x_data,y_data,theta0,theta1,theta2,lr,epochs):m=len(x_data)for i in range(epochs):theta0_grad=0theta1_grad=0theta2_grad=0for j in range(0,m):theta0_grad-=(1/m)*(-(theta1*x_data[j,0]+theta2*x_data[j,1]+theta2)+y_data[j])theta1_grad-=(1/m)*x_data[j,0]*(-(theta1*x_data[j,0]+theta2*x_data[j,1]+theta0)+y_data[j])theta2_grad-=(1/m)*x_data[j,1]*(-(theta1*x_data[j,0]+theta2*x_data[j,1]+theta0)+y_data[j])theta0=theta0-lr*theta0_gradtheta1=theta1-lr*theta1_gradtheta2=theta2-lr*theta2_gradreturn theta0,theta1,theta2
#进行迭代求解
theta0,theta1,theta2=gradient_descent_runner(x_data,y_data,theta0,theta1,theta2,lr,epochs)
print('结果:迭代次数:{0} 学习率:{1}之后 a0={2},a1={3},a2={4},代价函数为{5}'.format(epochs,lr,theta0,theta1,theta2,compute_error(theta0,theta1,theta2,x_data,y_data)))
print("多元线性回归方程为:y=",theta1,"X1+",theta2,"X2+",theta0)
#画图
ax=plt.figure().add_subplot(111,projection='3d')
ax.scatter(x_data[:,0],x_data[:,1],y_data,c='r',marker='o')
x0=x_data[:,0]
x1=x_data[:,1]
#生成网格矩阵
x0,x1=np.meshgrid(x0,x1)
z=theta0+theta1*x0+theta2*x1
#画3d图
ax.plot_surface(x0,x1,z)
ax.set_xlabel('area')
ax.set_ylabel('distance')
ax.set_zlabel("Monthly turnover")
plt.show()

8、运行结果如下所示:


通过梯度下降算法求解的系数可用通过代价方程看出误差哦,误差还是很大的,基本不是太精确,接下来,我们看一下通过最小二乘法求解的系数吧!

四、最小二乘法法求解多元线性回归方程的python代码实现

由于之前林君学长写过通过最小二乘法来求解多元线性回归方程的分析博客,并且给出了具体的分析,这里就只给出源码和运行结果,如果小伙伴对以下代码不理解的,请参考林君学长写的最小二乘法求解多元线性回归方程的博客哟! 博客链接如下:
https://blog.csdn.net/qq_42451251/article/details/105019128

1、完整的python代码如下:

1)、通过矩阵模拟最小二乘法进行多元线性方程求解的完整代码如下:

#利用线性代数的矩阵模拟最小二乘法求解法求解多元线性回归方程的系数
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
%matplotlib inline
data = np.genfromtxt("D:/面积距离车站数据.csv",delimiter=",")
X1=data[0:10,0]#自变量温度
X2=data[0:10,1]#因变量销售量
Y=data[0:10,2]#自变量温度
#将因变量赋值给矩阵Y1
Y1=np.array([Y]).T
#为自变量系数矩阵X赋值
X11=np.array([X1]).T
X22=np.array([X2]).T
A=np.array([[1],[1],[1],[1],[1],[1],[1],[1],[1],[1]])#创建系数矩阵
B=np.hstack((A,X11))#将矩阵a与矩阵X11合并为矩阵b
X=np.hstack((B,X22))#将矩阵b与矩阵X22合并为矩阵X
#求矩阵X的转置矩阵
X_=X.T
#求矩阵X与他的转置矩阵的X_的乘积
X_X=np.dot(X_,X)
#求矩阵X与他的转置矩阵的X_的乘积的逆矩阵
X_X_=np.linalg.inv(X_X)
#求解系数矩阵W,分别对应截距b、a1、和a2
W=np.dot(np.dot((X_X_),(X_)),Y1)
b=W[0][0]
a1=W[1][0]
a2=W[2][0]
print("系数a1=",a1)
print("系数a2=",a2)
print("截距为=",b)
print("多元线性回归方程为:y=",a1,"X1+",a2,"X2+",b)
#画出线性回归分析图
data1=pd.read_excel('D:\面积距离车站数据.xlsx')
sns.pairplot(data1, x_vars=['area','distance'], y_vars='Y', height=3, aspect=0.8, kind='reg')
plt.show()
#求月销售量Y的和以及平均值y1
sumy=0#因变量的和
y1=0#因变量的平均值
for i in range(0,len(Y)):sumy=sumy+Y[i]
y1=sumy/len(Y)
#求月销售额y-他的平均值的和
y_y1=0#y-y1的值的和
for i in range(0,len(Y)):y_y1=y_y1+(Y[i]-y1)
print("销售量-销售量平均值的和为:",y_y1)
#求预测值sales1
sales1=[]
for i in range(0,len(Y)):sales1.append(a1*X1[i]+a2*X2[i]+b)
#求预测值的平均值y2
y2=0
sumy2=0
for i in range(len(sales1)):sumy2=sumy2+sales1[i]
y2=sumy2/len(sales1)
#求预测值-平均值的和y11_y2
y11_y2=0
for i in range(0,len(sales1)):y11_y2=y11_y2+(sales1[i]-y2)
print("预测销售值-预测销售平均值的和为:",y11_y2)
#求月销售额y-他的平均值的平方和
Syy=0#y-y1的值的平方和
for i in range(0,len(Y)):Syy=Syy+((Y[i]-y1)*(Y[i]-y1))
print("Syy=",Syy)
#求y1-y1平均的平方和
Sy1y1=0
for i in range(0,len(sales1)):Sy1y1=Sy1y1+((sales1[i]-y2)*(sales1[i]-y2))
print("Sy1y1=",Sy1y1)
#(y1-y1平均)*(y-y平均)
Syy1=0
for i in range(0,len(sales1)):Syy1=Syy1+((Y[i]-y1)*(sales1[i]-y2))
print("Syy1=",Syy1)
#求R
R=Syy1/((Syy*Sy1y1)**0.5)
R2=R*R
print("判定系数R2=",R2)

2、运行结果如下

1)、运行结果如下:

六、两种方法求解多元线性回归方程的精度对比

1、对运行结果的对比

1)、梯度下降法的运行结果:

2)、最小二乘法求解对比:

3)、通过excel计算结果对比:

通过以上对比结果可以知道,最小二乘法求解线性回归方程的精度优于梯度下降算法,这也是梯度下降算法的确定,求解精度太低,求解还需要很多次的迭代,所以,现代的人工智能机器学习的深度算法基本已经放弃梯度下降算法的求解,需要多次计算,这对计算机资源来说是一种浪费哦!现代多用于矩阵的最小二乘法进行线性回归系数的求解哦!

以上就是本次博客的全部内容啦,希望通过对本次博客的阅读,小伙伴可以对人工智能机器学习的梯度下降算法有一定的理解哦,遇到问题的小伙伴记得评论区留言,林君学长看到会为大家进行解答的,这个学长不太冷!
陈一月的又一天编程岁月^ _ ^

基于jupyter notebook的python编程-----利用梯度下降算法求解多元线性回归方程,并与最小二乘法求解进行精度对比相关推荐

  1. 基于jupyter notebook的python编程-----MNIST数据集的的定义及相关处理学习

    基于jupyter notebook的python编程-----MNIST数据集的相关处理 一.MNIST定义 1.什么是MNIST数据集 2.python如何导入MNIST数据集并操作 3.接下来, ...

  2. 在python中使用最小二乘法画出拟合曲线_基于jupyter notebook的python编程-----运用最小二乘法,导入文件数据模拟一元线性回归分析...

    基于jupyter notebook的python编程-----运用最小二乘法,导入文件数据模拟一元线性回归分析 用最小二乘法模拟一元线性回去曲线的目录 一.运行jupyter notebook,搭建 ...

  3. 基于jupyter notebook的python编程-----通过python编程实现RSSI测距定位技术仿真

    基于jupyter notebook的python编程-----通过python编程实现RSSI测距定位技术仿真目录 一.RSSI测距定位简介 1.什么是RSSI测距定位 2.RSSI测距定位优点 3 ...

  4. python魔法方法与函数_在Python中画图(基于Jupyter notebook的魔法函数)

    这篇文章主要介绍了在Python中画图(基于Jupyter notebook的魔法函数),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 先展示一段相 ...

  5. Python实战项目:基于jupyter notebook处理16年美国总统大选数据

    Python实战项目:基于jupyter notebook处理16年美国总统大选数据 设计需求说明 源码展示以及实验截图: 总结: 设计需求说明 设计任务 按照月份求两位候选人民调数据的和,用折线图反 ...

  6. 青出于蓝而胜于蓝,这是一款脱胎于 Jupyter Notebook 的新型编程环境

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 转载自:机器之心 不久前,fast.ai 创始研究员 Jeremy Howard ...

  7. 基于Jupyter Notebook从头学习机器学习 | 入门资料分享

    乾明 编译整理  量子位 报道 | 公众号 QbitAI 热心分享机器学习入门资料的人越来越多了. 今天跟大家介绍的是一个名为ZekeLabs的机构推出的机器学习入门资料. ZekeLabs是一个位于 ...

  8. jupyter notebook和python有什么区别_如何在Jupyter Notebook中使用Python虚拟环境?

    如何在使用Jupyter Notebook时,解决Python虚拟环境间的切换问题?本文一步步帮你拆解.希望你能够避免踩坑的痛苦,把更多的时间花在愉快的编程上. 痛点 Python目前有两个主版本并存 ...

  9. 如何基于Jupyter notebook搭建Spark集群开发环境

    摘要:本文介绍如何基于Jupyter notebook搭建Spark集群开发环境. 本文分享自华为云社区<基于Jupyter Notebook 搭建Spark集群开发环境>,作者:apr鹏 ...

最新文章

  1. App-V应用程序虚拟化之二部署Template Server
  2. mathcal 对应于什么库_如何快速构建React组件库
  3. IT人不要一辈子做技术
  4. python web 框架例子_最快的 Python Web 框架入门
  5. leetcode 331. Verify Preorder Serialization of a Binary Tree | 331. 验证二叉树的前序序列化(栈解法)
  6. cors 前后端分离跨域问题_SpringBoot 实现前后端分离的跨域访问(CORS)
  7. 米拓建站系统(MetInfo CMS)文章定时发布软件
  8. apache 的http代理出错 502 Proxy Error
  9. 智能蓝牙控制、温湿度控制时间风扇
  10. .NET环境下几种不同的邮件发送解决方案
  11. 程序员“不会”修电脑的原因
  12. linux中epoll函数,Linux Epoll 函数详解.doc
  13. 吐血分享9个软件下载网站以及那些开发者大佬的传奇人生
  14. 在linux中安装snort框架
  15. linux mbr转gpt分区,免重装!迄今为止最详细的MBR转GPT分区攻略
  16. fopen()的rb+和rw+ (文件操作的小坑)
  17. 近10年NBA球队常规赛排名变化——tableau 实现bump chart
  18. nodejs 运行在tomcat_nodejs和tomcat的区别是什么?
  19. 阿里云OSS配置及使用
  20. Map集合中的常用函数(java)

热门文章

  1. linux apa配置php,Centos 6安装完美搭建mysql、php、apache
  2. 线性代数(2):特殊行列式
  3. html实现简单图片切换,JavaScript实现简单的图片切换
  4. vsnprintf用法解析
  5. UG NX 12 通过点构造面
  6. 微型计算机拆卸安装的注意事项,微型计算机使用注意事项及保养的一般方法.doc...
  7. 微信公众号自动回复 - 自定义设置
  8. liquibase mysql_LiquiBase
  9. 业余草总结常见计算广告点击率预估算法
  10. “阳谷朝天椒”亮相第二十二届中国绿色食品博览会