資源簡介
提供了3種矩陣相似度的度量方法。python。詳見https://mp.csdn.net/mdeditor/79991322
代碼片段和文件信息
import?numpy?as?np
from?PIL?import?Image
def?mtx_similar1(arr1:np.ndarray?arr2:np.ndarray)?->float:
????‘‘‘
????計算矩陣相似度的一種方法。將矩陣展平成向量,計算向量的乘積除以模長。
????注意有展平操作。
????:param?arr1:矩陣1
????:param?arr2:矩陣2
????:return:實際是夾角的余弦值,ret?=?(cos+1)/2
????‘‘‘
????farr1?=?arr1.ravel()
????farr2?=?arr2.ravel()
????len1?=?len(farr1)
????len2?=?len(farr2)
????if?len1?>?len2:
????????farr1?=?farr1[:len2]
????else:
????????farr2?=?farr2[:len1]
????#~如果矩陣的維度、向量的模長不一樣。
????numer?=?np.sum(farr1?*?farr2)
????denom?=?np.sqrt(np.sum(farr1**2)?*?np.sum(farr2**2))
????similar?=?numer?/?denom?#?這實際是夾角的余弦值
????return??(similar+1)?/?2?????#?姑且把余弦函數當線性
def?mtx_similar2(arr1:np.ndarray?arr2:np.ndarray)?->float:
????‘‘‘
????計算對矩陣1的相似度。相減之后對元素取平方再求和。因為如果越相似那么為0的會越多。
????如果矩陣大小不一樣會在左上角對齊,截取二者最小的相交范圍。
????:param?arr1:矩陣1
????:param?arr2:矩陣2
????:return:相似度(0~1之間)
????‘‘‘
????if?arr1.shape?!=?arr2.shape:
????????minx?=?min(arr1.shape[0]arr2.shape[0])
????????miny?=?min(arr1.shape[1]arr2.shape[1])
????????differ?=?arr1[:minx:miny]?-?arr2[:minx:miny]
????else:
????????differ?=?arr1?-?arr2
????numera?=?np.sum(differ**2)
????denom?=?np.sum(arr1**2)
????similar?=?1?-?(numera?/?denom)
????return?similar
def?mtx_similar3(arr1:np.ndarray?arr2:np.ndarray)?->float:
????‘‘‘
????From?CS231n:?There?are?many?ways?to?decide?whether
????two?matrices?are?similar;?one?of?the?simplest?is?the?Frobenius?norm.?In?case
????you?haven‘t?seen?it?before?the?Frobenius?norm?of?two?matrices?is?the?square
????root?of?the?squared?sum?of?differences?of?all?elements;?in?other?wor
評論
共有 條評論