Mutiple Liner Regression

本文探讨了多元线性回归的概念,包括当特征量大于1时的假设函数和代价函数。接着介绍了梯度下降法用于优化代价函数,以及特征归一化的必要性和方法。还讨论了学习率α的选取策略,以及如何处理非线性函数的拟合问题,建议使用特征缩放以提高模型性能。
摘要由CSDN通过智能技术生成

一.多元线性

在上一节中提到了线性回归,不过特征量x只有1个,当特征量大于1个时,如下表:

住房面积 x 1 x_1 x1层数 x 2 x_2 x2卧室个数 x 3 x_3 x3住宅年数 x 4 x_4 x4售出价格y
21045145460
14163240232
15343230315
8522136178

这时我们的假设函数成为 h = θ 0 + θ 1 x 1 + θ 2 x 2 + θ 3 x 3 + θ 4 x 4 h=\theta_0+\theta_1x_1+\theta_2x_2+\theta_3x_3+\theta_4x_4 h=θ0+θ1x1+θ2x2+θ3x3+θ4x4,所有的参数组成向量 θ \theta θ,所有特征组成向量x,那么假设函数简化为 h = θ T x h=\theta^T x h=θTx,这样转化成矩阵相乘运算,而代价函数还是 J ( θ ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 J(\theta)=\frac{1}{2m}\sum_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})^2 J(θ)=2m1i=1m(hθ(x(i))y(i))2.

二.梯度下降

对代价函数求偏导,使得代价值递减:
θ j = θ j − α ∂ J ∂ θ j = θ j − α 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x ( i ) \theta_j=\theta_j-\alpha \frac{\partial J}{\partial \theta_j}=\theta_j-\alpha \frac {1}{m}\sum_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})x^{(i)} θj=θjαθjJ=θjαm1i=1m(hθ(x(i))y(i))x(i)

三.特征归一化

当两个不同特征之间的值范围相差太大(例如上述的住宅面积和层数两个特征量)时,收敛速度太慢,可以从下图(以后加)中直观的看出:

解决方法

特征缩放:即将所有特征量x缩放至 − 1 ≤ x ≤ 1 -1\leq x\leq 1 1x1的范围,以住宅面积为例,具体方法如下:

  1. x ^ 1 = x 1 − x m i n x m a x − x m i n \hat x_1=\frac{x_1-x_{min}}{x_{max}-x_{min}} x^1=xmaxxminx1xmin
  2. x ^ 1 = x 1 − μ δ \hat x_1=\frac{x_1-\mu}{\delta} x^1=δx1μ

代码

在实际的梯度下降过程中,为加速计算,并不会使用for循环来计算代价函数,而是通过矩阵运算来替代。代码如下:

# 正则化,归一化特征
def normalization(data):
    for i in range(0, data.shape[-1]):
        data[:,i] = (data[:,i]-np.mean(data[:,i]))/np.std(data[:,i])
    return data

x = normalization(x)
x = np.hstack(np.ones((x.shape[0],1)), x)
w = np.random.normal(0, 1, size=(x.shape[1], 1))
learning_rate = 0.1

# 划分训练测试集
train_x, train_y, test_x, test_y = split_train_test_data(x, y)
m = train_x.shape[0]
# train
for i in range(100000):
    h = np.matmul(train_x,w)
    cost = h-train_y
    loss = cost.T@cost
    w = w - learning_rate*(train_x.T@cost)/m
    print("loss:",loss)

# test
test_loss = 0
for i in range(test_x.shape[0]):
    h = np.matmul(test_x,w)
    cost = h-test_y
    test_loss = test_loss + cost.T@cost
print(test_loss/test_x.shape[0])

四.α的取值策略

1.α取值

  1. α过大,可能导致代价函数震荡甚至无法收敛
  2. α过小,收敛速度过慢

2.α取值技巧

尝试多个α值,并观察代价函数的收敛,不断调整α值使得收敛速度和准确度达到平衡.

五.拟合非线性函数

当训练数据用线性函数无法较好拟合时,出现非线性函数.例如假设函数变为 h θ ( x ) = θ 0 + θ 1 x + θ 2 x 2 h_\theta(x)=\theta_0+\theta_1x+\theta_2x^2 hθ(x)=θ0+θ1x+θ2x2
这时我们如何继续使用线性回归来解决该问题呢,方法很简单,就是将 x 2 x^2 x2当做特征量 x 2 x_2 x2,这样假设函数变成了 h θ ( x ) = θ 0 + θ 1 x 1 + θ 2 x 2 h_\theta(x)=\theta_0+\theta_1x_1+\theta_2x_2 hθ(x)=θ0+θ1x1+θ2x2
但是这样 x 2 x_2 x2 x 1 x_1 x1的值相差较大,此时特征缩放就起到了很好的作用.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值