forked from nicococo/tilitools
-
Notifications
You must be signed in to change notification settings - Fork 0
/
toydata.py
92 lines (69 loc) · 2.44 KB
/
toydata.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import cvxopt as co
import numpy as np
import pylab as pl
import matplotlib.pyplot as plt
from ssvm import SSVM
from so_multiclass import SOMultiClass
class ToyData:
@staticmethod
def get_gaussian(num,dims=2,means=[0,0],vars=[1,1]):
data = co.matrix(0.0,(dims,num))
for d in range(dims):
data[d,:] = co.normal(1,num)*vars[d] + means[d]
return data
@staticmethod
def get_2state_gaussian_seq(lens,dims=2,means1=[2,2,2,2],means2=[5,5,5,5],vars1=[1,1,1,1],vars2=[1,1,1,1],anom_prob=1.0):
seqs = co.matrix(0.0, (dims, lens))
lbls = co.matrix(0, (1,lens))
marker = 0
# generate first state sequence
for d in range(dims):
seqs[d,:] = co.normal(1,lens)*vars1[d] + means1[d]
prob = np.random.uniform()
if prob<anom_prob:
# add second state blocks
while (True):
max_block_len = 0.6*lens
min_block_len = 0.1*lens
block_len = np.int(max_block_len*np.single(co.uniform(1))+3)
block_start = np.int(lens*np.single(co.uniform(1)))
if (block_len - (block_start+block_len-lens)-3>min_block_len):
break
block_len = min(block_len,block_len - (block_start+block_len-lens)-3)
lbls[block_start:block_start+block_len-1] = 1
marker = 1
for d in range(dims):
#print block_len
seqs[d,block_start:block_start+block_len-1] = co.normal(1,block_len-1)*vars2[d] + means2[d]
return (seqs, lbls, marker)
@staticmethod
def get_2state_anom_seq(lens, comb_block_len, anom_prob=1.0, num_blocks=1):
seqs = co.matrix(0.0, (1, lens))
lbls = co.matrix(0, (1, lens))
marker = 0
# generate first state sequence, gaussian noise 0=mean, 1=variance
seqs[0,:] = co.normal(1, lens)*1.0
bak = co.matrix(seqs)
prob = np.random.uniform()
if prob<anom_prob:
# add second state blocks
block_len = np.int(np.floor(comb_block_len/float(num_blocks)))
marker = 1
# add a single block
blen = 0
for b in xrange(np.int(num_blocks)):
if (b==num_blocks-1 and b>1):
block_len = np.round(comb_block_len-blen)
isDone = False
while isDone==False:
start = np.int(np.random.uniform()*float(lens-block_len+1))
if (sum(lbls[0,start:start+block_len])==0):
#print start
#print start+block_len
lbls[0,start:start+block_len] = 1
seqs[0,start:start+block_len] = bak[0,start:start+block_len]+4.0
isDone = True
break
blen += block_len
print('Anomamly block lengths (target/reality)= {0}/{1} '.format(comb_block_len, blen))
return (seqs, lbls, marker)