有没有衡量传播“均匀性”的方法?


14

我在网上查找,但找不到任何有用的信息。

我基本上是在寻找一种衡量值的“平均”分配方式的方法。例如,X“均匀”分布分布: 在此处输入图片说明

均值和标准差大致相同的“不均匀”分布Y在此处输入图片说明

但是,是否有任何均匀性度量m使得m(X)> m(Y)?如果没有,那么创建这种度量的最佳方法是什么?

(图片来自可汗学院的屏幕截图)


1
偏斜呢?
wolfsatthedoor

熵对于具有相同支持的离散分布很好。但是我不知道连续分布是否很好。
斯特凡·洛朗

您确定点图是您想要的吗?我认为您并不是真的要问均匀性。这听起来像是关于“结块”或“聚类程度”或什至是多模态的问题。
shadowtalker 2014年

@StéphaneLaurent-其他一些人也向我推荐了熵。您能花点时间并详细说明一下吗?
Ketan 2014年

1
您需要更清楚地定义“均匀分布”的含义。我的直觉大脑说,这样的数据1,4,7,10,13,...完全均匀地分布。但是您可能会说完全不同的东西。
埃米尔·弗里德曼

Answers:


16

Ripley K函数及其近亲L函数是一种标准的,功能强大的,易于理解的,理论上公认的且经常实施的“均匀性”度量 尽管这些通常用于评估二维空间点配置,但使它们适应一维(通常在参考文献中未给出)所需的分析很简单。


理论

K函数估计典型点距离内点的平均比例。有关间隔的均匀分布[ 0 1 ],真实的比例可以计算和(渐近在样本大小)等于1 - 1 - d 2。L函数的适当一维形式从K减去该值以显示与均匀性的偏差。 因此,我们可能考虑将任何一批数据标准化为具有单位范围,并检查其L函数的零附近偏差。d[0,1]1(1d)2


工作实例

为了说明,我已经模拟大小的独立样本64从均匀分布和标绘它们的(归一化)L-功能对于较短距离(从01 / 3),从而产生估计为L函数的采样分布的包络。(在该包络线内的绘制点无法与均匀性区分开来。)在此之上,我从U形分布,具有四个明显成分的混合物分布和标准正态分布中绘制了相同大小样本的L函数。这些样本(及其父级分布)的直方图显示为参考,使用线符号匹配L函数的直方图。9996401/3

数字

U形分布的尖锐尖峰(红色虚线,最左侧的直方图)创建了紧密间隔的值簇。L函数在处有很大的斜率反映了这一点。然后,L函数减小,最终变为负数,以反映中间距离处的间隙。0

来自正态分布(实线,最右边的直方图)的样本相当接近均匀分布。因此,其L函数不会很快偏离。但是,距离为0.10左右时,它已经足够上升到包络线上方,表明有轻微的聚集趋势。跨中间距离的持续上升表明聚类是分散的和广泛的(不限于某些孤立的峰)。00.10

来自混合物分布的样本的初始大斜率(中间直方图)显示了在小距离(小于)处的聚类。通过下降到负值,它发出中间距离的信号。将其与U形分布的L函数进行比较可以揭示:0处的斜率,这些曲线上升到0以上的量以及它们最终下降到0的速率都提供了有关存在于此的聚类性质的信息。数据。这些特征中的任何一个都可以选择为“均匀度”的单个度量,以适合特定的应用。0.15000

这些示例显示了如何检查L函数以评估数据偏离均匀性(“均匀性”)的方式,以及如何从中提取有关偏离的规模和性质的定量信息。

(一个确实可以绘制完整的L功能,延伸到的全部归一化距离,从均匀性评估的大型发车时间。通常,虽然,在较小的距离评估的数据的行为是更大的重要性。)1


软件

R生成该图的代码如下。它从定义用于计算K和L的函数开始。它创建了一种从混合物分布进行仿真的功能。然后,它生成模拟数据并作图。

