查找两个数据集之间的相似性

数据挖掘 机器学习 Python 统计数据 模拟
2022-02-21 16:53:20

我有两个数据集。一个是美国各州白人人口的实际百分比,另一个是美国各州白人人口的模拟百分比。

关于我的模拟的位:

这是在加利福尼亚地图上使用两个不同的代理(白人和少数族裔)进行的随机模拟。他们的总人口是基于加州真正的白人与少数族裔的比例。例如,如果加州有 70% 的白人和 30% 的少数族裔,那么代理人(比如说总共 100 个)将是 70 个白人和 30 个少数族裔。首先,地图随机填充两个代理,然后执行大约 100 次模拟迭代。在每次迭代中,代理都会根据特定条件移动。数据是在第 100 次迭代后获取的,其中包括加利福尼亚某个县的白人和少数族裔的百分比。

下面是来自加利福尼亚州的数据

california_actual_white = [0.52, 0.72, 0.9, 0.86, 0.91, 0.91, 0.67, 0.79, 0.89, 0.77, 0.89, 0.84, 0.9, 0.81, 0.82, 0.81, 0.87, 0.82, 0.71, 0.86, 0.86, 0.9, 0.86, 0.82, 0.89, 0.91, 0.82, 0.84, 0.93, 0.72, 0.85, 0.91, 0.8, 0.64, 0.88, 0.77, 0.76, 0.54, 0.67, 0.89, 0.61, 0.85, 0.55, 0.87, 0.88, 0.94, 0.87, 0.61, 0.87, 0.83, 0.73, 0.9, 0.88, 0.88, 0.9, 0.84, 0.75, 0.79]

california_simulated_white = [0.48, 0.54, 0.6, 0.62, 0.66, 0.69, 0.71, 0.71, 0.71, 0.72, 0.74, 0.75, 0.77, 0.78, 0.79, 0.79, 0.8, 0.8, 0.8, 0.81, 0.81, 0.82, 0.82, 0.82, 0.83, 0.84, 0.85, 0.85, 0.87, 0.87, 0.87, 0.88, 0.91, 0.92, 0.93, 0.93, 0.94, 0.94, 0.94, 0.94, 0.95, 0.95, 0.97, 0.97, 0.98, 0.98, 0.98, 0.98, 0.99, 0.99, 0.99, 0.99, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]

我将如何找到这两个数据集之间的相似性度量。

我发现这三个选项可用于查找相似性,并且它们在 Python 中都有一个方法:

1) 推土机的距离

2) Kullback-Leibler 散度

3) 余弦相似度

但是我对使用这些方法有一些疑问。他们是

1)使用 Kullback-Leibler 散度和余弦相似度,如果我重新洗牌两个数组并再次计算两个指标,则值会发生变化,但地球移动器距离并非如此。关于数据点的重新洗牌/位置,它将为您提供两个数据集相同的值,这让我想到使用这个指标。

2)但第二个疑问是,您只能在两个概率分布下使用 KL 散度和地球移动器距离。所以我在这里不确定上面的两个数据集是否是概率分布。

所以我最后的两个问题是——

1)上述数据集是否被视为概率分布?如果是,为什么?

2)如果1)是,那么确定相似度的最佳方法是什么。如果 1) 不是,那么确定相似度的最佳方法是什么?

在我倾向于地球移动距离之前,因为我在疑问部分中说明了原因。

1个回答

我会说它们是概率分布。您可以将它们解释为来自给定县的随机抽取的人属于白人多数的概率。但是,它们不是概率向量,因为这要求它们总和为 1。更重要的是,数组的每个元素都定义了一个分布,例如,来自县 1 的随机人是概率为 0.52 的白人,并且是 a少数概率为 1-0.52=0.48。如果您想将此分布与您的模拟进行比较,则必须按元素进行比较,例如将 0.52/0.48 实际分布与 0.48/0.52 模拟分布进行比较。这也是重新洗牌导致不同结果的原因:突然之间,您将县 1 的实际分布与县 5 的模拟分布进行比较。这没有多大意义。所以如果你洗牌,你需要以同样的方式洗牌两个数组。

由于您可以将每个县的分布解释为彼此独立,因此您可以计算每个县的 DKL 或余弦或 Earth's Movers 并可能将它们总结起来。

我不确定哪种方法最好。我可能会出于习惯而选择 DKL。你可以这样计算

dkl = 0.52*log(0.52/0.48) + (1-0.52)*log((1-0.52)/(1-0.48)) + ...

我希望这有帮助!