Взвешенная корреляционная функция в python - PullRequest
0 голосов
/ 09 апреля 2020

Я пытался реализовать взвешенную корреляционную функцию на основе статьи в ссылке, формула № 2:

http://staff.ustc.edu.cn/~lshao/papers/paper07.pdf

пусть предположим, что 3 вектора s, r и w каждый из n элементов. Вектор w получается из следующих формул:

w = |r|/(1+D)
D = |s - k*r|
k = (r_Transpose * s)/(r_Transpose*r)

Я хотел бы реализовать формулу для взвешенной корреляционной функции, описанную в статье. Это правильно моя реализация? Я начну с матрицы измерений [224 640], что означает, что у меня 640 векторов из 224 элементов. Я хотел бы рассчитать взвешенный коэффициент корреляции между этими 640 векторами относительно другого вектора - r. Каждый из этих 640 векторов является вектором s.

ref = reference  
ref_mean = np.mean(ref)  # calcolo il valore medio dello spettro di riferimento
sens = 190  


frame_correlation = np.zeros((1,640))
img_correlation = np.zeros((nf,npixels))

for i in range(nf):
    frame_test = dati_new[:,:,i]   Selection of one matrix from a cell of matrices
    for j in range(npixels):

        spettro_test = frame_test[:,j]     # is my vector s
        spettro_test = np.reshape(spettro_test,(224,1))
        spettro_test_mean = np.mean(spettro_test) 

        k = np.dot(np.transpose(ref),spettro_test)/np.dot(np.transpose(ref),ref)
        k = k[0][0]
        D = np.abs(spettro_test - k*ref)
        W = np.abs(ref)/(1+D)

        # NUMERATOR OF FORMULA IN THE ARTICLE
        numeratore = np.sum(W*(spettro_test - spettro_test_mean)*(ref - ref_mean))

        # DENOMINATOR
        den1_ex = np.sqrt(np.sum(W*np.power(spettro_test - spettro_test_mean,2)))
        den2_ex = np.sqrt(np.sum(W*np.power(ref  - ref_mean,2)))
        denominatore = den1_ex * den2_ex
        rho = numeratore/denominatore

        if rho < 0:
            rho  = 0
        if rho  > 1: # for safety reason
            rho = 1

        if rho >=0.99:
            rho = (sens*rho)/100
        frame_correlation[:,j]= rho
    img_correlation[i,:] = frame_correlation

1 Ответ

0 голосов
/ 28 апреля 2020

это код, который я написал для реализации функции взвешенной корреляции между двумя массивами, выбранными из матрицы.

ref = reference  
ref_mean = np.mean(ref)  
sens = 190

nf = n #number of matrices    
frame_correlation = np.zeros((1,640))
img_correlation = np.zeros((nf,npixels))

for i in range(nf):
    frame_test = dati_new[:,:,i]  #dati_new is a 3D structure made of nf matrices    
    for j in range(npixels):

        spettro_test = frame_test[:,j]    
        spettro_test = np.reshape(spettro_test,(224,1))
        spettro_test_mean = np.mean(spettro_test) 

        # calcolo del peso per lo spettro selezionato
        k = np.dot(np.transpose(ref),spettro_test)/np.dot(np.transpose(ref),ref)
        k = k[0][0]
        D = np.abs(spettro_test - k*ref)
        W = np.abs(ref)/(1+D)

        # Definizione del numeratore del coefficiente di correlazione

        numeratore = np.sum(W*(spettro_test - spettro_test_mean)*(ref - ref_mean))

        # Definizione del denominatore del coefficiente di correlazione

        den1_ex = np.sqrt(np.sum(W*np.power(spettro_test - spettro_test_mean,2)))
        den2_ex = np.sqrt(np.sum(W*np.power(ref  - ref_mean,2)))
        denominatore = den1_ex * den2_ex
        rho = numeratore/denominatore

        if rho < 0:
            rho  = 0
        if rho  > 1: # just in case
            rho = 1

        if rho >=0.998:
            rho = (sens*rho)/100
        frame_correlation[:,j]= rho
    img_correlation[i,:] = frame_correlation

img_correlation = np.array(img_correlation)

fig, ax=plt.subplots()
ax.imshow(img_correlation,cmap="gray", origin="lower")
plt.title('correlation coefficient image')
plt.xlabel("Pixels")
plt.ylabel("Number of frames")
plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...