# Kode er basert på:
# Pana.py - Calculating G- and F-function values
#
# made by: sverre.stikbakke@hig.no 26.02.2007
# Importerer hjelpefunksjoner
import math
import random
import pylab
# Definerer konstanter
infinity = 2**100 # Stort tall
# - 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
# 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
# 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
# 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
# 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
# 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()
# 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
# - 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)