【问题标题】:logistic regression in matlabmatlab中的逻辑回归
【发布时间】:2018-04-25 04:02:12
【问题描述】:

我想在matlab中实现逻辑回归,我有以下几个代码

function B=logistic_regression(x,y)

f=@(a)(sum(y.*log((exp(a(1)+a(2)*x)/(1+exp(a(1)+a(2)*x))))+(1-y).*log((1-((exp(a(1)+a(2)*x)/(1+exp(a(1)+a(2)*x))))))));
a=[0.1, 0.1];
options = optimset('PlotFcns',@optimplotfval);
B = fminsearch(f,a, options);

end

逻辑回归如下:

首先我们计算logit,它等于

L=b0+b1*x

那么我们计算的概率等于 p=e^L/(1+e^L)

最后我们正在计算

y*ln(p)+(1-y)*ln(1-p)

我决定将所有这些东西写在一行中,但是当我运行代码时,它给了我以下错误

>> B=logistic_regression(x,y)
Assignment has more non-singleton rhs dimensions than non-singleton subscripts

Error in fminsearch (line 200)
fv(:,1) = funfcn(x,varargin{:});

Error in logistic_regression (line 6)
B = fminsearch(f,a, options);

我该如何解决这个问题?提前致谢

【问题讨论】:

    标签: matlab logistic-regression


    【解决方案1】:

    为了实现逻辑回归模型,我通常调用glmfit函数,这是比较简单的方法。语法是:

     b = glmfit(x,y,'binomial','link','logit');
    

    b 是一个向量,其中包含逻辑回归的线性部分的系数(第一个元素是回归的常数项alpha)。 x 包含预测变量数据,每个观察值一行,每个变量一列。 y 包含目标变量,通常是代表结果的布尔(0 或 1)值向量。

    获得系数后,您必须将回归的线性部分应用于预测变量:

    z = b(1) + (x * b(2));
    

    要完成,您必须将逻辑函数应用于线性部分的输出:

    z = 1 ./ (1 + exp(-z));
    

    如果您需要对数据或输出进行更多修改,并且需要更大的灵活性和对模型的控制,我建议您查看此实现:

    https://github.com/mohammadaltaleb/Logistic-Regression

    【讨论】:

    • 抱歉,n 代表什么?
    • 对不起,我编辑了答案,因为我的假设是基于 fitgml 的。默认情况下,glmfit 会在 X 中添加第一列 1,对应于模型中的常数项。因此,您不必手动进行。您可以通过将 'constant' 参数设置为 'off' 来禁用此默认行为。
    猜你喜欢
    • 2013-05-02
    • 2014-03-21
    • 1970-01-01
    • 2013-11-18
    • 2013-03-15
    • 2019-07-11
    • 2020-01-31
    • 2014-04-24
    • 1970-01-01
    相关资源
    最近更新 更多