首页 > 编程知识 正文

最低松弛度优先算法(算法时间复杂度的计算)

时间:2023-05-03 22:05:17 阅读:90540 作者:4277

作者|奋发的新人@知乎

资料来源| https://zhuan LAN.zhi Hu.com/p/138107999

整理了常用的距离算法和相似度(系数)算法,比较了欧几里得距离和余弦距离的差异。

1、常见的距离算法

1.1高贵的万宝路距离(欧盟距离) )。

在数学中,高贵的万宝路距离或高贵的万宝路度量是高贵的万宝路空间中两点之间的“普通”,即直线”距离。 使用这个距离的话,欧几里得空间会成为测量空间。 相关的范数被称为高贵的万宝路范数。

Euclidean Distance是常用距离的定义,是m维空间中两点之间的实际距离。

代码:

PD ist=nn .支付距离(p=2) ) )。

input1=torch.randn (100,128 ) ) ) ) ) ) ) )。

input2=torch.randn (100,128 ) ) ) ) ) ) ) ) ) )。

输出=PD ist (输入1、输入2 ) 1.2空气移动器'距离(距离) ) ) ) ) ) ) ) ) ) ) ) )。

与欧式距离一样,这些是距离测量的定义,可以用来测量某两个分布之间的距离。 EMD主要应用于图像处理和语音信号处理领域。

EMD问题指的是通过浅显地解释: Earth Move来搬运土,以最小的代价将p位置的m个洞的土搬运到q位置的n个洞。 dij是从pi到qj的两个洞的距离,fij是从pi到qj的土的量,WORK的工作量是最小化的目标。 用线性计划求解fij后,用fij将WORK正规化后得到EMD。 EMD其实是线性规划中运输问题的最优解。

EMD的具体定义可参见http://家庭页面. INF.ed.AC.uk/RBF /日本银行/本地/欧洲中心/欧洲中心/欧洲中心. HTM

代码包: emd.h,emd.c,emd.i

opencv :实现了em DAPI,并且、

pip安装--- -升级安装工具

pip安装编号匹配库

pip安装选项- python

导入编号为

导入CV

#p、q是两个矩阵,第一列表示权重,后三列表示直方图或数量

p=美国数组([ 0.4,100,40,22 ],

[0.3、211、20和2]、

[0.2、32、190和150]、

[0. 1,2,100,100 ],NP .浮点32 )

q=NP.Array ([ 0.5,0,0 ],

[0. 3,50,100,80 ]、

[0. 2,255,255,255 ],第32卷)

PP=从阵列(p )。

QQ=从阵列(q ) )。

EMD=cv.calcEMD2(PP,qq,cv.CV_DIST_L2 ) 1.3曼哈顿距离:表示两点标准坐标系上的绝对轴距离之和。 也就是说,和将棋的“车”一样,是躺下纵向走的距离。 曼哈顿距离是超凸测量。

1.4杰卡德距离(Jaccard Distance ) :是衡量两个集合差异的一个指标,它是杰卡德类似系数的补集,定义为1减去Jaccard类似系数。 适用于集合相似性度量、字符串相似性度量。

1.5 lgdgb的“距离”:表示点与分布之间的距离。 这是一种有效计算两个未知样本集相似度的方法。 与欧几里得距离不同,考虑到各种特性之间的关联,例如,有关身高的信息会带来有关体重的信息,因为两者有关联,所以与尺度无关,即独立于测量尺度。 欧式距离中各维度的尺度不一致,修正了相关问题。

单一据点的lgdgb距离:

数据点x、y之间的lgd千兆字节距离:

其中是多维随机变量的协方差矩阵。 如果协方差矩阵为单位向量,即各维独立同分布,则lgdgb距离为欧式距离。

导入编号为

def mashi _距离(x,y ) :

打印x

打印y

#lgdgb距离的样本数必须大于维数,否则无法求出协方差矩阵

# #在此倒置,表示10个样本,每个样本为二维

x=NP.v堆栈([ x,y] ) )。

打印x

XT=X.T

打印XT

# #方法1 :根据公式求解

s=NP.cov(x ) #两个维之间的协方差矩阵

SI = np.linalg.inv(S) #协方差矩阵的逆矩阵 #lgdgb距离计算两个样本之间的距离,此处共有4个样本,两两组合,共有6个距离。 n=XT.shape[0] d1=[] for i in range(0,n): for j in range(i+1,n): delta=XT[i]-XT[j] d=np.sqrt(np.dot(np.dot(delta,SI),delta.T)) print d d1.append(d)

1、xqdyg距离(Chebyshev Distance)

2、畅快的泥猴桃距离(sdsj Distance)

3、海明距离(Hamming distance)

4、马哈拉诺比斯距离(Mahalanobis Distance)

2、常见的相似度(系数)算法

2.1 余弦相似度(Cosine Similarity)

余弦相似度是用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小的度量。

性质:给出的相似性范围从-1到1:-1意味着两个向量指向的方向正好截然相反,1表示它们的指向是完全相同的,0通常表示它们之间是独立的,而在这之间的值则表示中间的相似性或相异性。

代码:

>>> input1 = torch.randn(100, 128) >>> input2 = torch.randn(100, 128) >>> cos = nn.CosineSimilarity(dim=1, eps=1e-6) >>> output = cos(input1, input2)

