关于维度

1.什么是维度。

其实这个话题是欧氏几何的一个延伸。我们称零维的点,一维的线,二维的面,三维的体,四维的时空。你要注意到,这里0,1,2,3,4都是整数。你有没有想过,到底什么是维度?有没有分数维?比如3.1415926维。讨论这个的数学分支被称为分形数学。事实上分形数学已经广泛应用于物理,化学,地质,金融,社会科学等的方方面面,甚至到艺术及时尚。那么什么叫分形,什么是维度?先从一组图看起。

图0: 大自然中分形结构的例子

这组图特点在于,每个图中,某一部分挑出来都跟整体有类似性:比如,每根树枝结构都类似于整棵树。早在1860年,Rubkin就写到:”…大自然的鬼斧神工,可以把大尺度的山脉缩小成小尺度,在一块石头上你可以找到自然界的各种构造的变化。石块上的苔藓像森林,晶粒像悬崖,岩石表面像山脉…”。具有自相似性或标度不变性的几何对象我们成为它是分形的。严格的分形数学基础是测度论及公度拓扑学,艰深难懂。分形理论的奠基人Mandelbrot给出了更直观的定义:部分以某种形式与整体相似的集合,称作分形。

欧式几何的法则之一是整数维,这里把维度的概念做一拓展。考虑:把一个正方形的每个边变为原来的三倍,得到一个9倍面积的正方形:3^2=9; 类似的,把一个正方体每个边变为原来的三倍,得到一个27倍体积的新正方体:3^3=27。推而广之,把一个d维的物体,将每个独立方向变为原来的n倍,结果得到N个原来的对象。这三个数之间的关系是n^d=N。对此关系式取对数,还可以改写为:

d=ln(N)/ln(n)。

这个认识已经是一个质的飞跃。因为当我们不知道维度,用右边进行计算的时候,很可能得到的不是整数(但是在欧式几何的公理空间里,必为整数),也因此扩展了欧式几何。下面以一个简单而著名的Koch曲线的例子,来描述如何构造分形,以及如何计算其维数。

如图1,从一段单位长度的线段开始,第一步将线段三等分,将中间部分用两个1/3长度线段取代(图1.b),第二步,将现有每条线段三等分,中间有两条1/3^2的线段取代。如此反复直至无穷。Koch曲线是分形的,因为它有自相似性。同时要注意,Koch曲线无限长,处处连续,处处不可微商。那么它的维度是多少呢。将图2中部图形放大三倍后,得到图二下部的曲线,它是由原来的四个图形组成的,因此,Koch曲线的分形维数为d=ln4/ln3=1.26。

 

除此以外,常见的分形还有康托集,Sierpinski垫片。此类分形称作规则分形或者决定论的分形,还有些无规则的分形,大多物理现象中的分形为此类,其特点是不具备严格的自相似性,而是统计意义上的自相似。后者更加复杂,以后会单独分析布朗运动的分形特性。

刚才介绍的分形维数的计算只适合规则分形,还有其他不同的方式计算复杂分形的维数,其中之一为Hausdoff维度:

很吓人对不对?其实通俗来讲,计算hausdoff维度的方法是(以嵌入二维平面的分形为例):

设想有一个由2维空间内具有有限大小的点组成的集合,N是用来覆盖这个集合内所有点所需的半径为R的圆形的最少个数,则这个最小数NR的一个函数,记作N(R)。显然R越小则N越大,假设N(R)和R之间存在一个反比的关系,我们把这个关系记作

R趋向于0时,我们得到Hausdoff维度为

 

Hausdoff维数的计算并不容易,尤其是想通过数值计算。通常只会给出一个范围。以下程序中有具体实现。

2.著名的分形集

前边列举了有具体几何形状的分形几何体,这里列举2个著名分形集合(当然,严格说几何体也是集合)。

2.1 Mandelbrot/Julia集合

定义复二次多项式f(Z)=Z^2+c,考虑无穷次迭代数列f(z),f(f(z))…直至无穷f(f(f…f(z))),假如此序列的模收敛,z为集合中一元素。当c为特定常数的情况下为Julia集合;假如c非定常,而是当前点的坐标的情况下,我们称为Mandelbrot集合。

2.2 Newton 分形

3. 分形的程序实现(python)

以下程序包含刚刚提到的分形集,程序截图如下:

程序除了plot Julia(稍作修改就可plot Mandelbrot集)/Newton集外,还提供了Housdoff维度的计算函数。

程序上色采用了最简单的方法:计算逃逸时间。比如4次迭代后发散,此点数值为4,收敛点(在最大迭代次数到达前未发散)此点数值为itermax,这里的contour仅仅根据此数值来做图。

"""
   _author_ = 杜鹏飞, Iowa state university
   _Python_version_= 2.7
"""
import numpy as np
import matplotlib.pyplot as plt
import itertools as iter

