多维特征(Multiple Features)
多元线性回归,即包含多个变量,比如房子的房龄、面积、房间数等,标记如下:
假设函数就变成了:
可以理解为:
θ0表示基础价格
θ1为每平方价格,X1为平米数
θ2为每层价格,X2为层数
假设函数简写为:
梯度下降就变成了:
左图是之前单变量时的梯度下降,右图是多变量的梯度下降,二者对比如下:
特征值预处理
当几个特征的量级相差过大时,会出现左图的情况,收敛路径复杂且缓慢;
最好将特征都缩放到接近[-1, 1],就能像右图一样收敛形成圆润的等高线,加快收敛,减少迭代次数。
可以使用以下两个技术。
特征缩放(Feature Scaling)
将特征值除以 Xmax - Xmin,得到新的取值范围在1以内的特征。
均值归一(mean normalization)
将xi 替换为xi - ui 来使均值接近0。
两个技术同时应用,即采用以下公式:
ui = mean(x)
si = xmax - xmin
学习速率——α
debug梯度学习
为了确保梯度下降正常工作,可以观察 迭代次数 - 代价函数 的图像:
当J(θ)减少量少于 10-3 时可视为收敛。
学习速率 α 的选取
如果α 太大,可能会出现左侧两图的情况,要么J持续变大,要么上下波动。
但若α 太小,会造成收敛速度过慢。所以可按照以下序列尝试:
α = 0.001,0.003,0.01, 0.03, 0.1, 0.3,1 …
一边画出如上J与iter的函数图,观察效果。
多项式回归
观察面积和价格的关系,假设函数不一定是线性的,也可以是多项式的:
如果选用上面的多项式函数,那么假设函数在x继续增大时会下降,这是不合理的。
此时可选用下面蓝框中的平方根函数(或者三次函数)。
注意,此时特征缩放就很重要了。x x2 x3的量级可能相差巨大。
正态方程(Normal Equation)
不同于梯度下降法,正态方程能用代数方法直接求解最佳的θ值。
即分别令各个偏导为0,求解出θ值:
例如以下例子,可以构造出X和Y后,直接用下面红框里的公式计算出θ的值(具体为啥先不深究):
对比梯度下降法。
梯度下降:
- 需要选择α
- 需要多次迭代
- 当n很大时效果良好,复杂度O(kn2)
正态方程:
- 无需选择α
- 无需多次迭代
- 当n很大时,XT X是一个n * n的矩阵,计算n * n矩阵转置复杂度为O(n3)
- 无法解决逻辑回归和分类等问题
当 n < 1000时(1000个特征以内),会优先使用正态方程。
正态方程中XTX不可逆的情况
- 有多余特征,比如若x1 和 x2是线性相关的,那么XTX不可逆。
- 过多特征,比如 m <= n,样本数小于特征数时,需要删除一些特征,或做正则化(regularization)
Matlab / Octave 常用操作
参考:https://codeantenna.com/a/mVcQGKR7LB#1_3
基础操作
计算数值
>> 5 + 6
ans = 11
>> 3 * 4
ans = 12
>> 1/3
ans = 0.3333
>> 2^6
ans = 64
计算逻辑值
>> 1 == 2
ans = 0
>> 1 ~= 2
ans = 1
>> 1 && 0
ans = 0
>> 1 || 0
ans = 1
变量
>> a = 6
a = 6
>> a = 6; %加上分号可以使变量不打印输出
>>
打印变量
>> a = pi;
>> a
a = 3.1416
>> disp(a) %仅输出a的值
3.1416
>> disp(sprintf("2 decimals : %0.2f",a)) %打印字符串(用c语言的格式)
2 decimals : 3.14
>>
建立矩阵和向量
>> A = [1 2;3 4;5 6] %分号代表矩阵的换行
A =
1 2
3 4
5 6
>> v = [1 2 3] %表示行向量(1*3的矩阵)
v =
1 2 3
>> v = [1;2;3] %表示列向量(3*1的矩阵)
v =
1
2
3
>> v = 1:0.1:2 %表示从1~2每隔0.1取数,得到的是一个行向量
v =
1 至 8 列
1.0000 1.1000 1.2000 1.3000 1.4000 1.5000 1.6000 1.7000
9 至 11 列
1.8000 1.9000 2.0000
>> v = 1:6 %当然也可以不取间隔
v =
1 2 3 4 5 6
用特殊方法建立矩阵
>> ones(2,3) %建立2*3的矩阵,元素全部为1
ans =
1 1 1
1 1 1
>> 2*ones(2,3) %用2*矩阵,元素全部为2
ans =
2 2 2
2 2 2
>> zeros(2,2) %生成零矩阵
ans =
0 0
0 0
>> rand(1,3) %生成0~1的随机矩阵
ans =
0.8147 0.9058 0.1270
>> randn(1,3) %生成高斯分布矩阵(正态分布)均值为0,标准差为1
ans =
0.8622 0.3188 -1.3077
>> >> w = -6 + sqrt(10)*(randn(1,10000)); % 生成均值为-6,方差为10的10000个数据的矩阵
>> hist(w) %将这个矩阵用直方图的形式画出来
>> hist(w,50) %用50个竖条的直方图显示
>> eye(4) %生成单位矩阵
ans =
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
>> eye(3)
ans =
1 0 0
0 1 0
0 0 1
移动数据
矩阵的大小
>> A = [1 2;3 4;5 6]
A =
1 2
3 4
5 6
>> size(A