2

我正在尝试在Python. 我实现的假设函数是:

   def hypothesis(params, features):
       z = sum(p * f for p, f in zip(params, features))
       return 1 / (1 + math.e ** -z)

我用于测试的数据集来自UCI Machine Learning Repository,它包含如下数据(第一列是目标,其他列是选定的特征):

1,14.23,1.71,2.43,15.6,127,2.8,3.06,.28,2.29,5.64,1.04,3.92,1065
3,13.2,1.78,2.14,11.2,100,2.65,2.76,.26,1.28,4.38,1.05,3.4,1050
2,13.16,2.36,2.67,18.6,101,2.8,3.24,.3,2.81,5.68,1.03,3.17,1185
1,14.37,1.95,2.5,16.8,113,3.85,3.49,.24,2.18,7.8,.86,3.45,1480

如您所见,与其他功能相比,某些功能非常大。所以z在我的hypothesis函数中作为 的幂太大了e。事实上,对于较大的值,zs 都是0.0。如果我将分子更改为 3,OverflowError则会提高。

也许我应该在将数据提供给我的程序之前对它们进行标准化,知道我该怎么做吗?

4

1 回答 1

2

不是真正的 StackOverflow 问题 =/

在我看来,这个问题应该在其他地方问 - 似乎您正在寻找一种算法而不是一种算法的实现。

除此之外 - 您将按列规范化此数据集。计算每列的 SD 和平均值,并将其标准化为 2 的 SD 和 10 的平均值。这只是意味着一旦你计算了列的 SD 和它的平均值,你就可以计算每个条目的新值该列首先计算出与该列的平均值相差多少 SD,然后得到数字 10 并从 10 中添加或减去那么多的 2(取决于数据是高于该列的平均值还是低于该列的平均值)。

例如,假设我们有一列包含一些数字,我们计算出 SD 为 3,平均值为 50。我们现在遇到该列的一个成员 - 数字 56。56 是上面的两个 SD 50(平均值),因此它将被归一化为 14(10(新平均值)+2(新 SD)*2(SD 列的数量高于列的平均值))。

数字 10 和 2 可以替换为其他数字,但我认为 10 和 2 似乎是正确的。

有关计算运行 SD(标准差)和均值的帮助,请参阅另一个 StackOverflow 问题 - 如何有效地计算运行标准差?

于 2012-12-10T06:49:25.090 回答