matlab - 使用 MATLAB 进行简单的二元逻辑回归

标签 matlab classification probability confidence-interval logistic-regression

我正在使用 MATLAB 对一个简单的分类问题进行逻辑回归。我的协变量是一个介于 0 和 1 之间的连续变量,而我的分类响应是 0(不正确)或 1(正确)的二进制变量。

我正在寻求运行逻辑回归来建立一个预测器,该预测器将输出某些输入观察值(例如,如上所述的连续变量)正确或不正确的概率。虽然这是一个相当简单的场景,但我在 MATLAB 中运行它时遇到了一些问题。

我的做法如下:我有一个列向量X包含连续变量的值,以及另一个大小相等的列向量 Y包含 X 的每个值的已知分类(例如 0 或 1)。我正在使用以下代码:

[b,dev,stats] = glmfit(X,Y,'binomial','link','logit');

但是,这给了我荒谬的结果 p = 1.000 , 系数 ( b ) 非常高 (-650.5, 1320.1), 相关标准误差值约为 1e6。

然后我尝试使用一个额外的参数来指定我的二项式样本的大小:

glm = GeneralizedLinearModel.fit(X,Y,'distr','binomial','BinomialSize',size(Y,1));

这给了我更符合我预期的结果。我提取了系数,使用了 glmval创建估计值(Y_fit = glmval(b,[0:0.01:1],'logit');),并为拟合创建一个数组(X_fit = linspace(0,1))。当我使用 figure, plot(X,Y,'o',X_fit,Y_fit'-') 覆盖原始数据和模型的图时,模型的结果图基本上看起来像逻辑回归图典型的“S”形图的下 1/4。

我的问题如下:

1) 为什么我使用 glmfit给出奇怪的结果?
2) 我应该如何解决我最初的问题:给定一些输入值,其分类正确的概率是多少?
3) 如何获得模型参数的置信区间? glmval应该能够输入 stats来自 glmfit 的输出, 但我使用 glmfit没有给出正确的结果。

任何评论和输入都会非常有用,谢谢!

更新(3/18/14)

我发现 mnrval似乎给出了合理的结果。我可以使用 [b_fit,dev,stats] = mnrfit(X,Y+1);其中 Y+1简单地将我的二元分类器变成一个名义分类器。

我可以遍历 [pihat,lower,upper] = mnrval(b_fit,loopVal(ii),stats);获得各种pihat概率值,其中 loopVal = linspace(0,1)或一些适当的输入范围和“ii = 1:length(loopVal)”。

stats参数具有很大的相关系数 (0.9973),但是 b_fit 的 p 值是 0.0847 和 0.0845,我不太确定如何解释。有什么想法吗?另外,为什么会 mrnfit工作 glmfit在我的例子中?我应该注意使用 GeneralizedLinearModel.fit 时系数的 p 值都是p<<0.001 ,并且系数估计也完全不同。

最后,如何解释 dev mnrfit 的输出功能? MATLAB 文档指出它是“解向量处拟合的偏差。偏差是残差平方和的推广”。这作为独立值有用吗,还是仅与 dev 相比?来自其他模型的值?

最佳答案

听起来您的数据可能是线性可分的。简而言之,这意味着由于您的输入数据是一维的,因此有一些值 x这样 x < xDiv 的所有值属于一类(比如 y = 0 )和 x > xDiv 的所有值属于另一个类 ( y = 1 )。

如果您的数据是二维的,这意味着您可以在二维空间中画一条线 X这样特定类的所有实例都在线的一侧。

这对逻辑回归 (LR) 来说是个坏消息,因为 LR 并不是真正用于处理数据线性可分的问题。

逻辑回归试图拟合以下形式的函数:

Logistic Regression

这只会返回 y = 0 的值或 y = 1当分母中指数内的表达式为负无穷大或无穷大时。

现在,因为您的数据是线性可分的,并且 Matlab 的 LR 函数会尝试找到适合数据的最大似然值,所以您将获得极端的权重值。

这不一定是解决方案,但请尝试仅在一个数据点上翻转标签(因此对于某些索引 t,其中 y(t) == 0 设置 y(t) = 1 )。这将导致您的数据不再线性可分,并且学习到的权重值将被大幅拉近零。

关于matlab - 使用 MATLAB 进行简单的二元逻辑回归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22493759/

相关文章:

matlab - 在 Matlab 中对大数进行因式分解,然后得到结果中的数字

matlab - 如何在给定非零元素位置的 MATLAB 中创建稀疏矩阵

neural-network - 多输出分类神经网络如何工作?

r - 为什么我的逻辑回归模型输出不是 2 个水平的因子? (错误: `data` and `reference` should be factors with the same levels.)

matlab - 为什么 "pi"在 MATLAB 中成为符号?

c++ - 具有大变量的高阶贝塞尔函数计算

python - 如何在 Keras 中组合两个具有不同输入大小的 LSTM 层?

python - Matplotlib:如何将直方图转换为离散概率质量函数?

r - 用 probplot 叠加两个概率图

r - 创建新的概率分布 R