线性回归:
1.函数模型(Model):
假设有训练数据
那么为了方便我们写成矩阵的形式
2.损失函数(cost):
现在我们需要根据给定的X求解W的值,这里采用最小二乘法。
a.最小二乘法:
我们有很多的给定点,这时候我们需要找出一条线去拟合它,那么我先假设这个线的方程,然后把数据点代入假设的方程得到观测值,求使得实际值与观测值相减的平方和最小的参数。对变量求偏导联立便可求。
因此损失代价函数为:
3.算法(algorithm):
现在我们的目的就是求解出一个使得代价函数最小的W:
a.矩阵满秩可求解时(求导等于0):
b.矩阵不满秩时(梯度下降):
梯度下降算法是一种求局部最优解的方法,对于F(x),在a点的梯度是F(x)增长最快的方向,那么它的相反方向则是该点下降最快的方向,具体参考wikipedia。
原理:将函数比作一座山,我们站在某个山坡上,往四周看,从哪个方向向下走一小步,能够下降的最快;
注意:当变量之间大小相差很大时,应该先将他们做处理,使得他们的值在同一个范围,这样比较准确。
1)首先对θ赋值,这个值可以是随机的,也可以让θ是一个全零的向量。
2)改变θ的值,使得J(θ)按梯度下降的方向进行减少。
描述一下梯度减少的过程,对于我们的函数J(θ)求偏导J:
Repeat until convergence:{
下面是更新的过程,也就是θi会向着梯度最小的方向进行减少。θi表示更新之前的值,-后面的部分表示按梯度方向减少的量,α表示步长,也就是每次按照梯度减少的方向变化多少。
}
假设有数据集D时:
对损失函数求偏导如下:
4.实现
#梯度下降算法
defgradientDescent(X,y,theta,alpha,num_iters):
m =len(y)
n =len(theta)
temp = np.matrix(np.zeros((n,num_iters)))#暂存每次迭代计算的theta,转化为矩阵形式
J_history =np.zeros((num_iters,1))#记录每次迭代计算的代价值
foriinrange(num_iters):#遍历迭代次数
h = np.dot(X,theta)#计算内积,matrix可以直接乘
temp[:,i] = theta -((alpha/m)*(np.dot(np.transpose(X),h-y)))#梯度的计算
theta = temp[:,i]
J_history[i] = computerCost(X,y,theta)#调用计算代价函数
print'.',
returntheta,J_history
领取专属 10元无门槛券
私享最新 技术干货