Автор оригинала: Daia Alexandru.
Вот коэффициент корреляции Оническу , основанный на кинетической энергии, подробнее см. Здесь.
Моя идея состоит в том, чтобы использовать новый коэффициент корреляции в качестве показателя производительности вместо перекрестной энтропии, как в случае нейронных сетей или в случае генетических алгоритмов в качестве функции пригодности .
Это будет действовать как строительный блок для следующей реализации, которая будет опубликована. Простая функция кинетической энергии:
def kin_energy(random_vec): """return kinetic energy of random vector represented as (n,) dimmensional array""" freq=np.unique(random_vec,return_counts=True) prob=freq[1]/random_vec.shape[0] energy=np.sum(prob**2) return energy
import numpy as np a=np.array([1,3,2,2]]) print(kin_energy(a)) #case with total energy a=np.array([1,1,1,1,1,1,1,1,1,1,1,1,1,1]) print(kin_energy(a)) #case with converging to zero a=np.array([1,2,3,4,5,6,7,8,9,10]) print(kin_energy(a)) 0.375 1.0
Проблема с корреляцией:
Имея 2 случайных вектора
X=x1,x2,..xn=x1,x2,..xN
и
Y=y1,y2,…yN
- Информационная корреляция IC ( при этом не используется кинетическая энергия) p(xi)∗p(yi)
IC ограничен между [0,1] , будучи полностью 0, если оба вектора равны нулю ( система полностью индифферентна’.
- КОЭФФИЦИЕНТ ИНФОРМАЦИОННОЙ КОРРЕЛЯЦИИ Подобно другим статистическим коэффициентам корреляции, ИС может подвергаться нормализации с использованием кинетической энергии, что приводит к:
O(X,Y)=(∑Ni=0 p(xi)∗p(yi))/(∑Ni=0 xi2∗∑Ni=0 yi2)O(X,Y)=(∑i=0N p(xi)∗p(yi))/(∑i=0N xi2∗∑i=0N yi2)
Обратите внимание, что знаменатель-это просто кинетическая энергия, поэтому коэффициент ICC можно записать как:
O(X,Y)=IC/кинетический(X)*кинетический(Y)O(X,Y)=IC/кинетический(X)*кинетический(Y)
Реальная проблема в номинаторе:
Это означает , что для вычисления точечного произведения там необходимо, чтобы некоторые 2 случайных вектора имели одинаковую мощность уникальных событий( классов)
Например, если∗4+2∗2+1∗5, но что, если 2 случайных вектора выглядят так:,5,1, не имеющие одинаковой формы, отключат коэффициент корреляции для работы , пока не выяснят что-то.
Настройка реализации: defic(vector1,vector2): “””коэффициент возврата информации IC для 2 случайных величин-определяется как точечное произведение вероятностей, соответствующих каждому классу
""" a=vector1 b=vector2 # get the probs in order to do dot product with them
prob1=np.unique(a,return_counts=True)[1]/a.shape[0] prob2=np.unique(b,return_counts=True)[1]/b.shape[0] p1=list(prob1) p2=list(prob2) diff=len(p1)-len(p2) if diff>0: for elem in range(diff): p2.append(0) if diff<0: for elem in range((diff*-1)): p1.append(0) ic=np.dot(np.
array(p1),np.array(p2)) возвращает ic
And finally after having functions for kinetic energy of a vector and for information correlation , we can define a new function that computes kinetic correlation :
def o(vector1,vector2): """return onicescu information correlation based on kinetic energy """ i_c=ic(vector1,vector2) o=i_c/np.sqrt(kin_energy(vector1)*kin_energy(vector2)) return o Testing some toy use cases .
Обратите внимание, что я обновил формулу, такую как знаменатель, содержащий sqrt, чтобы иметь проблемы, ограниченные между o и 1.
a=np.array([1,2,3,4,5,6,7]) b=np.array([2,3,1,5,7,9,1]) o(a,b) 0.88191710368819676 #Example 2 a=np.array([1,2,3,4,5,6,7]) b=np.array([2,3,1,5,7,9,11]) o(a,b) 1
Имея это , можно было бы просто использовать его вместо перекрестной энтропии или в качестве функций пригодности для генетических algs .
Соответствующий блокнот можно найти здесь: https://github.com/alexandrudaia/kinetic-correlation/blob/master/KInetic_Correlation.ipynb