如何规范极大数量的逻辑回归?

时间:2012-12-10 06:25:45

标签: python machine-learning normalization

我正在尝试在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的幂。 事实上,对于较大的值,z都是0.0。 如果我将分子改为3,则OverflowError被提升。

也许我应该在将数据提供给我的程序之前对数据进行规范化,任何想法我该怎么做?

1 个答案:

答案 0 :(得分:2)

不是StackOverflow问题= /

在我看来,这个问题应该在其他地方被问到 - 看起来你正在寻找算法而不是算法的实现。

除此之外 - 您将按列对此数据集进行规范化。计算每列的SD和平均值,并将其标准化为SD为2和平均值10.这只表示一旦计算了列的SD及其平均值,就可以计算出每个条目的新值。该列首先确定距离列的平均值有多少SD,然后得到数字10并从10加上或减去那么多2(取决于数据是上面的某个SD还是某个SD低于该列的平均值)。

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

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

有关计算运行SD(标准偏差)和平均值的帮助,请参阅此其他StackOverflow问题 - How to efficiently calculate a running standard deviation?