如何从统计意义上判断两个数据集的相似度?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从统计意义上判断两个数据集的相似度?相关的知识,希望对你有一定的参考价值。

事实上用统计来说判断两个数据集的相似度的方法不是很好!
以下是我的几点猜想!
1:假设把整个数据化成条形统计图!长方形的形状和大小应相似有个前提,就是数据图要比较精确
否则,误差很大!
2:我们知道:条形图的长方形的面积是
频率
那么两个数据集的频率也因接近!
还有频数
貌似只有这些了,我必修三数学基本上没听过课,说一没办法继续帮助你!请见谅!
有什么问题可以请教《数学麦圈》呵呵!
参考技术A 利用熵来判断两个向量之间的相似度,可以用利用熵权系数法来评价,利用熵的原理,统一用定量的方式来判断

如何从python中的两个一维数组中绘制相似度热图?

【中文标题】如何从python中的两个一维数组中绘制相似度热图?【英文标题】:How to draw a heatmap of similarity from two one dimensional arrays in python? 【发布时间】:2021-09-16 07:08:12 【问题描述】:

我有两个数组如下,

a = np.array([5., 10., 20., 19., 1., 10., 60.])
b = np.array([7., 10., 10., 17., 20., 0., 50.])

我希望能够绘制一个热图,显示数组 a 与数组 b 的接近程度。如果可能,在鼠标悬停时显示 a 值和 b 值。例如,数组 a 中的 1 与数组 b 中的 20 不接近——应该是较浅的颜色,等等。知道从哪里开始吗?谢谢。

【问题讨论】:

你可以使用Seaborn 你想要一维的连续地图吗?还是沿一个轴的离散彩色点? @joostblack 我想画一个二维图。在 x 轴上,a 和 y 轴 b - 像这样。你知道怎么去吗? 你想要a中的一个元素到b中所有其他元素的距离,反之亦然吗? 【参考方案1】:

Scikit-learn 有一个方便的 function 来计算成对距离。您只需要重塑数组,因为它需要 2d 数组作为输入。然后我也会按照 Eduardo 的建议使用 seaborn。

import numpy as np
from sklearn.metrics import pairwise_distances
import seaborn as sns

a = np.array([5., 10., 20., 19., 1., 10., 60.])
b = np.array([7., 10., 10., 17., 20., 0., 50.])

distances = pairwise_distances(X=a.reshape(-1, 1), Y=b.reshape(-1, 1))

sns.heatmap(distances, square=True, annot=True, cbar=False, cmap='Blues');

编辑:要反转颜色,您可以改用颜色图'Blues_r'。我不知道是否有办法在 seaborn 级别翻转 y 轴,但您始终可以翻转输入数据并相应地更改标签:

distances = pairwise_distances(X=np.flip(a).reshape(-1, 1), Y=b.reshape(-1, 1))
sns.heatmap(distances, square=True, annot=True, cbar=False, cmap='Blues_r', 
            yticklabels=list(reversed(range(len(a)))));

【讨论】:

谢谢一百万。是否可以翻转y轴?以及如何以翻转顺序设置颜色?例如,10 和 10 应该更暗,因为它是 100% 相同的,20 和 10 是 50% 相似的,等等。 当然,这是可能的。我在答案中添加了一段。 哇!谢谢@Arne。实际上,我的 np 数组很大。我只花了20。它看起来很乱。 a 【参考方案2】:

您的数据代表什么?有很多方法可以比较事物并确定它们是否不同。您可以计算差异、比率等。如果没有更多上下文,就没有正确的方法来解决您的问题。

如果您的两个值应该成比例,我会将它们绘制为散点图,每个值都作为轴

import pandas as pd
a = np.array([5., 10., 20., 19., 1., 10., 60.])
b = np.array([7., 10., 10., 17., 20., 0., 50.])
df = pd.DataFrame('a': a, 'b': b)
df.plot.scatter(x='a', y='b')

你也可以使用seaborn的regplot:

import seaborn as sns
ax = sns.regplot(data=df, x='a', y='b', robust=True)

如果您真的想使用热图,我会选择 clustermap,因为这会将相似的值和不同的值聚集在一起:

sns.clustermap(df)

使用annot=True 参数显示值:

【讨论】:

谢谢一百万。你提出了一个很好的问题。数组 a 是真实标签,数组 b 是 ML 模型的预测。我想展示模型的表现。因此,如果您有其他想法,请随时告诉。

以上是关于如何从统计意义上判断两个数据集的相似度?的主要内容,如果未能解决你的问题,请参考以下文章

如何衡量两个“任意数据集”间的相似度?

paper 113:Bhattacharyya distance

如何确定Keras ImageDataGenerator中测试数据集的最佳“步数”和“批量大小”?

多维数据聚类

如何找到一个非常大的数组的余弦相似度

马氏距离(Mahalanobis distance)