Python计算序列相似度的算法实例

 更新时间:2023年07月28日 10:35:33   作者:Eyizoha  
这篇文章主要介绍了Python计算序列相似度的算法实例,求两个序列转换的最少交换步骤和最小交换距离,本文提供了部分实现代码与解决思路,对开发非常有帮助,需要的朋友可以参考下

Python计算序列相似度的算法

代码

位方差(location square deviation, LSD)

def location_square_deviation(lst_1, lst_2=None):
    n = len(lst_1)
    lst = lst_1.copy()
    if lst_2 is not None:
        if n != len(lst_2):
            return False
        for i in range(n):	# 以lst2为映射表,将lst1映射为lst可直接与[0,1,2,...]比较
            lst[lst_1.index(lst_2[i])] = i
    s = 0
    for i in range(n):
        s += (lst[i]-i) ** 2
    s /= n
    return s

位均差(location mean deviation, LMD)

def location_mean_deviation(lst_1, lst_2=None):
    n = len(lst_1)
    lst = lst_1.copy()
    if lst_2 is not None:
        if n != len(lst_2):
            return False
        for i in range(n):
            lst[lst_1.index(lst_2[i])] = i
    s = 0
    for i in range(n):
        s += abs(lst[i]-i)
    s /= n
    return s

交换差(swap deviation, SD)

def swap_deviation(lst_1, lst_2=None):
    n = len(lst_1)
    lst = lst_1.copy()
    if lst_2 is not None:
        if n != len(lst_2):
            return False
        for i in range(n):
            lst[lst_1.index(lst_2[i])] = i
    count = 0	# 计算序列中的循环数
    for i in range(n):
        if lst[i] == -1:
            continue
        p = i
        while lst[p] != -1:
            q = lst[p]
            lst[p] = -1
            p = q
        count += 1
    return n - count # 序列长减去循环数即为最小交换次数

交换距离差(swap distance deviation, SDD)

def swap_distance_deviation(lst_1, lst_2=None):
    n = len(lst_1)
    lst = lst_1.copy()
    if lst_2 is not None:
        if n != len(lst_2):
            return False
        for i in range(n):
            lst[lst_1.index(lst_2[i])] = i
    swap_lst = []
    weight = 0
    while location_mean_deviation(lst) != 0:
        r_best = 0	# 最佳交换收益
        i_best = 0
        j_best = 0
        for i in range(n):
            for j in range(i+1, n):	# 遍历所有交换,寻找最佳交换步骤
            	# 交换收益r=交换后位均差的下降值ΔLMD(A,B)/交换距离(j-i)
            	# 令交换距离恒为1可求最少交换步骤&最少交换次数
                r = ((abs(lst[i]-i)+abs(lst[j]-j)) - (abs(lst[j]-i)+abs(lst[i]-j)))/(j-i)
                if r > r_best:
                    r_best = r
                    i_best = i
                    j_best = j
        lst[i_best], lst[j_best] = lst[j_best], lst[i_best]
        weight += (j_best-i_best)
        swap_lst.append((i_best, j_best))
    # return swap_lst # 求最小交换距离的步骤(交换距离为1则是求最少交换步骤)
    return weight

值方差(value square deviation, VSD)

def value_square_deviation(lst_1, lst_2=None):
    n = len(lst_1)
    if lst_2 is not None:
        if n != len(lst_2):
            return False
    else:
        lst_2 = [i for i in range(n)]
    s = 0
    for i in range(n):
        s += (lst_1[i] - lst_2[i]) ** 2
    s /= n
    return s

值均差(value mean deviation, VMD)

def value_mean_deviation(lst_1, lst_2=None):
    n = len(lst_1)
    if lst_2 is not None:
        if n != len(lst_2):
            return False
    else:
        lst_2 = [i for i in range(n)]
    s = 0
    for i in range(n):
        s += abs(lst_1[i] - lst_2[i])
    s /= n
    return s

点积比(dot product ratio, DPR)

def dot_product_ratio(lst_1, lst_2=None):
    n = len(lst_1)
    if lst_2 is not None:
        if n != len(lst_2):
            return False
    else:
        lst_2 = [i for i in range(n)]
    s = 0
    max_s = 0
    for i in range(n):
        s += lst_1[i] * lst_2[i]
        max_s += lst_1[i] ** 2
    s /= max_s
    return s

归一化点积比(normalization dot product ratio, NDPR)

def normalization_dot_product_ratio(lst_1, lst_2=None):
    n = len(lst_1)
    if lst_2 is not None:
        if n != len(lst_2):
            return False
    else:
        lst_2 = [i for i in range(n)]
    s = (2*n-1)/(n+1)*dot_product_ratio(lst_1, lst_2)-(n-2)/(n+1)
    return s

到此这篇关于Python计算序列相似度的算法实例的文章就介绍到这了,更多相关Python序列相似度内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用Python实现快速搭建本地HTTP服务器

    使用Python实现快速搭建本地HTTP服务器

    这篇文章主要介绍了如何使用Python快速搭建本地HTTP服务器,轻松实现一键 HTTP 文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了解下
    2025-04-04
  • Python实现自动发消息自定义内容的操作代码

    Python实现自动发消息自定义内容的操作代码

    这篇文章主要介绍了Python实现自动发消息自定义内容的操作代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • python通过smpt发送邮件的方法

    python通过smpt发送邮件的方法

    这篇文章主要介绍了python通过smpt发送邮件的方法,涉及Python实现发送邮件的相关技巧,非常简单实用,需要的朋友可以参考下
    2015-04-04
  • Python 实现输入任意多个数,并计算其平均值的例子

    Python 实现输入任意多个数,并计算其平均值的例子

    今天小编就为大家分享一篇Python 实现输入任意多个数,并计算其平均值的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • Python快速转换numpy数组中Nan和Inf的方法实例说明

    Python快速转换numpy数组中Nan和Inf的方法实例说明

    今天小编就为大家分享一篇关于Python快速转换numpy数组中Nan和Inf的方法实例说明,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • Python基础之文件读取的讲解

    Python基础之文件读取的讲解

    今天小编就为大家分享一篇关于Python基础之文件读取的讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • python日志通过不同的等级打印不同的颜色(示例代码)

    python日志通过不同的等级打印不同的颜色(示例代码)

    这篇文章主要介绍了python日志通过不同的等级打印不同的颜色,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • 浅谈pycharm使用及设置方法

    浅谈pycharm使用及设置方法

    这篇文章主要介绍了浅谈pycharm使用及设置方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • Python Pandas的concat合并

    Python Pandas的concat合并

    这篇文章主要介绍了Python Pandas的concat合并,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • python3中bytes和string之间的互相转换

    python3中bytes和string之间的互相转换

    这篇文章主要介绍了python3中bytes和string之间的互相转换,文中给出了详细的介绍和示例代码,相信对大家具有一定的参考价值,有需要的朋友们下面来一起学习学习吧。
    2017-02-02

最新评论