aboutsummaryrefslogtreecommitdiff
path: root/py
diff options
context:
space:
mode:
Diffstat (limited to 'py')
-rw-r--r--py/data2.py21
-rw-r--r--py/deathtable2.py2
-rw-r--r--py/pvals.py61
-rw-r--r--py/stats.py38
4 files changed, 79 insertions, 43 deletions
diff --git a/py/data2.py b/py/data2.py
index 505a79d..a073f4b 100644
--- a/py/data2.py
+++ b/py/data2.py
@@ -2,6 +2,7 @@
from scipy.spatial import Voronoi, voronoi_plot_2d, KDTree, distance
from enum import Enum
import matplotlib.pyplot as plt
+from matplotlib.path import Path
fancy = {'pits':'Artificial Pits', 'obstacles':'Artificial Obstacles',
'trails':'Trail Erasure'}
@@ -38,6 +39,9 @@ class Trial:
def plot(self, save=False):
vor = Voronoi([pit.loc for pit in self.pits])
voronoi_plot_2d(vor)
+ if self.method == 'obstacles':
+ for obstacle in self.fake:
+ plt.fill(*obstacle.unzip())
plt.xlabel('%s (dimension %dx%dcm)' % (fancy[self.method], self.size[0], self.size[1]))
if save:
plt.savefig('%s-%dx%d.png'%(self.method,self.size[0],self.size[1]),
@@ -53,6 +57,16 @@ class Trial:
class Obstacle:
def __init__(self, coords):
self.coords = coords
+ self.path = Path(coords)
+
+ def contains(self, point):
+ return self.path.contains_point(point)
+
+ def multicontains(self, points):
+ return self.path.contains_points(points)
+
+ def unzip(self):
+ return ([x[0] for x in self.coords],[x[1] for x in self.coords])
trials = [
Trial('trails', 1, 2, [24,24], [
@@ -135,8 +149,8 @@ trials = [
Pit((22,16),2,4),
], fake=[
Obstacle([(8,3),(1,7),(7,16)]),
- Obstacle([(18,1),(16,7),(21,4),(21,7)]),
- Obstacle([(17,15),(18,20),(23,19),(21,20)])
+ Obstacle([(18,1),(16,7),(21,7),(21,4)]),
+ Obstacle([(17,15),(18,20),(21,20),(23,19)])
]),
Trial('obstacles', 3, 0, [12,12], [
Pit((2,11),2,3),
@@ -149,6 +163,5 @@ trials = [
Pit((10,11),2,4),
Pit((6,3),3,5),
Pit((12,9),1,2),
- ], fake=[ Obstacle([(10,2),(11,9),(3,5),(3,8)]) ]),
+ ], fake=[ Obstacle([(10,2),(11,9),(3,8),(3,5)]) ]),
]
-
diff --git a/py/deathtable2.py b/py/deathtable2.py
index 401d42e..ec0f171 100644
--- a/py/deathtable2.py
+++ b/py/deathtable2.py
@@ -6,7 +6,7 @@ Nearest Neighbor (avg) & Width (avg) & Depth (avg)\\cr\\tabrule')
for trial in trials:
print('& '.join(['$'+'\\times'.join([str(el) for el in trial.size])+'$',
- names[trial.method], str(trial.recl), str(trial.dead),
+ fancy[trial.method], str(trial.recl), str(trial.dead),
str(len(trial.pits)), '%.2f' % mean(trial.nearest_neighbor()),
'%.2f' % mean([pit.diam for pit in trial.pits]),
'%.2f' % mean([pit.depth for pit in trial.pits])])+'\\cr\\tabrule')
diff --git a/py/pvals.py b/py/pvals.py
new file mode 100644
index 0000000..9f46826
--- /dev/null
+++ b/py/pvals.py
@@ -0,0 +1,61 @@
+from data2 import trials, fancy
+from scipy.stats import cramervonmises
+from bisect import bisect_left
+from random import random
+
+def distance(pit1, pit2):
+ out = ((pit2[1]-pit1[1])**2 + (pit2[0]-pit1[0])**2)**(1/2)
+ if (out == 0):
+ return 100
+ else:
+ return out
+
+def cdf(a,nnsim,tup):
+ return [bisect_left(nnsim, x)/len(nnsim) for x in a]
+
+def calcpval(trialno):
+ trial = trials[trialno]
+ size = trial.size[0]
+ pits = len(trial.pits)
+
+ nnsim = []
+ for j in range(1000):
+ curpits = []
+ k = 0
+ while k < pits:
+ add = (random()*size,random()*size)
+ if trial.method == 'obstacles':
+ for obs in trial.fake:
+ if obs.contains(add):
+ continue
+ if trial.method == 'pits':
+ for pit in trial.fake:
+ if distance(add,pit.loc) < pit.diam/2:
+ continue
+ curpits.append(add)
+ k += 1
+ for pit in curpits:
+ l = size
+ for pit2 in curpits:
+ l = min(l,distance(pit,pit2))
+ nnsim.append(l)
+
+ nnsim.sort()
+
+ nnreal = trials[trialno].nearest_neighbor()
+ stat = cramervonmises(nnreal,cdf,(nnsim,()))
+ return stat.pvalue
+
+sizes = [[12,12],[24,24]]
+meths = ['obstacles','pits','trails']
+pvals = [['']*len(sizes) for x in range(len(meths))]
+for n in range(len(trials)):
+ trial = trials[n]
+ pvals[meths.index(trial.method)][sizes.index(trial.size)] = '%.4f' % calcpval(n)
+
+print('\\tabrule $12\\times12$&$24\\times24$\\cr\\tabrule')
+for row in range(len(meths)):
+ print(fancy[meths[row]],end='')
+ for col in range(len(sizes)):
+ print('&'+pvals[row][col],end='')
+ print('\\cr\\tabrule')
diff --git a/py/stats.py b/py/stats.py
deleted file mode 100644
index b79e56f..0000000
--- a/py/stats.py
+++ /dev/null
@@ -1,38 +0,0 @@
-from data2 import trials
-from scipy.stats import cramervonmises
-from bisect import bisect_left
-from random import random
-
-def distance(pit1, pit2):
- out = ((pit2[1]-pit1[1])**2 + (pit2[0]-pit1[0])**2)**(1/2)
- if (out == 0):
- return 100
- else:
- return out
-
-def cdf(a,nnsim,tup):
- return [bisect_left(nnsim, x)/len(nnsim) for x in a]
-
-def calcpval(trialno):
- size = trials[trialno].size[0]
- pits = len(trials[trialno].pits)
-
- nnsim = []
- for j in range(10000):
- curpits = []
- for k in range(pits):
- curpits.append([random()*size,random()*size])
- for pit in curpits:
- l = size
- for pit2 in curpits:
- l = min(l,distance(pit,pit2))
- nnsim.append(l)
-
- nnsim.sort()
-
- nnreal = trials[trialno].nearest_neighbor()
- stat = cramervonmises(nnreal,cdf,(nnsim,()))
- return stat.pvalue
-
-for n in range(len(trials)):
- print(calcpval(n))