豪斯多夫维数及其计算


前言

我们先介绍豪斯多夫测度的定义,再导出豪斯多夫维数,然后介绍一种近似求出豪斯多夫维数的方法:计盒维数法,最后通过python来实现计盒维数法。如果不想看概念和公式,可直接阅读第四部分。


一、豪斯多夫测度

1.1 定义

F F F ⊂ R n \subset\mathbb{R}^n Rn 中的任何子集,s 为一非负数,对任何 δ > 0 \delta>0 δ>0,定义
H δ s ( F ) = inf ⁡ { ∑ i = 1 ∞ ∣ U i ∣ s : { U i } 为  F 的 δ − 覆盖 } \mathscr{H}_{\delta}^{s}(F) = \inf\Big\{ \sum_{i = 1}^{\infty} | U_{i} |^{s} : \{U_{i}\} \text{为 }F \text{的} \delta{-} \text{覆盖} \Big\} Hδs(F)=inf{i=1Uis:{Ui} Fδ覆盖}
于是考察所有直径不超过 δ \delta δ F F F 的覆盖,并试图使这些直径的 s s s 次幂的和达到最小。当 δ \delta δ 减少时,上式中能覆盖 F F F 的集类是减少的,所以下确界 H s ( F ) \mathscr{H}^{s}( F ) Hs(F) 随着增加且当 δ → 0 \delta\to0 δ0 时趋于一极限。记

H s ( F ) = lim ⁡ δ → 0 H δ s ( F ) \mathscr{H}^{s}( F )=\underset{\delta\to0}{\operatorname*{lim}}\mathscr{H}_{\delta}^{s}( F ) Hs(F)=δ0limHδs(F)

