梯度下降

  因为现在刚好在学习数据挖掘,这里就做一点小记录吧。
  在当今时代,数据是一个很重要的部分。随随便便比如医疗保障机构存储的问诊人的信息就要占很大的空间,因此如何管理数据就显得极为重要了。又比如奥巴马当初的胜选是以270选举人选票为目标函数,利用历史投票数据,对每个选民建立支持概率模型,说服可能性概率模型和投票率概率模型。
  然后具体来说,线性回归是建立在有一堆数据集,然后建立了一个线性,模型,利用数据集对其进行不断的训练,得到最合适的参数列表,然后利用得到的参数计算测试集样例,考察准确性。

  考虑只有一个特征的时候

假设

考虑成本函数最小

这里就要用到梯度下降的方法了。

alpha是学习率,然后theta就是我们要通过训练集得到的参数值了

但是如果学习率太低了会造成梯度下降太慢,

如果学习率太高了会造成震荡,甚至无法收敛

最后的做法就是直接套用公式了

附上自己写的matlab代码(因为直接用其中的矩阵运算可以省去很多麻烦==)

function [ reference ] = LR()
    Matrix = csvread('save_train.csv', 1, 1);
    [m,n] = size(Matrix);
    alpha = 0.01;
    X = ones(m,n);
    Y = zeros(1,m);
    X(1:m,2:n) = Matrix(1:m,1:n-1);
    Y(1,:) = Matrix(:,n)';
    theta = zeros(1,n);
    result1 = zeros(1,m);
    alpha = 0.5;
    
    for j =1:1000 %循环迭代1000次
        init = theta;
        for i=1:m
            result1(i) = theta*X(i,:)'-Y(i); %将中间结果存储下来
        end
        cost1 = sum(result1.*result1)/(2*m); %计算cost函数
        tmp = zeros(1,n);
        for i=1:n
            tmp(i) = result1*X(:,i);
        end

        theta = theta-alpha.*tmp/m; %更新theta参数
        for i=1:m
            result2(i) = theta*X(i,:)'-Y(i);
        end
        cost2 = sum(result2.*result2)/(2*m); %计算更新后的cost值
        if cost2>=cost1 %比较前后的cost,看是否应该减小alpha
            alpha = alpha/3;
            theta = init;
        end
    end
    %Mtest = csvread('save_test.csv', 1, 1);
    Mtest = Matrix(1:m,1:n-1);
    [height,width] = size(Mtest);
    MTest = ones(height,width+1);
    MTest(1:height,2:width+1) = Mtest(:,:);
    for i=1:height
        reference(i) = theta*MTest(i,:)';
        Id(i) = i-1;
    end
    rmse=sqrt(sum((Y-reference).^2)/m) ;%计算rmse(均方差)
    disp(rmse);
    
    %%构造表格
%     reference = reference';
%     Id = Id';
%     columns={'Id', 'reference'};
%     data=table(Id, reference,'VariableNames',columns);
%     writetable(data,'submission.csv');
    
   
end

这里我直接用原数据集进行训练和检测==毕竟搞不到测试集的结果,无法对比效果。最后用梯度下降的方法可以使得rmse在9+。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值