このコスト関数は、必要なことを行う必要があります。つまり、各サブセットを構成する機能に対応する因子負荷を合計します。
その合計が高いほど、それらの特徴だけで説明される応答変数の変動性の割合が大きくなります。OPを理解していれば、このコスト関数はOPからの「セット全体を非常によく表す」の忠実な翻訳です。
コードへの還元は簡単です。
データセットの共分散行列を計算します (まず、応答変数を保持する列、つまりおそらく最後の列を削除します)。データセットがmxn (列 x 行) の場合、この共分散行列は nxn になり、主対角線は "1" になります。
次に、この共分散行列に対して固有値分解を実行します。これにより、その固有値 (各固有値は特徴または列に対応する) によって寄与される、応答変数の合計変動の割合が得られます。[注: このステップでは特異値分解 (SVD) がよく使用されますが、これは不要です。固有値分解ははるかに単純であり、共分散行列が常に正方行列である限り、常に機能します]。
遺伝的アルゴリズムは、各反復で、一連の候補ソリューション (この場合は特徴サブセット) を返します。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 つ) です (コスト関数で評価している特定のサブセットに存在する機能に応じて選択的に)。