R n \mathbb R^n Rn 中的任何子集 F F F 这个极限都存在,但极限值可以是(并且通常是) 0 0 0 ∞ \infty 。我们称 H s ( F ) \mathscr{H}^{s}( F ) Hs(F) F F F s − s- s 维豪斯道夫测度。

  • inf:表示求下确界
  • ∣ U i ∣ |U_i| Ui:表示集合 U i U_i Ui 的直径。 U U U 的直径定义为 ∣ U ∣ = sup ⁡ { ∣ x − y ∣ : x , y ∈ U |U|=\sup\{|x-y|:x,y\in U U=sup{xy:x,yU,即 U U U 内任意两点距离的最大值。
  • 𝛿- 覆盖:如果 U i U_i Ui 为可数(或有限)个直径不超过 δ \delta δ 的集构成的覆盖 F F F 的集类,即 F ⊂ ⋃ i = 1 ∞ U i F\subset\bigcup_{i=1}^\infty U_i Fi=1Ui,且对每一 i i i 都有 0 < ∣ U i ∣ ⩽ δ 0<|U_i|\leqslant\delta 0<Uiδ,则称 { U i } ∣ \{U_i\}| {Ui} F F F 的一个 δ − \delta- δ 覆盖。

1.2 命题1

F ⊂ R n , λ > 0 F\subset\mathbb{R}^n,\lambda>0 FRn,λ>0,则
H s ( λ F ) = λ s H s ( F ) \mathscr{H}^{s}(\lambda F)=\lambda^{s}\mathscr{H}^{s}(F) Hs(λF)=λsHs(F)
这里 λ F = { λ x : x ∈ F } \lambda F=\left\{\lambda x:x\in F\right\} λF={λx:xF},即 F F F 按比例放大 λ \lambda λ 倍。

1.3 命题2

F ⊂ R n , f : F → R m F\subset\mathbb{R}^n,f{:}F{\to}\mathbb{R}^m FRn,f:FRm 为一映射,使得对常数 c > 0 c>0 c>0 α > 0 \alpha>0 α>0 ,有
∣ f ( x ) − f ( y ) ∣ ⩽ c ∣ x − y ∣ a . ( x , y ∈ F ) \mid f(x)-f(y)\mid\leqslant c\mid x-y\mid^a.(x,y\in F) f(x)f(y)cxya.(x,yF)
则对每一 s s s
H s / a ( f ( F ) ) ⩽ c s / a H s ( F ) \mathscr{H}^{s/a}(f(F))\leqslant c^{s/a}\mathscr{H}^{s}(F) Hs/a(f(F))cs/aHs(F)


二、豪斯多夫维数

H s ( F ) \mathscr{H}^s(F) Hs(F) 关于 s s s 的图表明,存在 s s s 的一个临界点使得 x s ( F ) x^s(F) xs(F) ∞ \infty “跳跃”到 0。这个临界值称为 F F F 的豪斯多夫维数,记为 dim ⁡ H F \dim_{\mathrm{H}}F dimHF

其用数学语言的描述方法为

d i m H F = i n f { s : H s ( F ) = 0 } = s u p { s : H s ( F ) = ∞ } \mathrm{dim}_{\mathrm{H}}F=\mathrm{inf}\{s:\mathscr{H}^{s}(F)=0\}=\mathrm{sup}\{s:\mathscr{H}^{s}(F)=\infty\} dimHF=inf{s:Hs(F)=0}=sup{s:Hs(F)=}


三、计盒维数

计盒维数或称盒维数(Box-counting or Box dimension)是应用最广泛的维数之一,它的普遍应用主要是由于这种维数的数学计算及经验估计相对容易一些。

3.1 定义

F F F R n \mathbb R^n Rn 上任意非空的有界子集, N δ ( F ) N_\delta(F) Nδ(F)是直径最大为 δ \delta δ,且可以覆盖 F F F 的集的最少个数,则 F F F的下、上计盒维数分别定义为

d i m ‾ B F = lim ⁡ ‾ δ → 0 l o g N δ ( F ) − l o g δ d i m ‾ B F = lim ⁡ ‾ δ → 0 l o g N δ ( F ) − l o g δ \begin{aligned}\underline{\mathrm{dim}}_{B}F=\underline{\lim}_{\delta\to0} \frac{\mathrm{log}N_{\delta}(F)}{-\mathrm{log}\delta}\\ \overline{\mathrm{dim}}_{B}F=\overline{\lim}_{\delta\to0}\frac{\mathrm{log}N_{\delta}(F)}{-\mathrm{log}\delta}\end{aligned} dimBF=limδ0logδlogNδ(F)dimBF=limδ0logδlogNδ(F)

如果这两个值相等,则称这共同的值为 F F F的计盒维数或盒维数,记为
dim ⁡ B F = lim ⁡ δ → 0 log ⁡ N δ ( F ) − log ⁡ δ \dim_{B}F=\lim_{\delta\to0}\frac{\log N_{\delta}(F)}{-\log\delta} dimBF=δ0limlogδlogNδ(F)

一种常用的覆盖方法是:把一个分形图案放在一个均匀分割的网格上,数一数最小需要几个格子来覆盖这个分形。通过对网格的逐步精化,使格子的边长不断逼近于0,查看所需覆盖数目的变化,从而计算出计盒维数。

3.2 计盒维数与豪斯多夫维数的关系

计盒维数与豪斯多夫维数的关系为

dim ⁡ H F ≤ dim ⁡ ‾ B F ≤ dim ⁡ ‾ B F \dim_{\mathrm{H}}F\leq\underline\dim_{B}F\leq\overline\dim_{B}F dimHFdimBFdimBF

一般情况下,我们可以认为计盒维数近似等于豪斯多夫维数。


四、python实现

我们使用计盒维数法来计算五阶科赫雪花的豪斯多夫维数。
五阶科赫雪花
程序如下:

import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

def box(img, threshold=0.1):
    # 只能计算2维图像的豪斯道夫维度
    assert(len(img.shape) == 2)

    def boxcount(Z, k):
        S = np.add.reduceat(
            np.add.reduceat(Z, np.arange(0, Z.shape[0], k), axis=0),
                               np.arange(0, Z.shape[1], k), axis=1)

        # 我们统计非空(0)的盒子。
        return len(np.where((S > 0))[0])

    # 将 img 转换为一个二进制数组
    img = (img < threshold)

    # 图像的短边长度
    p = min(img.shape)

    # 小于或等于 p 的最大 2 的幂
    n = 2**np.floor(np.log(p)/np.log(2))

    # 提取指数
    n = int(np.log(n)/np.log(2))

    # 当网格边长太大时,计算的精度会下降
    if n >= 7:
        n = 7

    # 构建连续的盒子尺寸(从 2**n 递减至 2)
    sizes = 2**np.arange(n, 1, -1)
    #sizes = np.floor(sizes).astype(int)

    # 随着尺寸减小的实际盒计数。
    counts = []
    for size in sizes:
        counts.append(boxcount(img, size))

    # 将连续的对数(尺寸)与对数(计数)相拟合。
    x = -np.log(sizes)
    y = np.log(counts)
    hauf, b= np.polyfit(x, y, 1)

    # 作对数图
    fig, ax = plt.subplots()
    ax.set_title('盒计数法')
    ax.scatter(x, y,label='data')
    plt.plot(x, hauf*x+b, color="green",label='豪斯道夫维数:'+str(round(hauf,3)))
    ax.legend()
    ax.set_xlabel('log(size)')
    ax.set_ylabel('log(N)')

    plt.show()

    return hauf

img = Image.open("Koch curve_5.png")
img = img.convert("L")
img = np.array(img)/255

box(img)

运行结果:
程序运行结果
已知科赫雪花的豪斯多夫维数为

l n ( 4 ) l n ( 3 ) ≈ 1.262 \frac{ln(4)}{ln(3)} \approx 1.262 ln(3)ln(4)1.262

可见我们使用计盒维数法计算得到的结果还是比较精确的。

  • 31
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
斯多夫维数(Hausdorff dimension)是用于描述非整数度的一种测度,用于衡量集合的复杂程度。在Matlab中,可以通过以下代码计算斯多夫维数: ```matlab % 首先,定义一个集合或图形 x = linspace(0, 1, 100); % 生成0到1之间的100个点 y = sin(2*pi*x); % 计算正弦函数 % 接下来,计算斯多夫维数 epsilon = logspace(-3, 0, 100); % 生成从10^-3到1的100个对数空间点 N = zeros(size(epsilon)); % 创建一个与epsilon相同大小的零向量 for i = 1:length(epsilon) d = sum(abs(diff(y)) >= epsilon(i)); % 计算差分值大于等于当前epsilon的次数 N(i) = d / length(y); % 计算该比例 end logN = log(N); % 取对数 logEpsilon = log(epsilon); % 取对数 % 使用线性回归拟合直线以计算斯多夫维数 p = polyfit(logEpsilon, logN, 1); % 多项式拟合 Hausdorff_dimension = p(1); % 获取拟合直线的斜率,即斯多夫维数 % 最后,绘制log-log图以及斯多夫维数 figure plot(logEpsilon, logN, 'o') % 绘制对数坐标的数据点 hold on plot(logEpsilon, polyval(p, logEpsilon)) % 绘制拟合直线 xlabel('log(epsilon)') ylabel('log(N)') title('Hausdorff dimension calculation') legend('Data', 'Fitted line') grid on % 输出斯多夫维数 disp(['Hausdorff dimension: ', num2str(Hausdorff_dimension)]) ``` 以上代码首先定义了一个集合或图形,然后计算了该集合在不同尺度(epsilon)下的复杂度。接下来,通过线性回归拟合直线,计算得到了斯多夫维数。最后,绘制了对数坐标的log-log图,并输出斯多夫维数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值