Ripley.K <- function(x, scale) {
  # Arguments:
  # x is an array of data.
  # scale (not actually used) is an option to rescale the data.
  #
  # Return value:
  # A function that calculates Ripley's K for any value between 0 and 1 (or `scale`).
  #
  x.pairs <- outer(x, x, function(a,b) abs(a-b))  # All pairwise distances
  x.pairs <- x.pairs[lower.tri(x.pairs)]          # Distances between distinct pairs
  if(missing(scale)) scale <- diff(range(x.pairs))# Rescale distances to [0,1]
  x.pairs <- x.pairs / scale
  #
  # The built-in `ecdf` function returns the proportion of values in `x.pairs` that
  # are less than or equal to its argument.
  #
  return (ecdf(x.pairs))
}
#
# The one-dimensional L function.
# It merely subtracts 1 - (1-y)^2 from `Ripley.K(x)(y)`.  
# Its argument `x` is an array of data values.
#
Ripley.L <- function(x) {function(y) Ripley.K(x)(y) - 1 + (1-y)^2}
#-------------------------------------------------------------------------------#
set.seed(17)
#
# Create mixtures of random variables.
#
rmixture <- function(n, p=1, f=list(runif), factor=10) {
  q <- ceiling(factor * abs(p) * n / sum(abs(p)))
  x <- as.vector(unlist(mapply(function(y,f) f(y), q, f)))
  sample(x, n)
}
dmixture <- function(x, p=1, f=list(dunif)) {
  z <- matrix(unlist(sapply(f, function(g) g(x))), ncol=length(f))
  z %*% (abs(p) / sum(abs(p)))
}
p <- rep(1, 4)
fg <- lapply(p, function(q) {
  v <- runif(1,0,30)
  list(function(n) rnorm(n,v), function(x) dnorm(x,v), v)
  })
f <- lapply(fg, function(u) u[[1]]) # For random sampling
g <- lapply(fg, function(u) u[[2]]) # The distribution functions
v <- sapply(fg, function(u) u[[3]]) # The parameters (for reference)
#-------------------------------------------------------------------------------#
#
# Study the L function.
#
n <- 64                # Sample size
alpha <- beta <- 0.2   # Beta distribution parameters

layout(matrix(c(rep(1,3), 3, 4, 2), 2, 3, byrow=TRUE), heights=c(0.6, 0.4))
#
# Display the L functions over an envelope for the uniform distribution.
#
plot(c(0,1/3), c(-1/8,1/6), type="n", 
     xlab="Normalized Distance", ylab="Total Proportion",
     main="Ripley L Functions")
invisible(replicate(999, {
  plot(Ripley.L(x.unif <- runif(n)), col="#00000010", add=TRUE)
}))
abline(h=0, lwd=2, col="White")
#
# Each of these lines generates a random set of `n` data according to a specified
# distribution, calls `Ripley.L`, and plots its values.
#
plot(Ripley.L(x.norm <- rnorm(n)), col="Blue", lwd=2, add=TRUE)
plot(Ripley.L(x.beta <- rbeta(n, alpha, beta)), col="Red", lwd=2, lty=2, add=TRUE)
plot(Ripley.L(x.mixture <- rmixture(n, p, f)), col="Green", lwd=2, lty=3, add=TRUE)
#
# Display the histograms.
#
n.breaks <- 24
h <- hist(x.norm, main="Normal Sample", breaks=n.breaks, xlab="Value")
curve(dnorm(x)*n*mean(diff(h$breaks)), add=TRUE, lwd=2, col="Blue")
h <- hist(x.beta, main=paste0("Beta(", alpha, ",", beta, ") Sample"), 
          breaks=n.breaks, xlab="Value")
curve(dbeta(x, alpha, beta)*n*mean(diff(h$breaks)), add=TRUE, lwd=2, lty=2, col="Red")
h <- hist(x.mixture, main="Mixture Sample", breaks=n.breaks, xlab="Value")
curve(dmixture(x, p, g)*n*mean(diff(h$breaks)), add=TRUE, lwd=2, lty=3, col="Green")

1
我主要在Numpy工作,有时在SciPy工作。您是否知道在任何统计python库中是否可以使用此方法?搜索它不会返回任何相关信息。
Ketan 2014年

L函数可能不可用,因为它通常是为二维或二维编码的。从此处的实现中可以看出,该算法很简单:计算所有不同数据对之间的距离的经验累积分布函数,然后按进行调整Ripley.L
ub

度量方差是不可知的还是方差相关的?
Ketan 2014年

1
我在这里描述的基本方法标准化数据,以使所述范围对应于间隔。因此,它是“不可知方差”。但是,这使其对异常值敏感。(这个问题可以在更高维度的严重问题。)人们可以通过正火克服这一限制,就是说,到一个位数范围(如IQR),并在制造一个合适的调整1 - 1 - d 2校正L函数。这将使生成的L函数变得非参数健壮,我认为这可以解决您的评论背后的担忧。[0,1]1(1d)2
ub

您说“此问题在更高维度上可能是一个严重的问题”。它已经适应单变量数组,对吗?我不确定我是否对所有事情都了解。您能用其他任何语言或伪代码编写Ripley.L吗?或者,您可以只注释现有代码一点,或者至少将Ripley.L格式化为多行以增强其可读性。缺少statsmodels.sourceforge.net/stable/generation/…的任何适当文档,无论如何对我没有多大帮助。
Ketan 2014年

5

我假设您要测量与制服的分布接近程度。

您可以查看均匀分布的累积分布函数与样本的经验累积分布函数之间的距离。

{1,2,3,4,5}Fu(x)

Fu(x)=i=1[x]1/5.

X1,3,5X

