文章目录
多元线性回归模型
在前面的学习中,我们掌握了根据房屋的面积预测房屋价格的方法(单变量线性回归模型),如果我们的房屋特征增加(如增加了房间的个数、房屋的年龄等),在多元变量中,我们该如何进行回归分析呢?
在开始之前,我们先来统一一下后文的符号问题
x j x_j xj:第 j j j 个特征列表
n n n:特征的总数
x ⃗ ( i ) \vec x^{(i)} x (i):第 i i i 个训练示例(在这里实际上是包含了 n n n 个数字的列表),或者我们称为包含第 i i i 个训练示例的所有特征的向量
x j i x_j^{i} xji :第 i i i 个训练样例中的第 j j j 个具体特征
对于单变量的线性回归模型,它是这样的: f ( x ) = w x + b f(x)=w x+b f(x)=wx+b
那么我们可以类比推出, n n n 个特征的多元变量的线性回归模型,是这样的: f ( x ) = w 1 x 1 + w 2 x 2 + ⋅ ⋅ ⋅ + w n x n + b f(x)=w_1 x_1+w_2 x_2+···+w_n x_n+b f(x)=w1x1+w2x2+⋅⋅⋅+wnxn+b
如果你已经学过了线性代数,我们可以写出两个行向量 w ⃗ \vec w w 和 x ⃗ \vec x x
w ⃗ = [ w 1 , w 2 , . . . , w n ] \vec w =[w_1,w_2,...,w_n] w =[w1,w2,...,wn]
x ⃗ = [ x 1 , x 2 , . . . , x n ] \vec x=[x_1,x_2,...,x_n] x =[x1,x2,...,xn]
使用这种表示法,这个模型可以重写为 f ( x ) = w ⃗ ⋅ x ⃗ + b f(x)=\vec w \cdot \vec x+b f(x)=w ⋅x +b
这个模型,就是我们下面要讨论的 多元线性回归模型
矢量化
在实施学习算法的时候,使用矢量化既可以缩短代码,又可以提高运行效率
import numpy as np
w = np.array([1.0, 2.5, -3.3])
b = 4
x = np.array([10, 20, 30])
f ( x ) = w 1 x 1 + w 2 x 2 + ⋅ ⋅ ⋅ + w n x n + b f(x)=w_1 x_1+w_2 x_2+···+w_n x_n+b f(x)=w1x1+w2x2+⋅⋅⋅+wnxn+b
f = w[0] * x[0] + w[1] * x[1] + w[2] * x[2] + b
对于 n 很小的时候,这样编写代码是完全没有问题的
但是如果 n 是 100 甚至于 100,000 ,这么写对于代码甚至计算机的计算效率都是十分低效的
f ( x ) = ∑ i = 1 n w i x i + b f(x)=\sum\limits^n_{i=1}w_ix_i+b f(x)=i=1∑nwixi+b
或许我们可以考虑使用 for
循环
f = 0
for i in range(n):
f = f + w[i] * x[i]
f = f + b
f ( x ) = w ⃗ ⋅ x ⃗ + b f(x)=\vec w \cdot \vec x+b f(x)=w ⋅x +b
因为 numpy
的函数使用并行硬件进行加速的能力,它的运行速度会比 python
快数十倍到百倍
我们可以直接调用两个向量的点积运算函数来实现,当 n 很大的时候,它将比前面两个代码运行得更快
f = np.dot(w,x) + b
它的加速原理是这样的:
用于多元线性回归的梯度下降法
与一元线性回归的梯度下降一样,我们可以写出多元线性回归的梯度下降
重复 {
w 1 = w 1 − α 1 m ∑ i = 1 m ( f ( x ⃗ ( i ) ) − y ( i ) ) x 1 ( i ) w_1=w_1-\alpha\frac{1}{m}\sum\limits_{i=1}^{m} (f(\vec x^{(i)})-y^{(i)})x_1^{(i)} w1=w1−αm1i=1∑m(f(x (i))−y(i))x1(i)
…
w n = w n − α 1 m ∑ i = 1 m ( f ( x ⃗ ( i ) ) − y ( i ) ) x n ( i ) w_n=w_n-\alpha\frac{1}{m}\sum\limits_{i=1}^{m} (f(\vec x^{(i)})-y^{(i)})x_n^{(i)} wn=wn−αm1i=1∑m(f(x (i))−y(i))xn(i)
b = b − α 1 m ∑ i = 1 m ( f ( x ⃗ ( i ) ) − y ( i ) ) b=b-\alpha\frac{1}{m}\sum\limits_{i=1}^{m} (f(\vec x^{(i)})-y^{(i)}) b=b−αm1i=1∑m(f(x (i))−y(i))
并更新 w i ( i = 1 , . . . , n ) , b w_i(i = 1,...,n),b wi(i=1,...,n),b
}
正态方程(只作了解即可)
这是一种仅用于线性回归的算法,是梯度下降的替代方法
你需要知道的:
- 正态方程法可以用于实现线性回归的机器学习库
- 梯度下降法是用于寻找参数 w , b w,b w,b
缺点:
- 不能推广到其他学习算法
- 当特征数量较大(大于10,000)时速度较慢
特征缩放
特征缩放可以使梯度下降运行得更快
对于几个特征值差距比较大的数据集,特征值较大的一方(假设是 x 1 x_1 x1)对应的参数一个非常小的变化,会对估计值产生非常大的影响,相比之下,特征值较小(假设是 x 2 x_2 x2)的一方需要更大的变化才能大大改变预测值
这意味着 w 1 w_1 w1的微小变化,会大大改变成本函数,而对 w 2 w_2 w2的微小变化,几乎不会改变成本函数
如果这样运行梯度下降,在梯度下降的时候,它最终可能会来回弹跳,在经过很长的时间之后它才能找到通往最低点的道路(如图)
在这种情况下,要做的一件有用的事是缩放,将训练数据进行一些转换(即重新标度 x 1 , x 2 x_1,x_2 x1,x2,使其采用彼此可比较的值范围)
接下来我们讨论三种常见的缩放方式
- 特征缩放
将每个原始的 x x x值除以自己范围的最大值,得到比例 x x x的范围
比如:
300 ≤ x 1 ≤ 2000 300 \leq x_1 \leq 2000 300≤x1≤2000 , 0 ≤ x 2 ≤ 5 0 \leq x_2 \leq 5 0≤x2≤5
x 1 , s c a l e d = x 1 2000 x_{1,scaled}=\frac{x_1}{2000} x1,scaled=2000x1 , x 2 , s c a l e d = x 2 5 x_{2,scaled}=\frac{x_2}{5} x2,scaled=5x2
我们就可以得到
0.15 ≤ x 1 , s c a l e d ≤ 1 0.15\leq x_{1,scaled} \leq 1 0.15≤x1,scaled≤1 , 0 ≤ x 2 , s c a l e d ≤ 1 0 \leq x_{2,scaled} \leq 1 0≤x2,scaled≤1
- 平均值标准化
先求出特征值的平均值 μ \mu μ,然后通过公式 x s c a l e d = x − μ m a x − m i n x_{scaled}=\frac{x-\mu}{max-min} xscaled=max−minx−μ求出新 x x x的范围
比如:
300 ≤ x 1 ≤ 2000 300 \leq x_1 \leq 2000 300≤x1≤2000 (假设 μ 1 = 600 \mu_1=600 μ1=600) , 0 ≤ x 2 ≤ 5 0 \leq x_2 \leq 5 0≤x2≤5 (假设 μ 2 = 2.3 \mu_2=2.3 μ2=2.3)
x 1 , s c a l e d = x 1 − 600 2000 − 300 x_{1,scaled}=\frac{x_1-600}{2000-300} x1,scaled=2000−300x1−600 , x 2 , s c a l e d = x 2 − 2.3 5 − 0 x_{2,scaled}=\frac{x_2-2.3}{5-0} x2,scaled=5−0x2−2.3
我们就可以得到
− 0.18 ≤ x 1 , s c a l e d ≤ 0.82 -0.18\leq x_{1,scaled} \leq 0.82 −0.18≤x1,scaled≤0.82 , − 0.46 ≤ x 2 , s c a l e d ≤ 0.54 -0.46 \leq x_{2,scaled} \leq 0.54 −0.46≤x2,scaled≤0.54
- Z-score 归一化
先求出特征值的平均值 μ \mu μ,标准差 σ \sigma σ,然后通过公式 x s c a l e d = x − μ σ x_{scaled}=\frac{x-\mu}{\sigma} xscaled=σx−μ求出新 x x x的范围
比如:
300 ≤ x 1 ≤ 2000 300 \leq x_1 \leq 2000 300≤x1≤2000 (假设 μ 1 = 600 , σ 1 = 450 \mu_1=600,\sigma_1=450 μ1=600,σ1=450) , 0 ≤ x 2 ≤ 5 0 \leq x_2 \leq 5 0≤x2≤5 (假设 μ 2 = 2.3 , σ 2 = 1.4 \mu_2=2.3,\sigma_2=1.4 μ2=2.3,σ2=1.4)
x 1 , s c a l e d = x 1 − 600 450 x_{1,scaled}=\frac{x_1-600}{450} x1,scaled=450x1−600 , x 2 , s c a l e d = x 2 − 2.3 1.4 x_{2,scaled}=\frac{x_2-2.3}{1.4} x2,scaled=1.4x2−2.3
我们就可以得到
− 0.67 ≤ x 1 , s c a l e d ≤ 3.1 -0.67\leq x_{1,scaled} \leq 3.1 −0.67≤x1,scaled≤3.1 , − 1.6 ≤ x 2 , s c a l e d ≤ 1.9 -1.6 \leq x_{2,scaled} \leq 1.9 −1.6≤x2,scaled≤1.9
标签:吴恩达,缩放,矢量化,scaled,leq,2000,vec,x2,x1 From: https://blog.csdn.net/2302_80870437/article/details/140560525