UFLDL 教程学习笔记(三)
2015-09-12 17:20
357 查看
教程地址:http://ufldl.stanford.edu/tutorial/supervised/SoftmaxRegression/
logsticregression是二分类的问题,如果想要多分类,就得用softmaxregression。
这节比较难理解的是costfunction,实际上,costfunction就是最大似然估计加上了个负号。
理论部分参考这位博主的博文:http://www.cnblogs.com/tornadomeet/archive/2013/03/22/2975978.html
要注意logisticregression和softmaxregression之间的不同,在不同场合用不同的方法。
实验部分看了好久,一直不明白,一是因为matlab不熟悉,还有一方面是变量的维数一直没搞明白。
这位博主给出了代码的详细解释,还是懵懵懂懂:http://www.cnblogs.com/happylion/p/4225830.html
他的字体不容易看,我重新整理下,并加些注释。
我们首先展示下我们训练样本部分的图片和label:
下面我们进行训练,首先我们定义一些softmax模型常量:
初始化模型参数:
[/code]
[/code]
接下来也是最重要的一步就是:给定模型参数的情况下,求训练样本的softmax的costfunction和梯度,即
接下来我们就要写softmax_regression_vec函数:
[/code]
[/code]
我们想求梯度矩阵g,这里的g和θ=[θ1,θ2,…,θk]矩阵大小size一样(跟博客中的θ矩阵存在转置关系,之所有代码中这么做,是因为这样再把参数矩阵转成一个向量或转回去利用g(:)或reshape函数按列比较方面),
是n行k列的矩阵。n是θj或一个样本xi(包括截距1这一维)的维度大小,k是类别个数。m是样本个数。
我们想用矢量编程来求g矩阵:
我们有样本X(代码中每一列是一个样本,也即X为n行m列),那么g=(1/m).*X*(p'-d)即是。比如,X的第i行乘以(p'-d)的第j列就是X(i,j)的值。(正是这种行向量乘以列向量是对应元素相乘再相加就完成了公式里的Σ,这也是矢量编程的核心)
ok,现在我们这个函数写完了,我们想验证下,我们写的这个求导数或着说梯度的这个公式正确不正确,我们还是用之前博客提到的用求导公式来验证,因为你求softmax模型某个参数的导数跟你输入的数据是什么、多少都没有关系,所以我们这有用一些简单的随意写得数据和label,然后随意取一个参数进行验证是不是正确,这些程序在前面已经有了,就不进行讲解了。
这段程序没跑过,有空跑跑看。
[/code]
[/code]
[/code]
[/code]
logsticregression是二分类的问题,如果想要多分类,就得用softmaxregression。
这节比较难理解的是costfunction,实际上,costfunction就是最大似然估计加上了个负号。
理论部分参考这位博主的博文:http://www.cnblogs.com/tornadomeet/archive/2013/03/22/2975978.html
要注意logisticregression和softmaxregression之间的不同,在不同场合用不同的方法。
实验部分看了好久,一直不明白,一是因为matlab不熟悉,还有一方面是变量的维数一直没搞明白。
这位博主给出了代码的详细解释,还是懵懵懂懂:http://www.cnblogs.com/happylion/p/4225830.html
他的字体不容易看,我重新整理下,并加些注释。
我们首先展示下我们训练样本部分的图片和label:
下面我们进行训练,首先我们定义一些softmax模型常量:
4:lambda=1e-4;%Weightdecayparameter 导入训练样本数据
初始化模型参数:
[code] [code]
[/code]
[/code]
接下来也是最重要的一步就是:给定模型参数的情况下,求训练样本的softmax的costfunction和梯度,即
[code] [code]1:[cost,grad]=softmax_regression_vec(theta,inputData,labels,lambda);
接下来我们就要写softmax_regression_vec函数:
[/code]
[/code]
2:f=-(1/m)*sum(values)+lambda/2*sum(theta(:).^2);%这个就是costfunction
最后求梯度:
4:g=g(:);%再还原成向量的形式,这里(:)和reshape都是按列进行的,所以里面位置并没有改变。
注:sparse(i,j,s,m,n)构成一个稀疏矩阵,full则是把稀疏矩阵转为全矩阵。具体参考:http://blog.csdn.net/meng4411yu/article/details/8840612
下面这段话我没看明白:
我们想求梯度矩阵g,这里的g和θ=[θ1,θ2,…,θk]矩阵大小size一样(跟博客中的θ矩阵存在转置关系,之所有代码中这么做,是因为这样再把参数矩阵转成一个向量或转回去利用g(:)或reshape函数按列比较方面),
是n行k列的矩阵。n是θj或一个样本xi(包括截距1这一维)的维度大小,k是类别个数。m是样本个数。
我们想用矢量编程来求g矩阵:
我们有样本X(代码中每一列是一个样本,也即X为n行m列),那么g=(1/m).*X*(p'-d)即是。比如,X的第i行乘以(p'-d)的第j列就是X(i,j)的值。(正是这种行向量乘以列向量是对应元素相乘再相加就完成了公式里的Σ,这也是矢量编程的核心)
ok,现在我们这个函数写完了,我们想验证下,我们写的这个求导数或着说梯度的这个公式正确不正确,我们还是用之前博客提到的用求导公式来验证,因为你求softmax模型某个参数的导数跟你输入的数据是什么、多少都没有关系,所以我们这有用一些简单的随意写得数据和label,然后随意取一个参数进行验证是不是正确,这些程序在前面已经有了,就不进行讲解了。
这段程序没跑过,有空跑跑看。
[code] [code]
[/code]
[/code]
[code] [code]
[/code]
[/code]
相关文章推荐
- gitlab安装
- cocos2dx环境和相关命令
- Java设计模式——代理模式
- Permutations
- Permutations II
- Combinations
- C语言:二叉树的相关操作
- 黑马程序员——IO流(上)
- codeforces 505B B. Mr. Kitayuta's Colorful Graph(bfs)
- 内核调试
- 最长递增子序列的nlog(n)算法
- 黑马程序员—Java基础—字符、随机数、包、for循环
- hibernate映射文件之<set>
- Subsets
- Subsets II
- Spark1.0.2 Standalone 模式部署
- 我创建的问题库,提问单及班级
- 烂泥:vcenter通过模板部署vm
- 重新安装了mysql,以前的数据库如何导入到新的数据库
- JAVA中使用Redis