class Fractal(object):
    def __init__(self, name, color, iteration, pixelNum, domain):
        self.name = name               #name of the fractal plot
        self.colorScheme = color       #which color scheme to use, current only 1
        self.maxIter = iteration       #maximum iteration
        self.pixelNum = pixelNum       #number of pixels along each dimension
        self.domain = domain           #(xmin,xmax,ymin,ymax) square domain
        #create the mesh grid
        self.x = np.linspace(self.domain[0],self.domain[1],pixelNum)
        self.y = np.linspace(self.domain[2],self.domain[3],pixelNum)
    self.xx, self.yy = np.meshgrid(self.x, self.y, sparse=True)

    def plot(self,matrix):
        #ravel() returns a contiguous flattened array;
        self.pic = np.reshape(matrix,[self.pixelNum,self.pixelNum])
        plt.imshow(self.pic)
        plt.title(self.name, fontsize=18, y=1.03)
        plt.tight_layout()
        plt.show()

    @staticmethod
    def abs(x, y):
        return np.sqrt(x*x + y*y)

    @staticmethod
    def square(x,y):
        return (x*x-y*y,2*x*y)

#subclass for Newton fractal drawing
class Newton(Fractal):
    def __init__(self, name, color, iteration, pixelNum, domain):
        Fractal.__init__(self, name, color, iteration, pixelNum, domain)
        #------construct the one variable function
        self.f = np.poly1d([1,0,0,-1]) # x^3 - 1
        #------define the derivative of f
        self.fp = np.polyder(self.f)

    def newton(self, i, guess):
        a = np.empty(guess.shape,dtype=int)
        a[:] = i
        j = np.abs(self.f(guess))>.00001
        if np.any(j):
            a[j] = self.newton(i+1, guess[j] - np.divide(self.f(guess[j]),self.fp(guess[j])))
        return a

    def plot(self):
        self.matrix = self.newton(0,np.ravel(self.xx+self.yy*1j))
        Fractal.plot(self,self.matrix)

#subclass for Julia fractal drawing
class Julia(Fractal):
    def __init__(self, name, color, iteration, pixelNum, domain, c0, c1):
        Fractal.__init__(self, name, color, iteration, pixelNum, domain)
        self.c_re = c0
    self.c_im = c1
        self.iter = 0
    self.matrix = np.zeros((pixelNum,pixelNum), dtype=np.int)

    def selfIterate(self,a,b):
        if self.abs(a,b) > 2:
            return 0
        else:
            a,b = self.square(a,b)
            a += self.c_re
        b += self.c_im
        if self.iter < self.maxIter:
        self.iter += 1
                self.selfIterate(a,b)
          if self.iter >= self.maxIter:
             return self.iter
            return self.iter

    def julia(self):
        #wrong" self.matrix = [self.selfIterate(self.x[i],self.x[j]) for i in range(self.pixelNum) for j in range(self.pixelNum)]
        for i,j in iter.product(range(self.pixelNum), range(self.pixelNum)):
        self.matrix[i,j] = self.selfIterate(self.x[i],self.x[j])
        self.iter = 0
    return 0

    def plot(self):
        self.julia()
        Fractal.plot(self,self.matrix)

newton = Newton("Newton set",1,1000,1000,(-10,10,-10,10))
newton.plot()
#j = Julia("Julia set",1,50,1000,(-2,2,-2,2),-0.4,0.6)
#j.plot()
时间: 2024-10-25 13:53:56

关于维度的相关文章

[APM] 2个实例+5个维度解读APM技术

为了加深EGO会员之间的相互了解,同时也为大家提供更多线上相互学习交流的机会,EGO正式启动会员群线上分享活动.本文是根据陈靖华分享主题“APM的价值”的内容整理而成. 第二期分享嘉宾:陈靖华,EGO会员.听云CTO.北京基调网络股份有限公司联合创始人之一. 今天我们来聊聊APM技术,首先APM是应用性能监控(Application Performance Monitoring)或应用性能管理(Application Performance Management)的缩写.所谓应用性能管理,就是指

[转]浅谈协方差矩阵(牢记它的计算是不同维度之间的协方差,而不是不同样本之间。)

注意:方差就是方差:方差的平方就是方差的平方.有的时候以为方差就是方差的平方. cov11 = sum((dim1-mean(dim1)).*(dim1-mean(dim1)))/(size(MySample,1)-1) cov11 = 296.7222 >> std(dim1) ans = 17.2256 >> std(dim1).^2 ans = 296.7222 一.统计学的基本概念 统计学里最基本的概念就是样本的均值.方差.标准差.首先,我们给定一个含有n个样本的集合,下面

多维度分析统计nginx访问日志

nginx日志访问量,多维度统计,__fields表示每条日志以空格分隔后索引对应的字段名称. 如0表示第一个字段客户端IP(client_ip),要统计其它字段,只需在这里添加即可. ## 直接上代码 # -*- coding:utf-8 -*- import sys try:     import json except ImportError:     import simplejson as json class AnalysisNginxLog(object):     ''' ana

