这个成本函数应该做你想做的事:将与构成每个子集的特征相对应的因子负载相加。
总和越高,仅用这些特征解释的响应变量的可变性份额就越大。如果我理解 OP,这个成本函数是 OP 中“很好地代表整个集合”的忠实翻译。
简化为代码很简单:
计算数据集的协方差矩阵(首先删除
包含响应变量的列,即可能是最后一个
一)。如果您的数据集是 m x n(列 x 行),那么这个
协方差矩阵将为 n x n,主对角线下方为“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
所以它是上面的 第三列 值(每个特征一个)被求和(有选择地,取决于您所在的给定子集中存在哪些特征使用成本函数进行评估)。