r语言 - 如何校正添加到所有输入要素的大型(未知)常量的线性回归



>假设我有一个包含 10 个输入特征的输入特征向量,每个输入特征的数量级约为 1E-7 个数量级。

当我使用这些输入要素的log运行线性回归时,我得到的R^2值约为 0.98

但是,如果我在运行上述拟合之前向每个输入要素添加1E-2,则得到的R^2值为 0.5616

问题是我不会先验地知道添加到我的输入特征中的常数是1E-2的,所以我不能每次都简单地减去这个数量。

是否有一种通用方法可以校正添加到输入要素集中的大型未知常量?

下面是一个示例输入文件:http://stanford.edu/~hq6/13

下面是一个相应的输出文件:http://stanford.edu/~hq6/15

下面是一些用于训练的代码:

input_features = read.csv('InputFeatures.csv', header=F)
# Adding constant error term to all input features
input_features = input_features + 1E-2
# How can we correct for this constant if we do not know what the constant is beforehand?
input_features[input_features <= 0] = 1E-10
input_features = log(input_features)
output = read.csv('Output.csv', header=F)
full_data = data.frame(input_features,  output)
summary(lm(V1.1 ~ ., data=full_data))

当这段代码在没有行input_features = input_features + 1E-2的情况下运行时,我从summary输出中得到大约 0.98 R-squared

当这条线放进去时,R-squared小于0.5.

所以你建议你的数据集适合y = A + B*exp(C*x). 为什么不使用nls或其他非线性拟合工具进行直接拟合?

如果您希望对两边的对数进行线性拟合,则从对数规则中应该很明显(例如 log(ab) = log(a) + log(b) ),您无法分离出两个求和项的效果。

R^10 上的线性回归导致 11 个实数是 10 维超平面的系数。从你的帖子来看,你似乎有一个("值...")或最多两个("R^2"),这似乎仍然是错误的。

或者也许 R^2 是指残差误差?

线性回归本身对于添加常量是不变的,只要它不会导致一些数值不精确,并且您将其添加到所有特征中即可。如果您只添加一个,那么很明显它会改变结果 - 因为这个维度可能会变得更重要/不那么重要(取决于常量的符号)。为了使它对此类操作不变,您可以规范化数据(通过线性缩放到区间或规范化为 mean=0 和 std=1)

最新更新