挨踢部落第一期:Spark离线分析维度

活动说明:挨踢部落是为核心开发者提供深度技术交流,解决开发需求,资源共享的服务社群.基于此社群,我们邀请了业界技术大咖对开发需求进行一对一突破,解除开发过程中的绊脚石.以最专业.最高效的答复为开发者解决开发难题. 话题关键词: 大数据  spark  数据分析  数据画像 部落阵容:徐韬,龙珠直播大数据主管:王劲,数果科技 联合创始人: 面向对象:初级开发工程师,数据分析师,运维工程师 参与方式:加入51CTO开发者QQ交流群 370892523 ,有任何技术问题,在群里提问,或发给群主小官.

数据分析必须想清楚的两个概念:指标和维度(转)

指标与维度是数据分析中最常用到的术语,它们是非常基础的,但是又很重要,经常有朋友没有搞清楚它们之间的关系,只有掌握理解了,我们的数据分析工作开展就就容易多了.现在就来说说指标与维度的那些事. 1.指标 指标,用于衡量事物发展程度的单位或方法,它还有个IT上常用的名字,也就是度量.例如:人口数.GDP.收入.用户数.利润率.留存率.覆盖率等.很多公司都有自己的KPI指标体系,就是通过几个关键指标来衡量公司业务运营情况的好坏. 指标需要经过加和.平均等汇总计算方式得到,并且是需要在一定的前提条件进行

高维度下的数据科学—线性空间(上)

使得集合Y的元素和集合X的元素相对应起来的规则f. 广义的概念: 电影票也是一种映射,发工资也是一种映射,男女朋友也是映射.只要有对应关系,我么就可以认为是映射.映射这个概念就是发明用来对自然界和社会上对应关系的一种抽象. 非常需要注意的是:一定要记住:映射的概念是非常广泛的一个概念,任何两种有关系的事物都可以用映射的概念进行描述,比如张三映射到高三一班,高纬度向量映射到低维度空间. 映射与线性空间的概念对于数据科学来说至关重要,因为现实世界的数据总是包含着许许多多的维度.因此线性空间这个数学工

关于命名规范、维度明细层及集市汇总层设计的思考

在SN做仓库项目,根据自己负责的内容及SN的一些规范等,将这一阶段的模型工作进行一个思考和总结. 一.仓库字段.表等命名的规范 数据仓库建设目的,其中重要的一个方面就是建立统一的全局视图:表.字段等的规范命名就是仓库全局视图一个方面的体现. 在进行规范命名的时候,一般会根据<数据建模字段简写命名规范.xlsx>来进行.<规范>中有的词组,对应的表及字段按照<规范>进行命名:有的字段词组在<规范>中没有,则需要在<规范>中新加.完善和补充.新增加的

宇宙维度的描述

1.各个维度的描述 三维空间:像是一幅静止的照片: 四维时空:像是一部视频,有一个进度条可以拖动以改变事物的进程,是无数张照片的集合: 五维时空:是无数部相同的视频在放映,只不过各自之间有一个时间差: 六维空间:出现了无数部完全不同.没有关联的片子,而每一部片子都按照上述五维时空的方式播放. 2.如何分辨电影中的时空穿越是几维穿越: 四维穿越:不会遇到另一个我,不论怎样穿越,始终在这个世界的高度融合,因为这本来就是原来那个世界: 五维穿越:会在那个世界遇到另一个我,但是无论我怎样努力,无法改变世

SSAS多维数据集以及维度的建立

首先打开vs建立一个Analysis Services项目,然后点击数据源文件右键[新建数据源],根据数据源向导建立自己的数据源,如图1: 点击[确定],选择刚才的数据连接,点击[下一步]进入模拟信息窗体,这一步记得我的电脑只能选择“使用服务账户这一项”,不然后期处理多维数据集时会连接不上数据库,当然这个看个人电脑情况,因为我同事选择的是“使用特定windows用户名和密码”这一项依然处理成功了.这一步视个人电脑而定.图2: 然后[下一步]完成数据源向导.接下来建立数据源视图为建立多维数据集提供

利用java日期类生成数据仓库维度表

利用java日期类生成数据仓库维度表 Date类: 最基础的日期时间类,返回一个相对日期的毫秒数.精确到毫秒,但不支持日期的国际化和分时区显示.Date 类从Java 开发包(JDK)1.0 就开始进化,当时它只包含了几个取得或者设置一个日期数据的各个部分的方法, 比如说月, 日, 和年. 这些方法现在遭到了批评并且已经被转移到了Calendar类里去了,这种改进旨在更好的处理日期数据的国际化格式. Calender类: 相对于Date更加强大的时间类,是抽象类,提供了常规的日期修改功能和国际化