如何绘制两个数据集的相似度?

数据挖掘 绘图
2022-03-02 12:16:59

我正在执行一些模拟,最后我得到一个包含三列的 CSV 文件。一列保存 x 轴的值,该值也输入到模拟和理论计算中,第二列保存理论预期值,另一列保存模拟获得的值。我打算画这样的东西:

在此处输入图像描述

但这在我的情况下看起来不太好,因为 y 轴的值通常会加倍,而 x 轴的值会呈指数增长,所以大多数点最终都被收集在左下角,靠近交叉点图的 x 轴和 y 轴。因此,我需要一种不同的方式来绘制我的数据,这将更具视觉吸引力,并告知模拟结果与理论预期结果的接近程度。例如,我的一些值可以在下面看到(并且它们以这种方式不断增加):

x         = [2, 4, 8, 16, 32, 64] # partially removed for brevity
expected  = [47.9995, 95.9783, 191.9127, 383.9708, 767.8831] # partially removed for brevity 
simulated = [48, 96, 191.8, 383.8, 767.4] # partially removed for brevity

什么是绘制这样一个在 y 轴上翻倍并在 x 轴上一直呈指数增长的数据的好方法,并查看两个数据集实际上有多相似?

2个回答

这是在 x 轴上使用对数刻度的r格子示例以及两个度量的差异xyplotI(expected - simulated)

df <- data.frame(
x         = c(2, 4, 8, 16, 32, 64),
expected  = c(47.9995, 95.9783, 
191.9127, 383.9708, 767.8831, 
1457.2771),
simulated = c(48, 96, 191.8, 383.8, 
767.4, 1458.1228))
xy <- xyplot(I(expected - simulated) ~ x ,   
auto.key=TRUE,
data =  df ,    type=c("p","g"),
scales=list(x=list(log = 10) ),   
ylab="difference expected - simulated", xlab="x", main="Simulation Results" )
print (xy)

请注意,我在您的示例数据中添加了第 6 个结果,这是丢失的。

在此处输入图像描述

这里我们有点5000010000在每个five类别中都有相关的数值。

除了使用对数之外,您还可以使用 O( log* N )迭代对数”:

在计算机科学中,n 的迭代对数,写成 log* n(通常读作“对数星”),是在结果小于或等于 1 之前必须迭代应用对数函数的次数。

Checkout Datashader(这就是你需要的)

参考笔记本

随机生成一些东西(你会明白的)

import pandas as pd
import numpy as np

np.random.seed(1)
num=10000

dists = {cat: pd.DataFrame(dict(x=np.random.normal(x,s,num),
                                y=np.random.normal(y,s,num),
                                val=val,cat=cat))
         for x,y,s,val,cat in 
         [(2,2,0.01,10,"d1"), (2,-2,0.1,20,"d2"), (-2,-2,0.5,30,"d3"), (-2,2,1.0,40,"d4"), (0,0,3,50,"d5")]}

df = pd.concat(dists,ignore_index=True)
df["cat"]=df["cat"].astype("category")
df.tail()

cat val x y 49995 d5 50 -1.397579 0.610189 49996 d5 50 -2.649610 3.080821 49997 d5 50 1.933360 0.243676 49998 d5 50 4.306374 1.032139 49999 d5 50 -0.493567 -2.242669

%time tf.shade(ds.Canvas().points(df,'x','y'))

输出图像

图片清楚地显示了 5 个正态分布