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 は all0.0です。分子を 3 に変更すると、OverflowErrorが上がります。

プログラムにデータを供給する前にデータを正規化する必要があるかもしれませんが、どうすればこれを行うことができますか?

4

1 に答える 1

2

本当にStackOverflowの質問ではありません=/

この質問は、別の場所で質問する必要があるように思えます-アルゴリズムの実装ではなく、アルゴリズムを探しているようです。

それはさておき、このデータセットを列ごとに正規化します。各列の SD と平均を計算し、それを SD 2 と平均 10 に正規化します。これは、列の SD とその平均を計算したら、各エントリの新しい値を計算することを意味します。最初に列の平均値から SD がいくつ離れているかを計算し、次に数値 10 を取得して、10 からその数の 2 を加算または減算します (データがその列の平均より上の SD か下の SD かによって異なります)。

たとえば、いくつかの数値を含む列があり、SD を 3 と計算し、平均を 50 と計算したとします。この列のメンバーである数値 56 に出くわします。56 は 2 つの SD 上の数値です。 50 (平均) であるため、14 に正規化されます (10 (新しい平均) + 2 (新しい SD)*2 (列の平均より上の列の SD の数))。

10 と 2 という数字は他の数字に置き換えることができますが、10 と 2 がほぼ正しいと思います。

実行中の SD (標準偏差) と平均を計算する方法については、この他の StackOverflow の質問 - 実行中の標準偏差を効率的に計算する方法を参照してください。

于 2012-12-10T06:49:25.090 に答える