你好社區,如何計算距離的二維矩陣
我是新(作爲成員)的網站,所以如果你認爲它可能會更好張貼在http://datascience.stackexchange.com,讓我知道。
我正在處理機器學習問題,它需要計算NxM維元素之間的距離,以實現某些分類算法。
元素的屬性是一個二維矩陣(矩陣),因此我正在尋找最佳算法來計算二維矩陣之間的距離。如你所見,「簡單」解決方案是將2D轉換爲1D(矢量),然後實現任何距離算法,但我正在尋找更方便的東西(如果存在)。
到目前爲止我已經使用以下方法:
各元件之間的歐幾里德距離。
import numpy as np def dist_euclidean(elem1, elem2): t_sum=0 for i in range(len(elem1.Matr)): for j in range(len(elem1.Matr[0])): t_sum+= np.square(elem1.Matr[i][j]-elem2.Matr[i][j]) return np.sqrt(t_sum)
餘弦相似度,其中我不得不的(N×M個)2D矩陣轉換成(1xNM)載體。
from scipy.spatial import distance def dist_cosine(elem1, elem2): temp1=[] temp2=[] for i in range(len(elem1.Matr)): temp1.extend(elem1.Matr[i]) temp2.extend(elem2.Matr[i]) return distance.cosine(temp1, temp2)
KL散度(wiki),還發現實現僅一維矩陣(向量),由此做了以下轉換:
實測值每個對應行之間的熵,然後取它們的平均值。
import numpy as np from scipy.stats import entropy def dist_KL_row_avg(elem1, elem2): Y=[] for i in range(len(elem1.Matr)): Y.append(entropy(elem1.Matr[i], elem2.Matr[i])) return np.average(Y)
通過附加行,然後計算總熵轉換的(N×M個)2D矩陣代入(1xNM)載體。
import numpy as np from scipy.stats import entropy def dist_KL_1d_total(elem1, elem2): temp1=[] temp2=[] for i in range(len(elem1.Matr)): temp1.extend(elem1.Matr[i]) temp2.extend(elem2.Matr[i]) return entropy(temp1, temp2)
KS試驗(wiki),還發現實現僅一維矩陣(矢量),從而也做了同樣的轉化如在KL實現:
實測值之間的熵每個相應的行然後平均它們。
import numpy as np from scipy.stats import ks_2samp def dist_KS_row_avg(elem1, elem2): Y=[] Z=[] for i in range(len(elem1.Matr)): Y.append(ks_2samp(elem1.Matr[i], elem2.Matr[i])) Z=[x[0]/x[1] for x in Y] return np.average(Z)
通過附加行,然後計算總熵轉換的(N×M個)2D矩陣代入(1xNM)載體。
import numpy as np from scipy.stats import ks_2samp def dist_KS_1d_total(elem1, elem2): temp1=[] temp2=[] for i in range(len(elem1.Matr)): temp1.extend(elem1.Matr[i]) temp2.extend(elem2.Matr[i]) Y = ks_2samp(temp1, temp2) return Y[0]/Y[1]
都在我的問題上的工作,但我得到了好奇,因爲我無法找到任何更具體的說我非常滿意。
編輯1。 由於pltrdy建議,這裏有一些關於這個問題的更多信息。
每個元素的初始數據是一系列代碼ex(C-> B-> D-> B-> A),然後將其轉換爲也針對每一行進行歸一化的轉換矩陣。因此,矩陣中的每個單元表示從代碼[i]到代碼[j]的過渡概率。例如:
IN: A->C->B->B->A->C->C->A
OUT:
A B C
A 0 0 1
B 0.5 0.5 0
C 0.33 0.33 0.33
考慮到這一點,最終目標是對不同的代碼系列進行分類。該系列的長度不一樣,但是由相同的代碼組成。因此,轉換概率矩陣在每種情況下具有相同的尺寸。 我有最初的問題,以找到最合適的距離算法,這將產生最佳的分類結果。
您應該提供有關上下文/目標的更多信息。 我的意思是,在我看來,完全不可能提出一個好的距離函數,而沒有任何目標的想法。它就像在說「如果你有兩點使用曼哈頓/歐幾里德(等)距離」。在這種情況下,我們可以使用更一般的距離函數(例如,像你的2D點一樣用於歐幾里得),但這不會真正產生,也許不適合你的需要。 – pltrdy
Thanx的建議,我沒有發佈很多信息,以免混淆讀者。我希望編輯能夠幫助,讓我知道更多的澄清。 –
可以肯定的是,分類任務是從一系列代碼中預測概率矩陣(在我們的例子中是這樣)? 我不確定這是否是嚴格意義上的分類任務。我的意思是,我從來沒有見過一個矩陣作爲輸出tbh。 – pltrdy