我想将变量表示为 0 到 1 之间的数字。该变量是一个非负整数,没有固有界限。我将 0 映射到 0,但我可以将什么映射到 1 或 0 到 1 之间的数字?
我可以使用该变量的历史来提供限制。这意味着如果最大值增加,我必须重述旧的统计数据。我必须这样做还是我应该知道其他技巧?
我想将变量表示为 0 到 1 之间的数字。该变量是一个非负整数,没有固有界限。我将 0 映射到 0,但我可以将什么映射到 1 或 0 到 1 之间的数字?
我可以使用该变量的历史来提供限制。这意味着如果最大值增加,我必须重述旧的统计数据。我必须这样做还是我应该知道其他技巧?
这样做的一个非常常见的技巧(例如,在联结主义建模中)是使用双曲正切 tanh作为“挤压函数”。它会自动将所有数字拟合到 -1 和 1 之间的区间内。在你的情况下,这限制了从0 到 1。输入r
,matlab
您可以通过tanh()
.
另一个压缩函数是逻辑函数(感谢 Simon 的名字),由提供,它将范围限制在 0 到 1(其中 0 映射到 . 5)。因此,您必须将结果乘以 2 并减去 1 以使您的数据适合 0 和 1 之间的区间。
这是一些简单的 R 代码,它绘制了这两个函数(红色为 tanh,蓝色为逻辑),因此您可以看到两者是如何压缩的:
x <- seq(0,20,0.001)
plot(x,tanh(x),pch=".", col="red", ylab="y")
points(x,(1 / (1 + exp(-x)))*2-1, pch=".",col="blue")
通常,我的第一个问题是“你为什么要这样做”,然后我看到你已经在对该问题的评论中回答了这个问题:“我正在衡量许多不同维度的内容,我想成为能够根据给定内容的相关性进行比较。此外,我想显示这些维度上的值,这些值是可解释的且易于理解的。 “
没有理由对数据进行规范化,使最大值为 1,最小值为零来实现这一点,我认为这通常是个坏主意。最大值或最小值很容易成为不代表总体分布的异常值。@osknows 关于使用分数的临别评论是一个更好的主意。 -scores(又名标准分数)使用每个变量的标准偏差而不是其范围来规范化每个变量。标准差受异常值的影响较小。为了使用-scores,最好每个变量都具有大致正态分布,或者至少具有大致对称分布(即没有严重偏斜),但如有必要,您可以先应用一些适当的数据转换来实现这一点;可以通过找到最合适的Box-Cox 变换来确定要使用的变换。
除了 Henrik 和 Simon Byrne 的好建议外,您还可以使用 f(x) = x/(x+1)。通过比较,逻辑函数会随着 x 变大而夸大差异。也就是说,使用逻辑函数的 f(x) 和 f(x+1) 之间的差异将大于使用 f(x) = x/(x+1) 的差异。您可能想要也可能不想要这种效果。