我在网上查找,但找不到任何有用的信息。
我基本上是在寻找一种衡量值的“平均”分配方式的方法。例如,X的“均匀”分布分布:
均值和标准差大致相同的“不均匀”分布Y:
但是,是否有任何均匀性度量m使得m(X)> m(Y)?如果没有,那么创建这种度量的最佳方法是什么?
(图片来自可汗学院的屏幕截图)
我在网上查找,但找不到任何有用的信息。
我基本上是在寻找一种衡量值的“平均”分配方式的方法。例如,X的“均匀”分布分布:
均值和标准差大致相同的“不均匀”分布Y:
但是,是否有任何均匀性度量m使得m(X)> m(Y)?如果没有,那么创建这种度量的最佳方法是什么?
(图片来自可汗学院的屏幕截图)
Answers:
Ripley K函数及其近亲L函数是一种标准的,功能强大的,易于理解的,理论上公认的且经常实施的“均匀性”度量。 尽管这些通常用于评估二维空间点配置,但使它们适应一维(通常在参考文献中未给出)所需的分析很简单。
K函数估计典型点距离内点的平均比例。有关间隔的均匀分布[ 0 ,1 ],真实的比例可以计算和(渐近在样本大小)等于1 - (1 - d )2。L函数的适当一维形式从K减去该值以显示与均匀性的偏差。 因此,我们可能考虑将任何一批数据标准化为具有单位范围,并检查其L函数的零附近偏差。
为了说明,我已经模拟大小的独立样本64从均匀分布和标绘它们的(归一化)L-功能对于较短距离(从0到1 / 3),从而产生估计为L函数的采样分布的包络。(在该包络线内的绘制点无法与均匀性区分开来。)在此之上,我从U形分布,具有四个明显成分的混合物分布和标准正态分布中绘制了相同大小样本的L函数。这些样本(及其父级分布)的直方图显示为参考,使用线符号匹配L函数的直方图。
U形分布的尖锐尖峰(红色虚线,最左侧的直方图)创建了紧密间隔的值簇。L函数在处有很大的斜率反映了这一点。然后,L函数减小,最终变为负数,以反映中间距离处的间隙。
来自正态分布(实线,最右边的直方图)的样本相当接近均匀分布。因此,其L函数不会很快偏离。但是,距离为0.10左右时,它已经足够上升到包络线上方,表明有轻微的聚集趋势。跨中间距离的持续上升表明聚类是分散的和广泛的(不限于某些孤立的峰)。
来自混合物分布的样本的初始大斜率(中间直方图)显示了在小距离(小于)处的聚类。通过下降到负值,它发出中间距离的信号。将其与U形分布的L函数进行比较可以揭示:0处的斜率,这些曲线上升到0以上的量以及它们最终下降到0的速率都提供了有关存在于此的聚类性质的信息。数据。这些特征中的任何一个都可以选择为“均匀度”的单个度量,以适合特定的应用。
这些示例显示了如何检查L函数以评估数据偏离均匀性(“均匀性”)的方式,以及如何从中提取有关偏离的规模和性质的定量信息。
(一个确实可以绘制完整的L功能,延伸到的全部归一化距离,从均匀性评估的大型发车时间。通常,虽然,在较小的距离评估的数据的行为是更大的重要性。)
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")
我假设您要测量与制服的分布接近程度。
您可以查看均匀分布的累积分布函数与样本的经验累积分布函数之间的距离。
现在,作为分布之间的距离的度量,让我们取每个点的距离之和,即
在更复杂的情况下,您需要修改上面使用的规范,但是主要思想仍然是相同的。如果您需要测试程序,最好使用针对其开发测试的规范(@TomMinka指出的规范)。
如果我正确理解了您的问题,那么对您来说,“最均匀”的分布将是随机变量一次获取每个观察值的分布-从某种意义上说是均匀的。如果观测值的“簇”具有相同的值,那将是不均衡的。假设我们正在谈论离散观测,也许您可以查看概率质量点之间的平均差异,最大差异,或者可能有多少个观测值与某个阈值上的“平均值”有所不同。
如果观测值确实是均匀的,则所有PM点都应具有相等的值,并且max和min之间的差为0。平均差越接近0,则观测值的“均匀”越多,则其越低最大的差异和更少的“峰值”也表明了经验观察的“平均”程度。
更新 当然,您可以使用卡方检验来确保均匀性,也可以将经验分布函数与均匀性进行比较,但是在这种情况下,即使观测值的分布仍然存在,观测值中的任何大“空白”也会对您造成不利影响“甚至”。
您正在寻找的度量标准被正式称为差异。
一维版本如下:
。
低差异序列通常称为准随机序列。
低差异序列的基本概述可以在这里找到,我的博客文章“ 准随机序列的不合理有效性 ”比较了应用于数值积分,将点映射到球体表面以及拟周期平铺的各种方法。