Fractal Dimension Computation in Python Code
Mike Brenner
mikeb at mitre.org
Fri Sep 29 08:33:42 EDT 2000
Myk> ... Has anyone got a fast routine for calculating the fractal
dimension of a set of points in 2 or 3D space? Thanks.
According to the inventor of fractals (Hausdorff in the year 1899), you
can place the set of 2D points next to a wall and shine light through
them, and the fractal dimension is the percentage of shadow on the wall.
If the points are not dense anywhere, then the fractional dimension will
be zero. But if parts of them are filled in, then they will cast a
shadow.
Same with the 3D points, just put them next to a four dimensional wall
and shine a four dimensional light through them (the way you measure the
amount of holes in a Swiss Cheese :).
To do this in Python, you would have to define "dense" as being points
that are within a certain distance of each other according to some
cohesion metric, and then add up all the parts according to their
topological coupling. The algorithm in outline would be something like
this:
dimension=2
total_area = point_set.integrate_area(dimension,metric)
area = 0
coupling = neural_net.cluster(point_set,dimension,metric)
for connected_part in coupling:
area = area + connected_part.integrate_area(dimension,metric)
fractional_dimension = dimension * (total_area - area) / total_area
To make this work for real, just program the three missing functions:
METRIC computes the distance between two points
INTEGRATE_AREA integrates over point sets to get their area
CLUSTER divides the set into independent connected point sets
If you don't have a neural net available to do the clustering, you can
use a genetic algorithm or an annealing algorithm, all of which are
equivalent.
You could do this in an analog fashion by using a CRT projector onto the
wall of a dark room and a sensitive light meter feeding into a ADC
connected to your RS-232 or parallel or IEEE or Firewire port. Draw the
point set on the screen and have the computer read the light meter, then
draw an all white screen and read the light meter again, and take the
ratio. Here is the code:
graphics.init()
graphics.open()
dimension = 2
graphics.fill_screen(black)
black_area = firewire.read_ADC_voltage()
graphics.fill_screen(white)
white_area = firewire.read_ADC_voltage()
for point in point_set:
graphics.draw_point(point,black)
area = firewire.read_ADC_voltage()
denominator = white_area - black_area
numerator = area - black_area
fractional_dimension = dimension * numerator - denominator
This code requires you install a graphic capability, a firewire
capability, a light sensitive meter, an analog-to-digital converter, a
firewire driver for the ADC. To do a 3D point set this way, would
probably involve techniques such as a tomograph machine to do one slice
at a time.
Mike Brenner
MikeTheMathematician at IEEE.org
More information about the Python-list
mailing list