Эта функция стоимости должна делать то, что вы хотите: суммировать факторные нагрузки, которые соответствуют признакам, составляющим каждое подмножество .
Чем выше эта сумма, тем больше доля изменчивости в переменной отклика, которая объясняется только этими признаками.Если я понимаю ОП, эта функция стоимости является точным переводом «представляет весь набор достаточно хорошо» из ОП.
Сокращение до кода является простым:
Вычислите ковариационную матрицу вашего набора данных (сначала удалите столбец, содержащий переменную ответа, т. Е., Вероятно, последний).Если ваш набор данных 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
, так что это третий столбец значений чуть выше (по одному для каждой функции), которые суммируются (выборочно, в зависимости от того, какие функции присутствуют в данном подмножестве, которое вы оцениваете с помощью функции стоимости).