梯度下降3

来源:互联网 发布:python lxml 编辑:程序博客网 时间:2024/05/05 10:13

批量梯度下降是一种对参数的update进行累积,然后批量更新的一种方式。用于在已知整个训练集时的一种训练方式,但对于大规模数据并不合适。

随机梯度下降是一种对参数随着样本训练,一个一个的及时update的方式。常用于大规模训练集,当往往容易收敛到局部最优解。

详细参见:Andrew Ng 的Machine Learning的课件(见参考1)

可能存在的改进

1)样本可靠度,特征完备性的验证

      例如可能存在一些outlier,这种outlier可能是测量误差,也有可能是未考虑样本特征,例如有一件衣服色彩评分1分,料子1分,确可以卖到10000万元,原来是上面有一个姚明的签名,这个特征没有考虑,所以出现了训练的误差,识别样本中outlier产生的原因。

2)批量梯度下降方法的改进

      并行执行批量梯度下降

3)随机梯度下降方法的改进

      找到一个合适的训练路径(学习顺序),去最大可能的找到全局最优解


4)假设合理性的检验

     H(X)是否合理的检验


5)维度放大

    维度放大和过拟合问题,维度过大对训练集拟合会改善,对测试集的适用性会变差,如果找到合理的方法?

 


下面是我做的一个实验

假定有这样一个对衣服估价的训练样本,代码中matrix表示,第一列表示色彩的评分,第二列表示对料子质地的评分,例如第一个样本1,4表示这件衣服色彩打1分,料子打4分。我们需要训练的是theta,其表示在衣服的估价中,色彩和料子的权重,这个权重是未知量,是需要训练的,训练的依据是这四个样本的真实价格已知,分别为19元,...20元。

通过批量梯度下降和随机梯度下降的方法均可得到theta_C={3,4}T


/*
Matrix_A
1   4
2   5
5   1
4   2
theta_C

?

?
Matrix_A*theta_C
19
26
19
20
*/

批量梯度下降法:

[cpp] view plaincopy
  1. #include "stdio.h"  
  2.   
  3. int main(void)  
  4. {  
  5.         float matrix[4][2]={{1,4},{2,5},{5,1},{4,2}};  
  6.         float result[4]={19,26,19,20};  
  7.         float theta[2]={2,5};                   //initialized theta {2,5}, we use the algorithm to get {3,4} to fit the model  
  8.         float learning_rate = 0.01;  
  9.         float loss = 1000.0;                    //set a loss big enough  
  10.   
  11.         for(int i = 0;i<100&&loss>0.0001;++i)  
  12.         {  
  13.                 float error_sum = 0.0;  
  14.                 for(int j = 0;j<4;++j)  
  15.                 {  
  16.                         float h = 0.0;  
  17.                         for(int k=0;k<2;++k)  
  18.                         {  
  19.                                 h += matrix[j][k]*theta[k];  
  20.                         }  
  21.                         error_sum = result[j]-h;  
  22.                         for(int k=0;k<2;++k)  
  23.                         {  
  24.                                 theta[k] += learning_rate*(error_sum)*matrix[j][k];  
  25.                         }  
  26.                 }  
  27.                 printf("*************************************\n");  
  28.                 printf("theta now: %f,%f\n",theta[0],theta[1]);  
  29.                 loss = 0.0;  
  30.                 for(int j = 0;j<4;++j)  
  31.                 {  
  32.                         float sum=0.0;  
  33.                         for(int k = 0;k<2;++k)  
  34.                         {  
  35.   
  36.   
  37.                                 sum += matrix[j][k]*theta[k];  
  38.                         }  
  39.                         loss += (sum-result[j])*(sum-result[j]);  
  40.                 }  
  41.                 printf("loss  now: %f\n",loss);  
  42.         }  
  43.         return 0;  
  44. }  

随机梯度下降法

[cpp] view plaincopy
  1. int main(void)  
  2. {  
  3.         float matrix[4][2]={{1,4},{2,5},{5,1},{4,2}};  
  4.         float result[4]={19,26,19,20};  
  5.         float theta[2]={2,5};  
  6.         float loss = 10.0;  
  7.         for(int i =0 ;i<100&&loss>0.001;++i)  
  8.         {  
  9.                 float error_sum=0.0;  
  10.                 int j=i%4;  
  11.                 {  
  12.                         float h = 0.0;  
  13.                         for(int k=0;k<2;++k)  
  14.                         {  
  15.                                 h += matrix[j][k]*theta[k];  
  16.   
  17.                         }  
  18.                         error_sum = result[j]-h;  
  19.                         for(int k=0;k<2;++k)  
  20.                         {  
  21.                                 theta[k] = theta[k]+0.01*(error_sum)*matrix[j][k];  
  22.                         }  
  23.                 }  
  24.                 printf("%f,%f\n",theta[0],theta[1]);  
  25.                 float loss = 0.0;  
  26.                 for(int j = 0;j<4;++j)  
  27.                 {  
  28.                         float sum=0.0;  
  29.                         for(int k = 0;k<2;++k)  
  30.                         {  
  31.   
  32.                                 sum += matrix[j][k]*theta[k];  
  33.                         }  
  34.                         loss += (sum-result[j])*(sum-result[j]);  
  35.                 }  
  36.                 printf("%f\n",loss);  
  37.         }  
  38.         return 0;  
  39. }  


转载自:http://blog.csdn.net/pennyliang/article/details/6998517

参考:

【1】http://www.stanford.edu/class/cs229/notes/cs229-notes1.pdf 

【2】http://www.cnblogs.com/rocketfan/archive/2011/02/27/1966325.html

【3】http://www.dsplog.com/2011/10/29/batch-gradient-descent/

【4】http://ygc.name/2011/03/22/machine-learning-ex2-linear-regression/

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 sci的proof时间超了怎么办 合肥电大考试没过怎么办 社保账号密码忘记了怎么办 住房公积金账号密码忘记了怎么办 燃气费单子丢了怎么办 商标初审公告期内被异议怎么办 手被山药痒了怎么办 9个月宝宝不吃奶粉怎么办 八个月宝宝拉粑粑费劲怎么办? 两个月小孩不吃奶粉怎么办 两个月的小孩不吃奶粉怎么办 两个多月宝宝不吃奶怎么办 三个多月宝宝不爱吃奶怎么办 4个月宝宝不吃奶怎么办 5个月宝宝不爱吃奶怎么办 九个月宝宝一直流鼻涕怎么办 九个月宝宝一直咳嗽怎么办 宝宝3岁不爱喝水怎么办 1岁宝宝不肯喝水怎么办 三个月宝宝体检说严重缺钙怎么办 1岁半宝宝不吃药怎么办 1岁宝宝抗拒吃药怎么办 六个月宝宝不爱吃辅食怎么办 宝宝九个月了不爱吃辅食怎么办 八个月宝宝不喜欢吃辅食怎么办 小孩米粉吃多了怎么办 宝宝四个月了奶水不足怎么办 4个月奶水不足怎么办 孩子不吃奶粉母乳又不够怎么办 宝宝吃母乳上火了怎么办 5个月宝宝厌奶期怎么办 九个月宝宝不吃奶粉怎么办 第5个月奶不够吃怎么办 九个月的宝宝不吃奶粉怎么办 9个月宝宝不肯吃怎么办 11个月不吃辅食怎么办 4个月母乳不足怎么办 宝宝四个月奶不够怎么办 四个月宝宝奶不够吃怎么办 宝宝吃母乳偏瘦怎么办 宝宝吃母乳很瘦怎么办