2.2 皮尔森相关系数(Pearson Correlation Coefficient): 用于度量两个变量X和Y之间的相关(线性相关),其值介于-1与1之间。

分子是两个集合的交集大小,分母是两个集合大小的几何平均值。是余弦相似性的一种形式。

hxddr相关系数具有平移不变性和尺度不变性,计算出了两个向量(维度)的相关性。在各个领域都应用广泛,例如,在推荐系统根据为某一用户查找喜好相似的用户,进而提供推荐,优点是可以不受每个用户评分标准不同和观看影片数量不一样的影响。

代码:

>>> torch.nn.functional.kl_div(input, target, size_average=None, reduce=None, reduction='mean')>>> F.kl_div(q.log(),p,reduction='sum')#函数中的 p q 位置相反(也就是想要计算D(p||q),要写成kl_div(q.log(),p)的形式),而且q要先取 log#reduction 是选择对各部分结果做什么操作,

2.3 KL散度(Kullback-Leibler Divergence): 即相对熵;是衡量两个分布(P、Q)之间的距离;越小越相似。

表示的就是概率 q 与概率 p 之间的差异,很显然,散度越小,说明 概率 q 与概率 p 之间越接近,那么估计的概率分布于真实的概率分布也就越接近。

代码:

>>> torch.nn.functional.kl_div(input, target, size_average=None, reduce=None, reduction='mean') >>> F.kl_div(q.log(),p,reduction='sum') #函数中的 p q 位置相反(也就是想要计算D(p||q),要写成kl_div(q.log(),p)的形式),而且q要先取 log #reduction 是选择对各部分结果做什么操作,

2.4 Jaccard相似系数(Jaccard Coefficient): 主要用于计算符号度量或布尔值度量的样本间的相似度。两个集合A和B的交集元素在A,B的并集中所占的比例,称为两个集合的杰卡德相似系数,用符号J(A,B)表示。杰卡德系数值越大,样本的相似度越高。

应用:假设样本A和样本B是两个n维向量,而且所有维度的取值都是0或1。例如,A(0,1,1,0)和B(1,0,1,1)。我们将样本看成一个集合,1表示集合包含该元素,0表示集合不包含该元素。p:样本A与B都是1的维度的个数;q:样本A是1而B是0的维度的个数; r:样本A是0而B是1的维度的个数;s:样本A与B都是0的维度的个数

那么样本A与B的杰卡德相似系数可以表示为:

杰卡德相似度没有考虑向量中潜在数值的大小,而是简单的处理为0和1,不过,做了这样的处理之后,杰卡德方法的计算效率肯定是比较高的,毕竟只需要做集合操作。

import numpy as np from scipy.spatial.distance import pdist x=np.random.random(8)>0.5 y=np.random.random(8)>0.5 x=np.asarray(x,np.int32) y=np.asarray(y,np.int32) #方法一:根据公式求解 up=np.double(np.bitwise_and((x != y),np.bitwise_or(x != 0, y != 0)).sum()) down=np.double(np.bitwise_or(x != 0, y != 0).sum()) d1=(up/down) #方法二:根据scipy库求解 X=np.vstack([x,y]) d2=pdist(X,'jaccard')

2.5 Tanimoto系数(广义Jaccard相似系数)

其中A、B分别表示为两个向量,集合中每个元素表示为向量中的一个维度,在每个维度上,取值通常是[0, 1]之间的值(如果取值是二值向量0或1,那么Tanimoto系数就等同Jaccard距离), 表示向量乘积, 表示向量的模。

import numpy as np def tanimoto_coefficient(p_vec, q_vec): """ This method implements the cosine tanimoto coefficient metric :param p_vec: vector one :param q_vec: vector two :return: the tanimoto coefficient between vector one and two """ pq = np.dot(p_vec, q_vec) p_square = np.linalg.norm(p_vec) q_square = np.linalg.norm(q_vec) return pq / (p_square + q_square - pq)

2.6 互信息(Mutual Information) :是信息论里一种有用的信息度量,它可以看成是一个随机变量 中包含的关于另一个随机变量的信息量,或者说是一个随机变量由于已知另一个随机变量而减少的不肯定性。衡量随机变量之间相互依赖程度的度量。

设两个随机变量(X,Y)的联合分布为P(x,y),边缘分布分别为P(x),p(y),互信息I(X;Y)是联合分布p(x,y)与边缘分布p(x)p(y)的相对熵,即:

#标准化互信息 from sklearn import metrics if __name__ == '__main__': A = [1, 1, 1, 2, 3, 3] B = [1, 2, 3, 1, 2, 3] result_NMI=metrics.normalized_mutual_info_score(A, B) print("result_NMI:",result_NMI)

1、对数似然相似度/对数似然相似率

2、互信息/信息增益,相对熵/KL散度

3、信息检索——词频-逆文档频率(TF-IDF)

4、词对相似度——点间互信息

3、欧式距离vs余弦相似度

欧氏距离衡量的是空间各点的绝对距离,跟各个点所在的位置坐标直接相关;而余弦距离衡量的是空间向量的夹角,更加体现在方向上的差异,而不是位置。如果保持A点位置不变,B点朝原方向远离坐标轴原点,那么这个时候余弦距离是保持不变的,而A、B两点的距离显然在发生改变,这就是欧氏距离和余弦距离之间的不同之处。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。