9 from data_about_players
import Data
11 from knn
import KNNOutputVectorGenerator
14 def __init__( self
, filename
):
15 self
.null
= open('/dev/null','w')
17 s
= "./gnet/gnet_train -l 3 -n 30 -p 30 -e 0.00005 -o gonet.net ./"+filename
19 ret
= subprocess
.call(args
)#,stdout=self.null)
20 s
= "./gnet/gnet_run gonet.net"
22 self
.p
= subprocess
.Popen(args
, stdin
=subprocess
.PIPE
, stdout
=subprocess
.PIPE
, stderr
=self
.null
)
23 def __call__(self
, vector
):
24 self
.p
.stdin
.write(' '.join([str(a
) for a
in vector
]) + '\n')
25 a
= self
.p
.stdout
.readline()
26 return [ float(num
) for num
in a
.split()]
32 if __name__
== '__main__':
33 main_pat_filename
= Data
.main_pat_filename
43 player_vector
= Data
.strength_linear_vector
44 # players_ignore = [ "Yi Ch'ang-ho 2004-" ]#, "Fujisawa Hideyuki","Yuki Satoshi", "Otake Hideo", "Yi Ch'ang-ho 2005+","Takao Shinji","Hane Naoki","Kobayashi Koichi" ]
45 players_ignore
= [ ]#,"Takao Shinji","Hane Naoki","Kobayashi Koichi" ]
46 players_all
= [ p
for p
in player_vector
.keys() if p
not in players_ignore
]
48 ### Object creating input vector when called
49 print "Creating input vector generator from main pat file:", main_pat_filename
50 i
= InputVectorGenerator(main_pat_filename
, num_features
)
52 # Create list of input vectors
54 for name
in players_all
:
55 input_vectors
+= [i(Data
.pat_files_folder
+ name
)]
57 #print '"%s"'%(players_all[2],)
58 #print input_vectors[2]
60 if len(input_vectors
) == 0:
61 print >>sys
.stderr
, "No reference vectors."
65 # Change this to False, if you do not want to use PCA
68 # Create PCA object, trained on input_vectors
69 print >>sys
.stderr
, "Running PCA."
70 pca
= PCA(input_vectors
, reduce=True)
71 # Perform a PCA on input vectors
72 input_vectors
= pca
.process_list_of_vectors(input_vectors
)
73 # Creates a Composed object that first generates an input vector
74 # and then performs a PCA analysis on it.
77 ### n/4-fold cross validation
78 #bounds = random.sample(range(1,len(players_all)), len(players_all) / 10 )
80 for x
in range(1,len(players_all
)/4):
81 bounds
+= [4*x
for _
in [1] if 4*x
< len(players_all
)]
83 print >>sys
.stderr
, "Pop too small."
88 return list(2.0*numpy
.random
.random(k
)-1.0)
90 print >>sys
.stderr
, "Running Cross-validation."
92 errs
=[ [] for _
in xrange(len(players_all
)) ]
95 sentinel
=len(players_all
)
97 for _
in xrange(number_runs
):
98 pairs
= zip(players_all
, input_vectors
)
100 players_all
= [ a
for a
, b
in pairs
]
101 input_vectors
= [ b
for a
, b
in pairs
]
103 for b
in bounds
+[sentinel
]:
104 validation_set
= range(prev
, b
)
105 reference_set
= range(0,prev
) + range(b
,sentinel
)
107 print "Reference set :",
108 for pr
in range(0, prev
):
110 for pr
in validation_set
:
112 for pr
in range(b
, sentinel
):
118 for index
in reference_set
:
119 data
.append( (input_vectors
[index
], player_vector
[players_all
[index
]]) )
122 ### We can enlarge the data set by adding linear combinations of input and output vectors
123 use_lin_combinations
= False
124 if use_lin_combinations
:
125 data
+= Combinator().combine(data
)
127 print_set_to_file(data
,'nn_cross.data')
129 nn
= NeuralNet('nn_cross.data')
130 # Create list of output vectors using weighted kNN algorithm approximating output_vector
131 output_vectors
= [ nn(input_vectors
[index
]) for index
in validation_set
]
134 ### Object creating output vector when called;
136 for index
in reference_set
:
137 ref_dict
[tuple(input_vectors
[index
])] = player_vector
[players_all
[index
]]
140 # best pro InputVectorGenerator rescale=Rescale
141 oknn
= KNNOutputVectorGenerator(ref_dict
, k
=4, weight_param
=0.91, dist_mult
=21)
142 #oknn = KNNOutputVectorGenerator(ref_dict, k=3, weight_param=0.99, dist_mult=1400)
144 # Create list of output vectors using weighted kNN algorithm approximating output_vector
145 output_vectors
= [ oknn(input_vectors
[index
]) for index
in validation_set
]
147 output_vectors
= [ rand_vect(4) for index
in validation_set
]
149 desired_vectors
= [ player_vector
[players_all
[index
]] for index
in validation_set
]
152 for vec_set
,text
in [(output_vectors
, "Output: "), (desired_vectors
, "Desired:")]:
160 for num1
, (o
,d
) in zip(validation_set
, zip(output_vectors
, desired_vectors
)):
162 for num
,(x
,y
) in enumerate(zip(o
,d
)):
169 if typ
== 'joint_nn_knn':
170 print "Joint classifier:"
172 print "k-NN classifier:"
174 print "Neural network classifier:"
176 print "Random classifier:"
177 #print "Total square err: %2.3f"%( sum(errs) / number_runs,)
178 # mar = numpy.array(errs)
180 # print "Mean square err per player: " + "%2.3f ( = sd %2.3f) "%(mean, sqrt(mean))
181 mean
= numpy
.array(es
).mean()
182 print "Mean square err per style: " + "%2.3f ( = sd %2.3f) "%(mean
, sqrt(mean
))
184 #mean = numpy.array(es).mean()
185 #print "%2.3f &"%(mean),
186 #print "%2.3f \\\\\\hline"%(11.776 / mean)
189 #print "Players sorted by mean square error:"
190 #p = zip([numpy.array(errs[p]).mean() for p in xrange(len(players_all)) ], players_all)
193 # print "%2.3f %s"%(err,name)
194 # #print "%s"%(name,)