我正在尝试在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
被提升。
也许我应该在将数据提供给我的程序之前对数据进行规范化,任何想法我该怎么做?
答案 0 :(得分:2)
在我看来,这个问题应该在其他地方被问到 - 看起来你正在寻找算法而不是算法的实现。
除此之外 - 您将按列对此数据集进行规范化。计算每列的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?