假设我有两个元素大小相同的相似数据集,例如 3D 点:
- 数据集A : { (1,2,3), (2,3,4), (4,2,1) }
- 数据集B : { (2,1,3), (2,4,6), (8,2,3) }
问题是有没有办法测量这两个数据集之间的相关性/相似性/距离?
任何帮助将不胜感激。
假设我有两个元素大小相同的相似数据集,例如 3D 点:
问题是有没有办法测量这两个数据集之间的相关性/相似性/距离?
任何帮助将不胜感激。
我看到很多人在 StackExchange 上发布了类似的问题,而事实是,如果数据集 A 看起来像集 B,则没有方法可以比较。您可以比较摘要统计信息,例如均值、偏差、最小值/最大值,但是没有什么神奇的公式可以说数据集 A 看起来像 B,尤其是当它们是按行和列改变数据集时。
我在美国最大的信用评分/欺诈分析公司之一工作。我们的模型使用大量变量。当我的团队收到报告请求时,我们必须查看每个单独的变量,以检查变量是否按照与客户上下文相关的方式填充。这非常耗时,但却是必要的。有些任务没有神奇的公式来绕过检查和深入挖掘数据。但是,任何优秀的数据分析师都应该已经了解这一点。
鉴于您的情况,我认为您应该确定您的数据/问题感兴趣的关键统计数据。您可能还想以图形方式查看分布的外观,以及变量与其他变量的关系。如果对于数据集 ATemp
和Ozone
是正相关的,并且如果 B 是通过相同的来源(或类似的随机过程)生成的,那么 B 的Temp
和Ozone
也应该表现出类似的关系。
我将通过这个例子来说明我的观点:
data("airquality")
head(airquality)
dim(airquality)
set.seed(123)
indices <- sample(x = 1:153, size = 70, replace = FALSE) ## randomly select 70 obs
A = airquality[indices,]
B = airquality[-indices,]
summary(A$Temp) ## compare quantiles
summary(B$Temp)
plot(A)
plot(B)
plot(density(A$Temp), main = "Density of Temperature")
plot(density(B$Temp), main = "Density of Temperature")
plot(x = A$Temp, y = A$Ozone, type = "p", main = "Ozone ~ Temp",
xlim = c(50, 100), ylim = c(0, 180))
lines(lowess(x = A$Temp, y = A$Ozone), col = "blue")
plot(x = B$Temp, y = B$Ozone, type = "p", main = "Ozone ~ Temp",
xlim = c(50, 100), ylim = c(0, 180))
lines(lowess(x = B$Temp, y = B$Ozone), col = "blue")
cor(x = A$Temp, y = A$Ozone, method = "spearman", use = "complete.obs") ## [1] 0.8285805
cor(x = B$Temp, y = B$Ozone, method = "spearman", use = "complete.obs") ## [1] 0.6924934
我会看一下典型相关分析。
好吧,如果您的样本是点的集合,我会将其分为两个步骤:
计算内部点之间的距离:例如,选择如何计算 (1,2,3) 和 (2,1,3) 之间的距离。在这里,根据问题的性质,您可以选择类似于欧几里德距离的方法,或者如果您只关心点的方向,例如cosinesimilarity。
将所有距离总结为一个数字:根据您的问题,您可以获得它的平均值、中位数或其他一些数量。主要思想是将所有数字减少到一个。
如果您对一维分布感兴趣,您可以使用测试(如 Kolmogorov-Smirnov 测试)。我天真地期望虽然这不能告诉你数据是否相似,但它可以告诉你是否不是。或者您创建多维直方图并计算 Chi2 相似量。显然,如果参数空间填充得相当稀疏,这可能会遇到一些问题。