没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
试读
3页
最小二乘法是先将方程自变量与因变量化为系数矩阵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
资源推荐
资源详情
资源评论
Python-多元线性回归方程比较最小二乘法与梯度下降法多元线性回归方程比较最小二乘法与梯度下降法
最小二乘法是先将方程自变量与因变量化为系数矩阵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 Axes3D
data = 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 = 0
for i in range(0,len(x_data)):#定义一共有多少样本点
totalerror = totalerror+(y_data[i]-(a1*x_data[i,0]+a2*x_data[i,1]+a0))**2
return 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 = 0
a1_grad = 0
a2_grad = 0
for 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_grad
a1 = a1-lr * a1_grad
a2 = a2-lr * a2_grad
return 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()
结果如下:
资源评论
- にしのみやけつげん2023-10-20资源使用价值高,内容详实,给了我很多新想法,感谢大佬分享~
weixin_38675232
- 粉丝: 3
- 资源: 970
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功