我有很多数据,我想做一些看起来很简单的事情。在这个庞大的数据集中,我对特定元素聚集在一起的程度很感兴趣。假设我的数据是这样的有序集:{A,C,B,D,A,Z,T,C...}。假设我想知道 A 是否倾向于彼此相邻,而不是随机(或更均匀地)分布在整个集合中。这就是我称之为“丛生”的属性。
现在,是否有一些简单的数据“块状”测量?也就是说,一些统计数据会告诉我随机分布的 As 有多远?如果没有一种简单的方法可以做到这一点,那么困难的方法是什么?任何指针都非常感谢!
我有很多数据,我想做一些看起来很简单的事情。在这个庞大的数据集中,我对特定元素聚集在一起的程度很感兴趣。假设我的数据是这样的有序集:{A,C,B,D,A,Z,T,C...}。假设我想知道 A 是否倾向于彼此相邻,而不是随机(或更均匀地)分布在整个集合中。这就是我称之为“丛生”的属性。
现在,是否有一些简单的数据“块状”测量?也就是说,一些统计数据会告诉我随机分布的 As 有多远?如果没有一种简单的方法可以做到这一点,那么困难的方法是什么?任何指针都非常感谢!
例如,假设您有一个有序集合,其中每个位置成为字母表中任何小写字母的概率相同。在这种情况下,我将使有序集合包含元素。
# generate a possible sequence of letters
s <- sample(x = letters, size = 1000, replace = TRUE)
事实证明,如果有序集合的每个位置在字母表的小写字母上遵循均匀分布,那么相同字母的两次出现之间的距离遵循参数的几何分布。根据这些信息,让我们计算同一字母连续出现之间的距离。
# find the distance between occurences of the same letters
d <- vector(mode = 'list', length = length(unique(letters)))
for(i in 1:length(unique(letters))) {
d[[i]] <- diff(which(s == letters[i]))
}
d.flat <- unlist(x = d)
让我们看一下同一字母出现之间的距离直方图,并将其与与上述几何分布相关的概率质量函数进行比较。
hist(x = d.flat, prob = TRUE, main = 'Histogram of Distances', xlab = 'Distance',
ylab = 'Probability')
x <- range(d.flat)
x <- x[1]:x[2]
y <- dgeom(x = x - 1, prob = 1/26)
points(x = x, y = y, pch = '.', col = 'red', cex = 2)
红点表示距离的实际概率质量函数,如果有序集合的每个位置在字母上遵循均匀分布,直方图的条表示与有序相关的距离的经验概率质量函数。放。
希望上面的图像能够证明几何分布是合适的。
同样,如果有序集合的每个位置在字母上遵循均匀分布,我们会期望相同字母出现之间的距离遵循参数的几何分布。那么距离的预期分布和差异的经验分布有多相似?当分布完全相同时,两个离散分布之间的Bhattacharyya 距离 ,并且随着分布变得越来越不同
就巴塔查亚距离而言,从上面看如何d.flat
与预期的几何分布进行比较?
b.dist <- 0
for(i in x) {
b.dist <- b.dist + sqrt((sum(d.flat == i) / length(d.flat)) * dgeom(x = i - 1,
prob = 1/26))
}
b.dist <- -1 * log(x = b.dist)
预期几何分布与距离的经验分布之间的 Bhattacharyya 距离约为,相当接近于。
编辑:
与其简单地说上面观察到的 Bhattacharyya 距离 ( ) 非常接近,我认为这是模拟何时派上用场的一个很好的例子。现在的问题如下:如果有序集合的每个位置在字母上是一致的,那么上面观察到的 Bhattacharyya 距离与观察到的典型 Bhattacharyya 距离相比如何?让我们生成这样的有序集合,并根据预期的几何分布计算它们的每个 Bhattacharyya 距离。
gen.bhat <- function(set, size) {
new.seq <- sample(x = set, size = size, replace = TRUE)
d <- vector(mode = 'list', length = length(unique(set)))
for(i in 1:length(unique(set))) {
d[[i]] <- diff(which(new.seq == set[i]))
}
d.flat <- unlist(x = d)
x <- range(d.flat)
x <- x[1]:x[2]
b.dist <- 0
for(i in x) {
b.dist <- b.dist + sqrt((sum(d.flat == i) / length(d.flat)) * dgeom(x = i -1,
prob = 1/length(unique(set))))
}
b.dist <- -1 * log(x = b.dist)
return(b.dist)
}
dist.bhat <- replicate(n = 10000, expr = gen.bhat(set = letters, size = 1000))
现在我们可以计算观察到上面观察到的 Bhattacharyya 距离的概率,或者一个更极端的概率,如果有序集合是以这样一种方式生成的,即它的每个位置都遵循字母上的均匀分布。
p <- ifelse(b.dist <= mean(dist.bhat), sum(dist.bhat <= b.dist) / length(dist.bhat),
sum(dist.bhat > b.dist) / length(dist.bhat))
在这种情况下,概率结果约为。
为了完整起见,下图是模拟的 Bhattacharyya 距离的直方图。我认为重要的是要意识到你永远不会观察到的 Bhattacharyya 距离,因为有序集的长度是有限的。上面,任何两次出现的字母之间的最大距离最多为。
您所描述的内容已被编入称为运行测试的程序中。掌握起来并不复杂。您可以在统计测试的许多来源中找到它,例如维基百科或Nat'l Instit。标准和技术或YouTube的。
如果您对此略有不同的观点感兴趣,您可能想看一下信息论入门 - 计算、图像/视频/音频处理、通信理论和(也许更令人惊讶的)物理学和宇宙学(对理解黑洞以及经典热力学至关重要)甚至生物学。
非正式地,我们可以说,当受到通用压缩算法时,“更密集”的字母序列(根据您的示例)将被更密集地压缩 - 即包含原始文本的 zip 文件会更小。类似地,“块状”图像(例如,在纯绿色 baize 上的几个台球)将比更多样化的图像(例如一群人的图像)更有效地压缩 - 例如创建一个更小的 jpeg 文件)。当然,此类数据的信息内容(又名负熵或“负熵”)具有独立于特定压缩算法的各种形式定义。
如果您有兴趣在多个(或所有)分辨率级别识别“块状”,则信息理论测量可能比上述更经典的统计分析更具启发性的一个例子。在您的文本字符串示例中,如果在序列的开头有很多“A”聚集在一起,那么“A”的聚集不多,然后随着序列的继续,周期性地更多聚集和更少聚集,然后可以说这种结块存在于多种分辨率下——这可以很自然地被信息理论测量所捕捉。
(编辑)我突然想到,您担心这可能是一个荒谬的问题,而事实上,以信息和(负)熵的名义对“块状”的研究至关重要地告诉我们现代生活的日常运作(互联网、移动通信、语言本身)和宇宙的本质(黑洞、星系的形成、宇宙背景辐射的解释、确定什么是“活着的”)应该用“没有愚蠢的问题”这样的格言来回答,只有愚蠢的答案” [未注明出处的引用]。