8

n個の観測があり、各観測がm属性のm値で構成されるデータセットnxmがあります。各観測には、観測結果も割り当てられています。m は大きく、私のタスクには大きすぎます。私は、ニューラル ネットワークを教えるためにこれらの属性のみを使用できるように、データセット全体を非常によく表す m 属性の最適かつ最小のサブセットを見つけようとしています。

これには遺伝的アルゴリズムを使用したいと考えています。問題はフィットネス機能です。生成されたモデル (属性のサブセット) が元のデータをどの程度反映しているかがわかります。そして、セット全体に対して特定の属性のサブセットを評価する方法がわかりません。もちろん、サブセットがどれだけ優れているかをチェックするために、ニューラル ネットワーク (後でこの選択されたデータを使用します) を使用できます。エラーが小さいほど、サブセットは優れています。しかし、私の場合、これにはかなりの時間がかかるため、このソリューションを使用したくありません。できればデータセットでのみ動作する他の方法を探しています。

私が考えたのは、サブセットS(遺伝的アルゴリズムによって発見された)を持ち、サブセットSの値のみが含まれるようにデータセットをトリミングし、このデータサーバー内のいくつの観測値がもはや区別できなくなった(同じ属性に対して同じ値を持つ)かを確認することでした。異なる結果値を持つ。数値が大きいほど、悪いサブセットです。しかし、これは計算量が多すぎるように思えます。

属性のサブセットがデータセット全体をどの程度うまく表しているかを評価する他の方法はありますか?

4

1 に答える 1

6

このコスト関数は、必要なことを行う必要があります。つまり、各サブセットを構成する機能に対応する因子負荷を合計します

その合計が高いほど、それらの特徴だけで説明される応答変数の変動性の割合が大きくなります。OPを理解していれば、このコスト関数はOPからの「セット全体を非常によく表す」の忠実な翻訳です。

コードへの還元は簡単です。

  1. データセットの共分散行列を計算します (まず、応答変数を保持する列、つまりおそらく最後の列を削除します)。データセットがmxn (列 x 行) の場合、この共分散行列は nxn になり主対角線は "1" になります。

  2. 次に、この共分散行列に対して固有値分解を実行します。これにより、その固有値 (各固有値は特徴または列に対応する) によって寄与される、応答変数の合計変動の割合が得られます。[注: このステップでは特異値分解 (SVD) がよく使用されますが、これは不要です。固有値分解ははるかに単純であり、共分散行列が常に正方行列である限り、常に機能します]。

  3. 遺伝的アルゴリズムは、各反復で、一連の候補ソリューション (この場合は特徴サブセット) を返します。GA (組み合わせ最適化) の次のタスクは、コスト関数スコアによってこれらの候補ソリューションをランク付けすることです。あなたの場合、コスト関数は、そのサブセット内の各機能の固有値比率の単純な合計です。(ただし、その計算をスケーリング/正規化して、より高い数値が最も適合しないようにする必要があると思います。)

計算例 ( python + NumPyを使用):

>>> # there are many ways to do an eigenvalue decomp, this is just one way
>>> import numpy as NP
>>> import numpy.linalg as LA

>>> # calculate covariance matrix of the data set (leaving out response variable column)
>>> C = NP.corrcoef(d3, rowvar=0)
>>> C.shape
     (4, 4)
>>> C
     array([[ 1.  , -0.11,  0.87,  0.82],
            [-0.11,  1.  , -0.42, -0.36],
            [ 0.87, -0.42,  1.  ,  0.96],
            [ 0.82, -0.36,  0.96,  1.  ]])

>>> # now calculate eigenvalues & eivenvectors of the covariance matrix:
>>> eva, evc = LA.eig(C)
>>> # now just get value proprtions of each eigenvalue:
>>> # first, sort the eigenvalues, highest to lowest:
>>> eva1 = NP.sort(eva)[::-1]
>>> # get value proportion of each eigenvalue:
>>> eva2 = NP.cumsum(eva1/NP.sum(eva1))   # "cumsum" is just cumulative sum
>>> title1 = "ev value proportion"
>>> print( "{0}".format("-"*len(title1)) )
-------------------
>>> for row in q :
        print("{0:1d} {1:3f} {2:3f}".format(int(row[0]), row[1], row[2]))

   ev value  proportion    
   1   2.91   0.727
   2   0.92   0.953
   3   0.14   0.995
   4   0.02   1.000

したがって、合計されるのは、すぐ上の値の3 番目の列(各機能に 1 つ) です (コスト関数で評価している特定のサブセットに存在する機能に応じて選択的に)。

于 2011-11-03T12:37:25.763 に答える