FX(1)=1/3,FX(2)=1/3,FX(3)=2/3,FX(4)=2/3,FX(5)=1

Y1,1,5Y

FY(1)=2/3,FY(2)=2/3,FY(3)=2/3,FY(4)=2/3,FY(5)=1

现在,作为分布之间的距离的度量,让我们取每个点的距离之和,即

d(F,G)=i=15|F(x)G(x)|.

d(Fu,FX)<d(Fu,FY)

在更复杂的情况下,您需要修改上面使用的规范,但是主要思想仍然是相同的。如果您需要测试程序,最好使用针对其开发测试的规范(@TomMinka指出的规范)。


距离分布的距离的其他一些流行度量是Kolmogorov-Smirnov检验Anderson-Darling检验
汤姆·敏卡2014年

你好 感谢您的回答。请重新访问更新的问题以消除歧义,并让我知道您的答案是否适用。如果是这样。我必须验证一下。
Ketan 2014年

是的,只要“偶数”表示“统一”,我的答案就适用。
卢卡斯Kidziński

好的。请您详细说明一下答案。
Ketan

@TomMinka谢谢,明确的规范这些规范甚至更好,因为已经开发了测试程序。
卢卡斯Kidziński

1

如果我正确理解了您的问题,那么对您来说,“最均匀”的分布将是随机变量一次获取每个观察值的分布-从某种意义上说是均匀的。如果观测值的“簇”具有相同的值,那将是不均衡的。假设我们正在谈论离散观测,也许您可​​以查看概率质量点之间的平均差异,最大差异,或者可能有多少个观测值与某个阈值上的“平均值”有所不同。

如果观测值确实是均匀的,则所有PM点都应具有相等的值,并且max和min之间的差为0。平均差越接近0,则观测值的“均匀”越多,则其越低最大的差异和更少的“峰值”也表明了经验观察的“平均”程度。

更新 当然,您可以使用卡方检验来确保均匀性,也可以将经验分布函数与均匀性进行比较,但是在这种情况下,即使观测值的分布仍然存在,观测值中的任何大“空白”也会对您造成不利影响“甚至”。


对于给定的一组可能值,我想从根本上建模该组值中特定值的“稀有”或“特殊”程度。在没有其他选择的情况下,我试图测量这些值的平均或均匀分布。分布越均匀,从集合中获得任何奇异值的机会就越少。而例如,如果所有数据都位于分布的极端,则任何值都可以被认为是“奇特的”。我希望你明白了吗?
Ketan 2014年

1

您正在寻找的度量标准被正式称为差异

一维版本如下:

I=[a,b)x1,,xNI

JIA(J,N)J

A(J,N)=|{x1,,xN}J|,
V(J)J

x1,,xN

>DN=supJ|A(J,N)V(J)N|,
J=j=1[0,tj)0tj1

x1,,xNI

低差异序列通常称为准随机序列

低差异序列的基本概述可以在这里找到,我的博客文章“ 准随机序列的不合理有效性 ”比较了应用于数值积分,将点映射到球体表面以及拟周期平铺的各种方法。


0

R2=1R2


我不知道我是否清楚地理解了你的意思,但是我只需要了解某事物在分布中的分布是“均匀”的。假设一个人可以获得相同的方差和两个非常不同分布的均值的均值,那么方差就没那么有用了。
Ketan 2014年

@Ketan,您彻底改变了您的问题。无论哪种方式,我都不清楚这可能是什么。无论如何,很明显,我的答案并没有基于您的问题的最新版本来解决您感兴趣的问题。
AdamO 2014年

对于给定的一组可能值,我想从根本上建模该组值中特定值的“稀有”或“特殊”程度。在没有其他选择的情况下,我试图测量这些值的平均或均匀分布。分布越均匀,从集合中获得任何奇异值的机会就越少。而例如,如果所有数据都位于分布的极端,则任何值都可以被认为是“奇特的”。我希望你明白了吗?
Ketan 2014年

不,抱歉仍然没有关注。只是为了验证一下,您是否熟悉“均匀”分布的数据的正式定义?例如,“正态”分布不均匀。两者都是对称的。您似乎暗示了对称性是否值得关注,但是随后您似乎说,对“稀有”值进行采样的可能性值得关注。例如,柯西分布是对称的,但已知是将产生异常值作为概率模型的分布示例。
AdamO 2014年

让我这样说:每个集合只是数据集中特定属性的所有值的集合。我基本上想通过其值的“稳定性”来量化每个属性,到目前为止,我一直在使用简单的方差。但是昨晚,我意识到,即使一个属性可能是“偶数”,其他两个属性也可能具有完全相同的方差和均值,而另一个属性的大多数值处于2个极端。因此,现在我想采取一种额外的措施来衡量这些值是否可以平均地找到,或者它们是否更多地存在于极端之中。
Ketan 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.