【问题标题】:Box-counting in RR中的盒子计数
【发布时间】:2019-10-16 15:45:06
【问题描述】:

我正在尝试使用 R 中的盒计数来计算由二进制矩阵(完全由 1 和 0 填充的 512 x 512 矩阵)表示的对象的分形维数。自然地,我找到了this 的问题,但问题与我的不相似,答案也很乏味。我自己并不熟悉盒子计数的数学细节,但熟悉它在分形维数计算中的实用性。话虽如此,R 中一些声称计算盒子计数维度的函数背后的许多文档的解释方式有点让我头疼(根据我在网上阅读的内容,我不是唯一一个)。我很好奇这个网站上的任何人是否有使用这些程序的经验,以及他们是否可以分享他们的智慧?

编辑

我试图分析的数据是二进制矩阵的形式,唯一的非零条目是 1。这种矩阵的一个例子如下:

A = matrix(c(0,0,0,0,0,0,1,0,0,1,1,0,0,1,1,1),byrow=T,nrow=4,ncol=4)

我只是在询问方阵。虽然这个矩阵很小,但我正在处理的矩阵要大得多(如前所述,为 512x512)。理想的函数将如上所述的矩阵作为输入,并输出包含在所述矩阵中的图形的框计数维度。

【问题讨论】:

  • 如果您包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出,则更容易为您提供帮助。现在,您的问题似乎有点过于宽泛,无法在 Stack Overflow 上回答。这是一个问答网站,而不是真正的论坛。
  • 我编辑了这个问题。这有帮助吗?
  • Here's a similar question 与。一个(我希望)不是那么乏味的答案。虽然这个问题适用于 Python/Numpy,但它可能仍然有用。
  • @MarkMcClure 我没有看过这个例子,是的,它非常有用——谢谢你的推荐!

标签: r fractals


【解决方案1】:

这段代码应该可以工作:

# create a dataset to calculate de Hausdorff-Besicovitch dimension
mat <- matrix(runif(512*512),nrow = 512,ncol = 512)

mat[mat<=0.5] <- 0
mat[mat>0.5] <- 1

cant <- sum(mat)

fragment <- rep(2,10)**(0:9)
Table <- data.frame(Delta = rep(512,10)/(fragment ), N = fragment**2)
Table$LogDelta <- log(Table$Delta)

for(i in 2:10){
  delta_aux <- Table$Delta[i]

  for(j in 1:fragment [i]){
    row_id <- ((j-1)*delta_aux+1):(j*delta_aux)
    for(k in 1:fragment [i]){
      col_id <- ((k-1)*delta_aux+1):(k*delta_aux)
      if(sum(mat[row_id,col_id]) == 0){
        Table$N[i] <- Table$N[i] - 1
      }
    }
  }
}

Table$LogN <- log(Table$N)
lm_dim <- lm(Table$LogN ~ Table$LogDelta)

plot(Table$LogN ~ Table$LogDelta)
abline(lm_dim)

print('The box-counting dimension is:')
print(-lm_dim$coefficients[2])

# without the borders
Table <- Table[2:nrow(Table),]
lm_dim <- lm(Table$LogN ~ Table$LogDelta)

plot(Table$LogN ~ Table$LogDelta)
abline(lm_dim)

print('The box-counting dimension is:')
print(-lm_dim$coefficients[2])

请注意,此代码仅适用于 512X512 的矩阵,对于不同的维度,您必须更改它。此外,您可能希望在没有两个边界的情况下进行线性拟合,因为这会给您带来尺寸错误。

【讨论】:

  • 感谢您的脚本。我会试一试。 “没有两个边界”是什么意思?你是指矩阵的边界吗?
  • 我已经在一些明显的例子上测试了你的代码。一条线产生的尺寸为 0.93,而矩形产生的尺寸为 1.88;虽然结果并不理想,但它们肯定比我遇到的其他事情要好 - 再次感谢!
  • 尝试做没有两个边界的线性回归(没有Table的第一个和最后一个元素)。那应该改进它。另外,请注意,对于您拥有的离散数据,盒子计数维度是一个近似值,可能与实际的分形维度略有不同。
  • 我编辑答案以展示如何进行无边界线性回归。根据数据集(它的长度和结构),您可能需要消除更多的边界值。
  • 感谢您的澄清!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-16
  • 1970-01-01
相关资源
最近更新 更多