Har*_*dis 6 python algorithm machine-learning distance matrix
你好社区,
我是网站的新成员(作为会员),所以如果您认为在http://datascience.stackexchange.com上发布它可能会更好,请告诉我.
我正在解决机器学习问题,该问题需要计算NxM维元素之间的距离,以便实现某些分类算法.
元素的属性是2D矩阵(Matr),因此我正在寻找最佳算法来计算2D矩阵之间的距离.正如您将看到的那样,"简单"解决方案是将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)
Run Code Online (Sandbox Code Playgroud)余弦相似性,其中我必须将(NxM)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)
Run Code Online (Sandbox Code Playgroud)KL分歧(wiki),也发现仅针对1D矩阵(Vector)实现,因此进行了以下转换:
找到每个相应行之间的熵,然后平均它们.
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)
Run Code Online (Sandbox Code Playgroud)通过附加行然后计算总熵将(NxM)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)
Run Code Online (Sandbox Code Playgroud)KS测试(wiki),也发现仅针对1D矩阵(Vector)的实现,因此进行了与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)
Run Code Online (Sandbox Code Playgroud)通过附加行然后计算总熵将(NxM)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]
Run Code Online (Sandbox Code Playgroud)所有上述工作都在我的问题中,但我很好奇,因为我找不到任何更具体的东西让我感到满意.
编辑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
Run Code Online (Sandbox Code Playgroud)
考虑到这一点,最终目标是对不同的代码系列进行分类.该系列的长度不同,但由相同的代码组成.因此,转移概率矩阵在每种情况下具有相同的维度.我有初步的问题,以找到最合适的距离算法,这将产生最佳的分类结果.
给定两个不同的转移矩阵A和B以及作为行向量的概率分布x,根据 的一步后的分布A是xA,根据 的一步后B的分布xB。x您可以使用(两倍)计算这些之间的最大统计距离
numpy.linalg.norm(A - B, numpy.inf)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
910 次 |
| 最近记录: |