最小二乘法是先将方程自变量与因变量化为系数矩阵X,再求该矩阵的转置矩阵(X1),接着求矩阵X与他的转置矩阵的X1的乘积(X2),然后求X2的逆矩阵。最后整合为系数矩阵W,求解后分别对应截距b、a1、和a2。可见计算一个矩阵的逆是相当耗费时间且复杂的,而且求逆也会存在数值不稳定的情况。
梯度下降法迭代的次数可能会比较多,但是相对来说计算量并不是很大。且其有收敛性保证。故在大数据量的时候,使用梯度下降法比较好。

梯度下降法

import numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3Ddata = np.genfromtxt('test.csv',delimiter=',')
x_data = data[:,:-1]
y_data = data[:,2]#定义学习率、斜率、截据
#设方程为y=a1x1+a2x2+a0
lr = 0.00001
a0 = 0
a1 = 0
a2 = 0
#定义最大迭代次数,因为梯度下降法是在不断迭代更新k与b
epochs = 10000
#定义最小二乘法函数-损失函数(代价函数)
def compute_error(a0,a1,a2,x_data,y_data):totalerror = 0for i in range(0,len(x_data)):#定义一共有多少样本点totalerror = totalerror+(y_data[i]-(a1*x_data[i,0]+a2*x_data[i,1]+a0))**2return totalerror/float(len(x_data))/2
#梯度下降算法求解参数
def gradient_descent_runner(x_data,y_data,a0,a1,a2,lr,epochs):m = len(x_data)for i in range(epochs):a0_grad = 0a1_grad = 0a2_grad = 0for j in range(0,m):a0_grad -= (1/m)*(-(a1*x_data[j,0]+a2*x_data[j,1]+a2)+y_data[j])a1_grad -= (1/m)*x_data[j,0]*(-(a1*x_data[j,0]+a2*x_data[j,1]+a0)+y_data[j])a2_grad -= (1/m)*x_data[j,1]*(-(a1*x_data[j,0]+a2*x_data[j,1]+a0)+y_data[j])a0 = a0-lr * a0_grada1 = a1-lr * a1_grada2 = a2-lr * a2_gradreturn a0,a1,a2#进行迭代求解
a0,a1,a2 = gradient_descent_runner(x_data,y_data,a0,a1,a2,lr,epochs)
print('结果:迭代次数:{0} 学习率:{1}之后 a0={2},a1={3},a2={4},代价函数为{5}'.format(epochs,lr,a0,a1,a2,compute_error(a0,a1,a2,x_data,y_data)))
print("多元线性回归方程为:y=",a1,"X1",a2,"X2+",a0)#画图
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 = a0+a1*x0+a2*x1#画3d图
ax.plot_surface(x0,x1,z)
ax.set_xlabel('area')
ax.set_ylabel('distance')
ax.set_zlabel("Monthly turnover")
plt.show()

结果如下:

最小二乘法

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
%matplotlib inlinedata = np.genfromtxt("test.csv",delimiter=",") #导入.csv文件数据
X1 = data[0:10,0] #自变量1
X2 = data[0:10,1] #自变量2
Y = data[0:10,2] #因变量销售量Y1 = np.array([Y]).T #将因变量赋值给矩阵Y1
X11 = np.array([X1]).T #为自变量系数矩阵X赋值
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合并为矩阵XX7 = X.T #矩阵X的转置矩阵
X8 = np.dot(X7,X) #求矩阵X与他的转置矩阵的X7(X的转置矩阵)的乘积
X9 = np.linalg.inv(X8) #X8的逆矩阵
W = np.dot(np.dot((X9),(X7)),Y1) #求解系数矩阵W,分别对应截距b、a1、和a2
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('test.xlsx') #导入.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)

结果如下:

