1.python-梯度下降法 做重回归分析

准备好数据文件csv:

python怎么做meta数据提取 用python做meta分析_迭代


直接上代码:

import numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
data=np.genfromtxt('./漫画数据2.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=0
    for i in range(0,len(x_data)):#定义一共有多少样本点
        totalerror=totalerror+(y_data[i]-(theta1*x_data[i,0]+theta2*x_data[i,1]+theta0))**2
    return 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=0
        theta1_grad=0
        theta2_grad=0
        for 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_grad
        theta1=theta1-lr*theta1_grad
        theta2=theta2-lr*theta2_grad
    return 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()

结果:

python怎么做meta数据提取 用python做meta分析_python怎么做meta数据提取_02

2.与之前最小二乘法结果进行比较

最小二乘法:

多元线性回归方程为:y= 41.51X1+ -0.34 X2+ 65.32

梯度下降法:

多元线性回归方程为:y= 45.05X1+ -0.19 X2+ 5.37

发现结果不一致,但又相似。那我们就来看看原理!

3.梯度下降法原理

参考来源:https://www.jianshu.com/p/424b7b70df7b

一句话概括

梯度下降法(Gradient Descent,GD)是一种常用的求解无约束最优化问题的方法,在最优化、统计学以及机器学习等领域有着广泛的应用。

举例分析

假设这样一个场景:一个人需要从山的某处开始下山,尽快到达山底。在下山之前他需要确认两件事:
下山的方向
下山的距离

这是因为下山的路有很多,他必须利用一些信息,找到从该处开始最陡峭的方向下山,这样可以保证他尽快到达山底。此外,这座山最陡峭的方向并不是一成不变的,每当走过一段规定的距离,他必须停下来,重新利用现有信息找到新的最陡峭的方向。通过反复进行该过程,最终抵达山底。

python怎么做meta数据提取 用python做meta分析_梯度下降法_03


在选择每次行动的距离时,如果所选择的距离过大,则有可能偏离最陡峭的方向,甚至已经到达了最低点却没有停下来,从而跨过最低点而不自知,一直无法到达山底;如果距离过小,则需要频繁寻找最陡峭的方向,会非常耗时。要知道,每次寻找最陡峭的方向是非常复杂的!同样的,梯度下降法也会面临这个问题,因此需要我们找到最佳的学习率,在不偏离方向的同时耗时最短。

梯度下降法的一般求解框架

1.给定待优化连续可微函数python怎么做meta数据提取 用python做meta分析_梯度下降法_04、学习率python怎么做meta数据提取 用python做meta分析_多元线性回归_05以及一组初始值python怎么做meta数据提取 用python做meta分析_梯度下降法_06

2.计算待优化函数梯度:python怎么做meta数据提取 用python做meta分析_python怎么做meta数据提取_07

3.更新迭代公式:python怎么做meta数据提取 用python做meta分析_迭代_08

4.计算\Theta^{0+1}处函数梯度python怎么做meta数据提取 用python做meta分析_梯度下降法_09

5.计算梯度向量的模来判断算法是否收敛:python怎么做meta数据提取 用python做meta分析_python怎么做meta数据提取_10

6.若收敛,算法停止,否则根据迭代公式继续迭代

根据计算梯度时所用数据量不同,可以分为三种基本方法:批量梯度下降法、小批量梯度下降法以及随机梯度下降法。详情请见:https://www.jianshu.com/p/424b7b70df7b

简单实例

求:python怎么做meta数据提取 用python做meta分析_梯度下降法_11

解:

设初始点为python怎么做meta数据提取 用python做meta分析_迭代_12,学习率设为python怎么做meta数据提取 用python做meta分析_多元线性回归_13

初始点处梯度为python怎么做meta数据提取 用python做meta分析_python怎么做meta数据提取_14,因此更新迭代公式带入原函数中,得:

python怎么做meta数据提取 用python做meta分析_梯度下降法_15此时python怎么做meta数据提取 用python做meta分析_python怎么做meta数据提取_16为函数极小点,因此:

python怎么做meta数据提取 用python做meta分析_python怎么做meta数据提取_17,一次迭代结束。

再将python怎么做meta数据提取 用python做meta分析_python怎么做meta数据提取_18作为初始点,重复上面的迭代步骤,得到:python怎么做meta数据提取 用python做meta分析_多元线性回归_19

根据规律显然可知,python怎么做meta数据提取 用python做meta分析_迭代_20
容易看出,本例中目标函数python怎么做meta数据提取 用python做meta分析_梯度下降法_21是三维空间中的椭圆抛物面,其投影至二维空间上的等高线是一簇椭圆(如下图所示)。python怎么做meta数据提取 用python做meta分析_梯度下降法_21的极小点就是这簇椭圆的中心python怎么做meta数据提取 用python做meta分析_迭代_23。我们求得的迭代公式python怎么做meta数据提取 用python做meta分析_迭代_24是逐渐趋近于x^{*}的,算法正确有效。

4.牛顿法原理

参考来源:https://www.jianshu.com/p/287b43e837c1

问题描述

f(x)是python怎么做meta数据提取 用python做meta分析_迭代_25上具有二阶连续偏导的函数,求python怎么做meta数据提取 用python做meta分析_梯度下降法_26

原理

(1) 二阶泰勒展开
python怎么做meta数据提取 用python做meta分析_python怎么做meta数据提取_27

(2) 利用极值点导数为0求python怎么做meta数据提取 用python做meta分析_python怎么做meta数据提取_28
python怎么做meta数据提取 用python做meta分析_python怎么做meta数据提取_28为极值点,则它的导数python怎么做meta数据提取 用python做meta分析_python怎么做meta数据提取_30,通过对二阶泰勒展开式求导可得:
python怎么做meta数据提取 用python做meta分析_迭代_31

算法流程

输入:目标函数python怎么做meta数据提取 用python做meta分析_python怎么做meta数据提取_32,梯度python怎么做meta数据提取 用python做meta分析_迭代_33,黑塞矩阵python怎么做meta数据提取 用python做meta分析_梯度下降法_34,精度要求python怎么做meta数据提取 用python做meta分析_梯度下降法_35
输出:python怎么做meta数据提取 用python做meta分析_python怎么做meta数据提取_32的极小值点
(1) 取初值python怎么做meta数据提取 用python做meta分析_多元线性回归_37,置python怎么做meta数据提取 用python做meta分析_多元线性回归_38
(2) 计算python怎么做meta数据提取 用python做meta分析_python怎么做meta数据提取_39
(3) 若python怎么做meta数据提取 用python做meta分析_梯度下降法_40,则停止计算,得解python怎么做meta数据提取 用python做meta分析_迭代_41
(4) 计算python怎么做meta数据提取 用python做meta分析_多元线性回归_42
(5) 计算python怎么做meta数据提取 用python做meta分析_梯度下降法_43
(6)$ k=k+1$,转(2)