梯度下降法
2015-07-03 10:50
253 查看
梯度下降法是一种最优化算法,常用来优化参数,通常也称为最速下降法。
梯度下降法是一般分为如下两步:
1)首先对参数θ赋值,这个值可以是随机的,也可以让θ是一个全零的向量;
2)改变θ的值,使得J(θ)按梯度下降的方向进行减少。
以一个线性回归问题为例,应用libsvm包里的数据heart_scale.mat数据做测试。假设要学习这么一个函数:
那么损失函数可以定义成:
其中X看以看成一行一行的样本向量,那么Θ就是一列一列的了。目标很简单,就是求损失J最小值时候的解Θ:
先直接求导,对于求导过程,详解如下:
首先定义损失变量:
那么损失函数就可以表示成:
一步一步的求导:
再求:
那么把分步骤合起来就是:
令导数为0,求此时的Θ,整理一下,有:
用矩阵符号将上面的细节运算抽象一下:
让导数为0,那么求得的解为:
求解矩阵的逆复杂度有点儿高,可以用梯度下降来求解:
其中γ就是下降的速度,一般是一个小的数值,可以从0.01开始尝试,越大下降越快,收敛越快。
迭代终止的条件取:
部分代码如下:
w_old=zeros(size(X,2),1);%%初始化参数w
k=1;
while 1
minJ_w(k) = 1/2 * (norm(X*w_old - Y))^2; %%损失函数 公式(1) %%norm默认为L2标准化
w_new = w_old - gamma*(X'*X*w_old - X'*Y);%%梯度下降公式
%%公式(2)
if norm(w_new-w_old) < epsilon %%终止条件
W_best = w_new;
break;
end
w_old = w_new;
k=k+1;
end
实验结果:
梯度下降法是一般分为如下两步:
1)首先对参数θ赋值,这个值可以是随机的,也可以让θ是一个全零的向量;
2)改变θ的值,使得J(θ)按梯度下降的方向进行减少。
以一个线性回归问题为例,应用libsvm包里的数据heart_scale.mat数据做测试。假设要学习这么一个函数:
那么损失函数可以定义成:
其中X看以看成一行一行的样本向量,那么Θ就是一列一列的了。目标很简单,就是求损失J最小值时候的解Θ:
先直接求导,对于求导过程,详解如下:
首先定义损失变量:
那么损失函数就可以表示成:
一步一步的求导:
再求:
那么把分步骤合起来就是:
令导数为0,求此时的Θ,整理一下,有:
用矩阵符号将上面的细节运算抽象一下:
让导数为0,那么求得的解为:
求解矩阵的逆复杂度有点儿高,可以用梯度下降来求解:
其中γ就是下降的速度,一般是一个小的数值,可以从0.01开始尝试,越大下降越快,收敛越快。
迭代终止的条件取:
部分代码如下:
w_old=zeros(size(X,2),1);%%初始化参数w
k=1;
while 1
minJ_w(k) = 1/2 * (norm(X*w_old - Y))^2; %%损失函数 公式(1) %%norm默认为L2标准化
w_new = w_old - gamma*(X'*X*w_old - X'*Y);%%梯度下降公式
%%公式(2)
if norm(w_new-w_old) < epsilon %%终止条件
W_best = w_new;
break;
end
w_old = w_new;
k=k+1;
end
实验结果:
相关文章推荐
- 排序算法总结
- How to root Nexus 5 and 4 on Android 5.1.1 Lollipop and install CWM recovery
- Opencv 在图像中插入文字
- Android Studio运行安卓程序报Failure [INSTALL_FAILED_OLDER_SDK]的解决办法
- Trie树学习--数据结构一发
- 常用命令
- 云安全:马其诺防线来了
- java中如何判断一个字符是中文字符
- 1045 - Access denied for user 'root'@'localhost' (using password: NO) xampp
- Java集合总结(二)
- RadioGroup的RadioButton不居中
- Android中的Sqlite中的onCreate方法和onUpgrade
- 阿姆斯特朗数
- Swift下调用Touch ID实现指纹识别
- 文章标题
- Servlet详细介绍,学习笔记
- 内部类的学习总结
- 前端优化:雅虎35条
- Process打开文件
- Visual Studio中判断项目的类型