Python-多元线性回归方程比较最小二乘法与梯度下降法相关推荐

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

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

  2. Python实现多元线性回归方程梯度下降法与求函数极值

    梯度下降法 梯度下降法的基本思想可以类比为一个下山的过程. 假设这样一个场景:一个人被困在山上,需要从山上下来(找到山的最低点,也就是山谷).但此时山上的浓雾很大,导致可视度很低:因此,下山的路径就无 ...

  3. R语言与多元线性回归方程及各种检验

    R语言与多元线性回归方程及各种检验 文章目录 R语言与多元线性回归方程及各种检验 一.模型建立 二.多重共线性 (1)产生的背景: (2)多重共线性的检验 1.简单相关系数法: 2.方差膨胀因子(vi ...

  4. 多元线性回归方程原理及其推导

    多元线性方程原理及推导 概念 1.在统计学中,线性回归方程是利用最小二乘函数对一个或多个自变量之间关系进行建模的一种回归分析.这种函数是一个或多个称为回归系数的模型参数的线性组合.只有一个自变量的情况 ...

  5. 最小二乘法、梯度下降法以及最大似然法之间区别整理

    一.最小二乘法(least square method) 转自https://blog.csdn.net/suibianshen2012/article/details/51532003 1.背景 先 ...

  6. 最小均方误差的推导+最小二乘法、梯度下降法、牛顿法、高斯牛顿法

    最小二乘法(又称最小平方法)是一种数学优化技术.它通过最小化误差的平方和寻找数据的最佳函数匹配.利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小.最小二乘法 ...

  7. python计算线性回归方程

    野鸡大学大二机械系学生,最近做大物实验处理数据有用到计算线性回归方程,正好在自己慢慢啃python,于是在一个摸鱼的下午敲了这段代码.希望能给各位初学者一点点帮助! 欢迎各位python新手一起来交流 ...

  8. 线性回归算法(涉及最小二乘法、梯度下降法)

    目录: 一.简单线性回归算法 二.向量化 三.衡量线性回归法的指标MSE.RMS.MAE.R Squared 指标 四,多元线性回归(最小二乘法) 五.多元线性回归(梯度下降法) 一.简单线性回归算法 ...

  9. 最小二乘法MSE 梯度下降法

    为什么要比较这两种方法呢?很多人可能不知道,我先简单的介绍一下 机器学习有两种,一种是监督学习,另一种是非监督学习.监督学习就是我告诉计算机你把班上同学分个类,分类标准是按照性别,男生和女生:非监督分 ...

最新文章

  1. Javascript原型链
  2. Myeclipse 8.0 +Flash builder 4 plugin 的实现
  3. 黑群晖docker清理缓存_群晖NAS后台容量查询及文件删除(附download station缓存删除方法)...
  4. profile之springboot
  5. Linux必知必会的基本命令和部署项目流程
  6. mysql去掉小数点多余0_mysql数据库个性化需求:版本号排序
  7. ipfs操作mysql_IPFS 使用入门
  8. Java 找到并返回一组字符串中第一个不为空的字符串
  9. 深度学习笔记 | 第16讲:语音识别——一份简短的技术综述
  10. axios封装接口步骤详解
  11. endnotex9安装后使用方法_endnotex9使用教程
  12. ACER-4738ZG 拆机改散热
  13. php秒杀负库存问题,店铺商品出现负库存原因分析,负库存商品处理规范
  14. 步进电机驱动控制总结(一)
  15. GUET第五组2021——随机森林
  16. MathJax 引擎数学符号说明
  17. 准标准模式和标准模式之间的差别-1(旧文首发)
  18. PADS-Logic学习笔记
  19. Java中高级面试题部分答案解析(3)
  20. error C2065: “IDD_DIALOG1”: 未声明的标识符 .

热门文章

  1. matlab--CVX优化工具包安装
  2. 可以输出自己的源程序代码(quine)
  3. 用JS打印星号(*)三角
  4. 残差神经网络 ResNet
  5. 培训机构00后 上海面试心得
  6. Matlab材料科学基础——作出特定晶面指数在简单体心立方中所表示的面
  7. 单片机系列(2)流水灯程序是如何写入单片机的
  8. ubuntu强制退出当前命令
  9. POJ2987 Firing
  10. ssm基于java的儿童成长记录系统