65.9K
CodeProject 正在变化。 阅读更多。
Home

Java 中的多重线性回归

starIconstarIconstarIconstarIconstarIcon

5.00/5 (11投票s)

2013 年 3 月 23 日

CPOL

5分钟阅读

viewsIcon

78434

downloadIcon

2098

带有简单示例和 Java 代码的多重线性回归/分类

引言

我将介绍统计建模中一个非常受欢迎的主题:多重线性(或多元)回归(MLR)或分类。在简单的示例中,我将向您展示 MLR 的用法。MLR 已广泛应用于科学领域(生物、制药、金融、医学等)。

背景

几个月前,我写了一篇关于Java 中的矩阵运算的文章。我建议您先阅读那篇文章,因为本文中的代码严重依赖于矩阵运算。

要理解多重线性回归(MLR),请看下表

饮食评分 男性 年龄 > 20 BMI
4 0 1 27
7 1 1 29
6 1 0 23
2 0 0 20
3 0 1 21

测量了五个人的身体质量指数(BMI)。对于每个人,饮食评分、性别(男性或女性)以及年龄是否大于 20 岁也已记录在三列中。请不要问我饮食评分是什么以及如何测量,因为我也不知道,这只是一个玩具示例。问题是:BMI 与饮食评分、性别和年龄之间有什么关系?如果我们知道一个新人的饮食评分、性别和年龄,能否得知其身体质量指数?MLR 就是为了回答这些问题而存在的。我们期望 BMI 与三个变量之间的关系大致如下:

根据这个方程,为了预测一个已知饮食评分、性别和年龄的人的 BMI 值,您需要知道所有beta的值。MLR 旨在找到所有缺失系数的值。我们将ß0 称为偏置(bias)。在大多数现实应用中,较大的偏置意味着预测变量(即三个变量)的预测能力不足,而较小的偏置是模型具有良好预测能力的标志。较大的偏置可能意味着存在我们尚未发现的其他描述符可以解释这些观察结果。

让我们将上表中的 BMI 列表示为一个列矩阵,并将其命名为Y,将所有自变量的值表示为一个 3x3 矩阵,命名为X,最后将稍后需要发现的 beta 矩阵的值表示为一个列矩阵b。未知矩阵b可以表示为:

b = (X'X)-1X'Y

其中X'是矩阵X的转置,而-1表示矩阵的逆。

如果您想要包含偏置项,则需要向矩阵X添加一个新列。此新列应为第一列,并且所有行的值都必须为 1。

MLR 的局限性:MLR 仅在X矩阵的列数小于或等于行数时才有效。换句话说,描述符的数量不能超过观测值的数量。另一个局限性与上述方程中的求逆运算有关。并非所有矩阵都有逆,当我们无法获得X'X的逆时,计算b矩阵将失败,因此 MLR 也会失败。还有其他方法,如偏最小二乘法支持向量机,可以在 MLR 失败时正常工作。

Using the Code

我们只需要在另一篇文章中描述的所有矩阵运算方法之上实现一个单一方法,就可以创建模型并找到b矩阵的值。

public Matrix calculate() throws NoSquareException {
	if (bias)
		this.X = X.insertColumnWithValue1();
	checkDiemnsion();
	Matrix Xtr = MatrixMathematics.transpose(X); //X'
	Matrix XXtr = MatrixMathematics.multiply(Xtr,X); //X'X
	Matrix inverse_of_XXtr = MatrixMathematics.inverse(XXtr); //(X'X)^-1
	if (inverse_of_XXtr == null) {
		System.out.println("Matrix X'X does not have any inverse. 
                            So MLR failed to create the model for these data.");
		return null;
	}
	Matrix XtrY = MatrixMathematics.multiply(Xtr,Y); //X'Y
	return MatrixMathematics.multiply(inverse_of_XXtr,XtrY); //(X'X)^-1 X'Y
}

上述代码按照以下步骤获取b矩阵:

  1. 如果您想要包含偏置项(即 beta0),则向X矩阵添加一个新列
  2. 然后检查输入矩阵是否有效
  3. 然后找到X的转置(即X'
  4. 然后将X乘以X'
  5. 然后找到步骤 4 中的矩阵的逆;即(XX')-1
  6. 然后将X'乘以Y
  7. 最后,将步骤 5 中的运算矩阵乘以步骤 6 中的运算矩阵

现在让我们用上面的例子来测试这个方法

Matrix X = new Matrix(new double[][]{{4,0,1},{7,1,1},{6,1,0},{2,0,0},{3,0,1}});
Matrix Y = new Matrix(new double[][]{{27},{29},{23},{20},{21}});
MultiLinear ml = new MultiLinear(X, Y);
Matrix beta = ml.calculate();

当我们使用带有两个参数的构造函数时,默认的偏置值为 true。以下是结果:

这是一个模型,用于在给定所有自变量(即饮食评分、性别和年龄)的值的情况下预测 MSI。beta 值的幅度和符号表明了它们的重要性。在这个说明性示例中,饮食评分和性别对 BMI 的贡献大于年龄,并且性别和饮食评分的影响是相反的;也就是说,饮食评分较高的人 BMI 较高,而男性与女性相比 BMI 明显较低。了解 MLR 对 BMI 观察所提供的见解是很有趣的。

最后一个问题:这是一个好模型吗?我们可以做的最基本的事情是使用模型(上述方程)来预测 BMI,然后将其与观测值进行比较。

BMI 预测值
27 27
29 27.75
23 24.25
20 18.75
21 22.25

正如您所见,预测值与观测值相差不远。您可以找到每个情况的误差(即预测值 - 观测值),并计算均方误差(MSE),它能表明我们的模型有多准确。MSE 越低,模型越好。有许多花哨的统计检验可用于检查模型的适用性,我将在本文中忽略它们。您可以在代码中找到几个额外的测试。其中一个测试示例是使用 MLR 进行分类分析。

关注点

仅用几行代码,我就尝试说明了一个最重要的统计建模算法(MLR)。我还没有测试代码在大型矩阵上的表现,并且由于我们使用了递归操作,您可能需要增加线程的堆栈大小(即 -Xss 标志)。如果您有有趣的数据可以测试代码,请告诉我。

历史

  • 2013 年 3 月 23 日:第一个版本 (v1.0.1)
© . All rights reserved.