Linear Regreesion的两种实现方式(Python)
回归分析中,只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析。
通俗解释就是,以一元线性回归为例,你有一个自变量和一个因变量时,你也得到了你样本分布的散点图(训练集),你尝试着画出一条描述这些样本的直线,以描述样本,预测未知的样本会怎样分布。
本文介绍的两种方法为梯度下降法与Normal Equation法。
一、公有过程
以吴恩达的机器学习课程为例:
我们设房子面积为x,对应的房价为y。
假设房价和房子大小可以用h=θ1x+θ2表示,要求出这样一条直线,离所有样本点最近,这就是我们的任务。
显然,我们可以用(y-h)^2 去描述一个点和直线的距离关系,那对于所有样本点来说,∑(y-h)^2就描述了所有点到直线上对应点的距离之和的平方。
因为在∑(y-h)^2 中,y已知,x(h=θ1x+θ2)已知,只有θ1和θ2未知,所以我们将其定义为J(θ1,θ2)=∑(y-h)^2 。
现在我们只需要将使得J最小的θ1,θ2求出来,我们就得到了我们需要的线性关系表达式。
二、梯度下降法
以二次函数为例当我们在(x1,y1)点时,我们不断沿着其切线方向下降,最终到达最小值。
在J(θ1,θ2)中亦是如此,我们的theta1和theta2只要一直沿着J(θ1,θ2)关于theta1的(切线)偏导与theta2的(切线)偏导同时下降,不断更新theta1和theta2,我们就能得到其最小值。
注意这个同时:
左图为同时更新,右图为非同时更新。
这是更新公式(θ0是常数项,对应我的θ2),其中a为学习率,用其缩放步长,m是样本量。
下面是代码
import pandas as pd
data=pd.read_csv('C://data/alabania.csv',names=['X','Y'])
theta0=0
theta1=0
alpha=0.06
n=len(data.X)
for i in range(0,1000):
h0=0
h1=0
for j in range(0,n):
h0=h0+theta0+theta1*data.X[j]-data.Y[j]
h1=h1+(theta0+theta1*data.X[j]-data.Y[j])*data.X[j]
temp0=theta0-alpha*h0/n
temp1=theta1-alpha*h1/n
theta0=temp0
theta1=temp1
print(theta0)
print(theta1)
三、Normal Equation
适用于样本量小(<1,000,000),直接计算,非常方便。
当你得到了,x(自变量),y(因变量),其实就可以直接求出w(系数矩阵)了,上图红圈部分。X为构造矩阵(design matrix),x0设为1。
以下为具体推导:代码:
import numpy as np
import pandas as pd
data=pd.read_csv('C://data/alabania.csv',names=['x','y'])
data=data.dropna(axis=0,how='any')
data.plot.scatter('x','y',label='dot')
plt.show()
data.insert(0,'ones',1)
data.head()
X=data.iloc[:,0:-1]
Y=data.iloc[:,-1]
X=X.values
Y=Y.values
Y=Y.reshape(len(Y),1)
def costFunction(X,Y,theta):
inner=np.power(X@theta-Y,2)
return np.sum(inner)/(2*len(X))
"""方差计算的矩阵形式"""
theta=np.zeros((2,1))
theta.shape
cost_init=costFunction(X,Y,theta)
def NE(X,Y,theta):
theta=np.linalg.inv(X.T@X)@X.T@Y
return theta
theta=NE(X,Y,theta)
print(theta)
四、技巧
1、Features Scaling–Mean Normalization
将x:=(x-avg)/(max-min)使其落在-0.5~0.5这个区间上,方便梯度下降。
2、Finite Iteration
当每次迭代后J下降小于10^-3时,终止迭代。