Geografisk analyse: punktmønstre


In [12]:
# Kode er basert på:

# Pana.py - Calculating G- and F-function values
# 
# made by: sverre.stikbakke@hig.no 26.02.2007
In [13]:
# Importerer hjelpefunksjoner

import math
import random
import pylab
In [14]:
# Definerer konstanter

infinity = 2**100 # Stort tall
In [15]:
# - setter inn verdier for variabler som brukes ved simulering

n = 50   # Antall punkt i mulig cluster-datasett

mu = 50     # Forventet gjennomsnittlig verdi
sigma = 15 # Standardavvik
In [16]:
# Funksjon for å lage et datasett ved simulering - trekking av tilfeldige tall fra normalfordeling
#
# n: antall punkt som skal genereres
# mu: forventning
# sigma: standardavvik

def createRandomPoints(n, mu, sigma):
    S = {}
    for i in range(1, n + 1):
        x = random.normalvariate(mu,sigma)
        y = random.normalvariate(mu,sigma)
        S[i] = x, y
    return S
In [17]:
# Beregner nærmeste nabo-avstand for alle punkter 
# innbyrdes i datasettet

def NN(P, infinity):
    D = {}
    for i in P:
        dMin = infinity
        for j in P:
            if i is not j:
                d = euclidDistance(P[i], P[j])
                if d < dMin:
                    dMin = d
                    D[i] = dMin
    return D
In [18]:
# Beregner gjennomsnittlig nærmeste nabo-avstand
#
# D: Dictionary med nærmeste nabo-avstander

def mean_NN(D):
    n = len(D)
    sum_distances = 0
    for i in D:
        sum_distances += D[i]
    return sum_distances/n
In [19]:
# Lager lister med X- og Y-koordinater for plotting (hver akse for seg)
# 
# P: Datasett bestående av punkter med X- og Y-verdier

def make_XY(P):
    X = []
    Y = []
    for i in P:
        X.append(P[i][0])
        Y.append(P[i][1])
    return X, Y
In [20]:
# Lager plot av punktsky
#
# X: X-verdier
# Y: Y-verdier

def make_plot(XS, YS):
    
    pylab.plot(XS, YS, 'o')
    pylab.axis([0, 100, 0, 100])
    pylab.grid(True)
    pylab.xlabel("x-coordinate")
    pylab.ylabel("y-coordinate")
        
    pylab.show()
In [21]:
# Beregner euklidisk avstand mellom to punkt

def euclidDistance(p1, p2):
    x_dist = p2[0] - p1[0]
    y_dist = p2[1] - p1[1]
    hypotenuse = math.sqrt(x_dist**2 + y_dist**2)
    return hypotenuse
In [22]:
# - kaller simuleringsfunksjoner
# - lager datastrukturene som brukes ved plotting
# - kaller plottefunksjon

# Trekker tilfeldige tall og lager datasett av disse
pointcloud = createRandomPoints(n, mu, sigma)

# Beregner nærmeste nabo-avstander
pointcloud_NN = NN(pointcloud, infinity)

# Beregner gjennomsnittlig nærmeste nabo-avstand
pointcloud_mean_NN = mean_NN(pointcloud_NN)

# Henter ut X- og Y-verder fra datasettene
X, Y = make_XY(pointcloud)

make_plot(X, Y)

print("Gjennomsnittlig nærmeste-nabo-avstand: ", pointcloud_mean_NN)
Gjennomsnittlig nærmeste-nabo-avstand:  5.168205951623698
In [ ]:
 
In [ ]: