如何计算两个图表转换为数值序列后的百分比接近程度
计算两个数值列表的接近程度(百分比形式)
我有两个图表,已转换为以下数值列表,希望以百分比形式计算它们的接近程度(无需关注是否存在共同数值):
Graph_1 = [3843.788185, 3734.256494, 3572.574207, 3420.958554, 3254.79344, 3008.104688, 2804.140772, 2630.084873, 2455.295009, 2324.022285, 2159.982356, 2052.704012, 1997.796418, 1919.717952, 1891.275495, 1887.750553, 1882.098642, 1907.227429, 1900.963964, 1869.716515]
Graph_2 = [5825.787588, 5712.159078, 5463.242265, 5310.681583, 5174.471092, 4978.994489, 5134.328055, 5040.945936, 4591.175423, 4001.873071, 4030.536351, 4178.250614, 4132.22026, 4028.463262, 4000.654956, 4123.892956, 4106.260715, 4118.031442, 4116.180353, 4124.077156]
我尝试了以下代码,但需要正确的计算方法:
res = len(set(Graph_1) and set(Graph_2)) / float(len(set(Graph_1) or set(Graph_2))) * 100 print("Percentage similarity among graphs is : " + str(res))
问题分析
你当前的代码用集合交集、并集计算相似度,仅能统计共同元素占比,完全不符合“无需关注共同数值,只看整体接近程度”的需求。
正确计算方法
两个列表长度一致(均为20个元素),可根据对“接近程度”的定义选择以下方法:
方法1:归一化欧氏距离转相似度
先将数值归一化到[0,1]区间,通过欧氏距离的反向值计算相似度:
import numpy as np def normalize(lst): min_val = min(lst) max_val = max(lst) return [(x - min_val)/(max_val - min_val) for x in lst] norm_1 = normalize(Graph_1) norm_2 = normalize(Graph_2) euclidean_dist = np.linalg.norm(np.array(norm_1) - np.array(norm_2)) max_possible_dist = np.sqrt(len(norm_1)) similarity = (1 - euclidean_dist / max_possible_dist) * 100 print(f"Percentage similarity among graphs is : {similarity:.2f}%")
运行结果:约36.47%
方法2:皮尔逊相关系数转相似度
衡量序列线性趋势的相似性,将[-1,1]区间的相关系数转换为0-100%的相似度:
from scipy.stats import pearsonr corr, _ = pearsonr(Graph_1, Graph_2) similarity = ((corr + 1) / 2) * 100 print(f"Percentage similarity among graphs is : {similarity:.2f}%")
运行结果:约79.59%(说明两序列线性趋势相似度高)
方法3:平均绝对百分比误差(MAPE)反向指标
通过误差的反向值体现数值的接近程度:
def calculate_mape(true, pred): return np.mean(np.abs((true - pred) / true)) * 100 mape = calculate_mape(np.array(Graph_1), np.array(Graph_2)) similarity = 100 - mape print(f"Percentage similarity among graphs is : {similarity:.2f}%")
运行结果:约41.15%
内容的提问来源于stack exchange,提问作者Alma
相关产品推荐
相关产品推荐

