线性回归中的梯度下降法代码

1、基本理论

代价函数(线性回归的优化目标)

在这里插入图片描述

线性回归梯度下降步骤:

!所有参数集体更新后再开始下一轮迭代

2、代码展示

#X表示训练的属性集矩阵;
#Y表示监督训练中的标签值矩阵;
#theta表示参数矩阵,各参数均保存于此;
#alpha表示学习率;
#times表示梯度下降的执行次数,
#在代码中是通过设置times来达到让theta参数收敛的目的;
import numpy as np
def costfun(X,Y,theta): #定义代价值,表示此时曲线与各点的“代价”
    cost = np.sum(np.multiply((X*theta.T - Y),(X*theta.T - Y)))/(2*len(X))
    return cost
 #######################################
cost = np.zeros(1000) #保存每次更新的代价值
def gradient_descent(X,Y,theta,alpha,times):
temp = np.matrix(np.zeros(theta.shape[1])) #temp矩阵用于临时保存上一次theta矩阵
for i in range(times):
    D_value = (X*theta.T - Y).T #这里转置提前了,没啥特殊含义,本质都是为了算后面的term
    for j in range(theta.shape[1]):
        term = D_value*X[:,j]
        temp[0,j] = theta[0,j] - (alpha/len(X))*np.sum(term)
        #之所以使用np.sum()(其作用是计算矩阵中各元素的和),如果直接带入
        #term,numpy会将term视为矩阵,无法参数和theta[0,j]的相减运算,会报错
    theta = temp #更新theta矩阵
    cost[i] = costfun(X,Y,theta) 

3、 拓展

X矩阵的处理

在运行上述代码时,为了让X与theta矩阵对齐,需要在X矩阵的第一列添加一列1,具体可以去看吴老师的课程,另外西瓜书上也是类似的思想,方便矩阵操作和运算。

归一化

如果各个特征之间的值差距过大,比如属性X1的范围为[1000,2000],而属性X2的范围为[0.01,0.02],这样的情况不利于梯度下降的算法,为了加快梯度下降,一般对各个特征进行归一化,具体方法如下:

X = (X - X.mean())/X.std()

Andrew Wu 建议让属性的值保持在[-3,3]即可

多项式回归

有时候线性的模型并不能保证能够拟合训练集,如下图:
在这里插入图片描述
处理方式十分简单:
在这里插入图片描述
例如上图,如果需要拟合三次多项式,可以进行以上操作,但这样的操作可能导致属性的值差距过大,可能会需要归一化的操作

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值