comparison src/logistic.go @ 15:3673b244ad94

add logistic.go
author pyon@macmini
date Sun, 21 Jan 2018 17:31:21 +0900
parents
children
comparison
equal deleted inserted replaced
14:001e2aa380ad 15:3673b244ad94
1 /*
2 * ロジスティック回帰分析
3 * Last Change: 2018-01-21 Sun 17:15:18.
4 */
5 package main
6
7 import (
8 "bufio"
9 "fmt"
10 "image"
11 "image/color"
12 "image/png"
13 "log"
14 "math"
15 "os"
16 "strconv"
17 "strings"
18 "time"
19 )
20
21 var RMAX int // 最大繰り返し回数
22 var NN, MM int // 説明変数の次元
23 var lr float64 // 学習率
24 var vb []float64 // 重み(切片と傾き)ベクトル
25 var db float64 // vb の微増分(デルタ)
26 var mx [][]float64 // 説明変数
27 var vy []float64 // 結果変数
28 var start time.Time
29
30 func init() {
31 start = time.Now()
32
33 RMAX = 500
34
35 lr = 0.005
36 db = 0.0001
37
38 NN, MM = 1000, 3 // i, j
39 vb = make( []float64, MM )
40 vy = make( []float64, NN )
41 mx = make( [][]float64, NN )
42 for i := range mx {
43 mx[i] = make( []float64, MM )
44 mx[i][0] = 1.0
45 }
46
47 for j := range vb {
48 vb[j] = 1.0
49 }
50
51 f, err := os.Open( "input.txt" )
52 if err != nil {
53 log.Fatal( err )
54 }
55 scanner := bufio.NewScanner( f )
56 var buf []string
57 i := 0
58 for scanner.Scan() {
59 buf = strings.Split( scanner.Text(), "\t" )
60 for j := range vb {
61 if s, err := strconv.ParseFloat( buf[j], 64 ); err != nil {
62 log.Fatal( err )
63 } else {
64 if j == MM - 1 {
65 vy[i] = s
66 } else {
67 mx[i][j+1] = s
68 }
69 }
70 }
71 i++
72 }
73 if err := scanner.Err(); err != nil {
74 log.Fatal( err )
75 }
76 f.Close()
77 }
78
79 func main() {
80
81 for n := 0; n < RMAX; n++ {
82 dcdb := f_dCdb() // 対数尤度の勾配を計算
83 odds := f_odds() // オッズを計算
84
85 for j := range dcdb {
86 vb[j] -= dcdb[j] * lr // 重み係数を更新
87 }
88
89 fmt.Printf( "%04d> %7.2f %6.2f %3.1f\n", n, dcdb, vb, odds ) // 出力
90 }
91 fmt.Println( time.Now().Sub( start ) )
92 //makegraph()
93 }
94
95 func f_dCdb() []float64 {
96
97 dcdb := make( []float64, MM )
98
99 for p := range vb {
100 for i:= 0; i < NN; i++ {
101 var xb0, xb float64
102 for j:= range vb {
103 d := 0.0
104 if j == p {
105 d = db
106 }
107 xb0 += mx[i][j] * vb[j]
108 xb += mx[i][j] * ( vb[j] + d )
109 }
110 s0 := ( vy[i] - 1 ) * xb0 - math.Log1p( math.Exp( - ( xb0 ) ) )
111 s := ( vy[i] - 1 ) * xb - math.Log1p( math.Exp( - ( xb ) ) )
112 dcdb[p] += - ( s - s0 ) / db
113 }
114 }
115 return dcdb
116 }
117
118 func f_odds() []float64 {
119 odds := make( []float64, MM )
120 for j:= range vb {
121 odds[j] = math.Exp( vb[j] )
122 }
123 return odds
124 }
125
126 func makegraph() {
127 const width, height = 256, 256
128 img := image.NewNRGBA( image.Rect( 0, 0, width, height ) )
129 for y := 0; y < height; y++ {
130 for x := 0; x < width; x++ {
131 img.Set( x, y, color.NRGBA{
132 R: uint8( ( x + y ) & 255 ),
133 G: uint8( ( x + y ) << 1 & 255 ),
134 B: uint8( ( x + y ) << 2 & 255 ),
135 A: 255,
136 } )
137 }
138 }
139
140 f, err := os.Create( "image.png" )
141 if err != nil {
142 log.Fatal( err )
143 }
144
145 if err := png.Encode( f, img ); err != nil {
146 f.Close()
147 log.Fatal( err )
148 }
149
150 if err := f.Close(); err != nil {
151 log.Fatal( err )
152 }
153 }
154
155 /* - input.txt - */
156 /*
157 0 0 0
158 0 0 0
159 0 0 0
160 0 0 0
161 0 0 0
162 0 0 0
163 0 0 0
164 0 0 0
165 0 0 0
166 0 0 0
167 0 0 0
168 0 0 0
169 0 0 0
170 0 0 0
171 0 0 0
172 0 0 0
173 0 0 0
174 0 0 0
175 0 0 0
176 0 0 0
177 0 0 0
178 0 0 0
179 0 0 0
180 0 0 0
181 0 0 0
182 0 0 0
183 0 0 0
184 0 0 0
185 0 0 0
186 0 0 0
187 0 0 0
188 0 0 0
189 0 0 0
190 0 0 0
191 0 0 0
192 0 0 0
193 0 0 0
194 0 0 0
195 0 0 0
196 0 0 0
197 0 0 0
198 0 0 0
199 0 0 0
200 0 0 0
201 0 0 0
202 0 0 0
203 0 0 0
204 0 0 0
205 0 0 0
206 0 0 0
207 0 0 0
208 0 0 0
209 0 0 0
210 0 0 0
211 0 0 0
212 0 0 0
213 0 0 0
214 0 0 0
215 0 0 0
216 0 0 0
217 0 0 0
218 0 0 0
219 0 0 0
220 0 0 0
221 0 0 0
222 0 0 0
223 0 0 0
224 0 0 0
225 0 0 0
226 0 0 0
227 0 0 0
228 0 0 0
229 0 0 0
230 0 0 0
231 0 0 0
232 0 0 0
233 0 0 0
234 0 0 0
235 0 0 0
236 0 0 0
237 0 0 0
238 0 0 0
239 0 0 0
240 0 0 0
241 0 0 0
242 0 0 0
243 0 0 0
244 0 0 0
245 0 0 0
246 0 0 0
247 0 0 0
248 0 0 0
249 0 0 0
250 0 0 0
251 0 0 0
252 0 0 0
253 0 0 0
254 0 0 0
255 0 0 0
256 0 0 0
257 0 0 0
258 0 0 0
259 0 0 0
260 0 0 0
261 0 0 0
262 0 0 0
263 0 0 0
264 0 0 0
265 0 0 0
266 0 0 0
267 0 0 0
268 0 0 0
269 0 0 0
270 0 0 0
271 0 0 0
272 0 0 0
273 0 0 0
274 0 0 0
275 0 0 0
276 0 0 0
277 0 0 0
278 0 0 0
279 0 0 0
280 0 0 0
281 0 0 0
282 0 0 0
283 0 0 0
284 0 0 0
285 0 0 0
286 0 0 0
287 0 0 0
288 0 0 0
289 0 0 0
290 0 0 0
291 0 0 0
292 0 0 0
293 0 0 0
294 0 0 0
295 0 0 0
296 0 0 0
297 0 0 0
298 0 0 0
299 0 0 0
300 0 0 0
301 0 0 0
302 0 0 0
303 0 0 0
304 0 0 0
305 0 0 0
306 0 0 0
307 0 0 0
308 0 0 0
309 0 0 0
310 0 0 0
311 0 0 0
312 0 0 0
313 0 0 0
314 0 0 0
315 0 0 0
316 0 0 0
317 0 0 0
318 0 0 0
319 0 0 0
320 0 0 0
321 0 0 0
322 0 0 0
323 0 0 0
324 0 0 0
325 0 0 0
326 0 0 0
327 0 0 0
328 0 0 0
329 0 0 0
330 0 0 0
331 0 0 0
332 0 0 0
333 0 0 0
334 0 0 0
335 0 0 0
336 0 0 0
337 0 0 0
338 0 0 0
339 0 0 0
340 0 0 0
341 0 0 0
342 0 0 0
343 0 0 0
344 0 0 0
345 0 0 0
346 0 0 0
347 0 0 0
348 0 0 0
349 0 0 0
350 0 0 0
351 0 0 0
352 0 0 0
353 0 0 0
354 0 0 0
355 0 0 0
356 0 0 0
357 0 0 0
358 0 0 0
359 0 0 0
360 0 0 0
361 0 0 0
362 0 0 0
363 0 0 0
364 0 0 1
365 0 0 1
366 0 0 1
367 0 0 1
368 0 0 1
369 0 0 1
370 0 0 1
371 0 0 1
372 0 0 1
373 0 0 1
374 0 0 1
375 0 0 1
376 0 0 1
377 0 0 1
378 0 0 1
379 0 0 1
380 0 0 1
381 0 0 1
382 0 0 1
383 0 0 1
384 0 0 1
385 0 0 1
386 0 0 1
387 0 1 0
388 0 1 0
389 0 1 0
390 0 1 0
391 0 1 0
392 0 1 0
393 0 1 0
394 0 1 0
395 0 1 0
396 0 1 0
397 0 1 0
398 0 1 0
399 0 1 0
400 0 1 0
401 0 1 0
402 0 1 0
403 0 1 0
404 0 1 0
405 0 1 1
406 0 1 1
407 1 0 0
408 1 0 0
409 1 0 0
410 1 0 0
411 1 0 0
412 1 0 0
413 1 0 0
414 1 0 0
415 1 0 0
416 1 0 0
417 1 0 0
418 1 0 0
419 1 0 0
420 1 0 0
421 1 0 0
422 1 0 0
423 1 0 0
424 1 0 0
425 1 0 0
426 1 0 0
427 1 0 0
428 1 0 0
429 1 0 0
430 1 0 0
431 1 0 0
432 1 0 0
433 1 0 0
434 1 0 0
435 1 0 0
436 1 0 0
437 1 0 0
438 1 0 0
439 1 0 0
440 1 0 0
441 1 0 0
442 1 0 0
443 1 0 0
444 1 0 0
445 1 0 0
446 1 0 0
447 1 0 0
448 1 0 0
449 1 0 0
450 1 0 0
451 1 0 0
452 1 0 0
453 1 0 0
454 1 0 0
455 1 0 0
456 1 0 0
457 1 0 0
458 1 0 0
459 1 0 0
460 1 0 0
461 1 0 0
462 1 0 0
463 1 0 0
464 1 0 0
465 1 0 0
466 1 0 0
467 1 0 0
468 1 0 0
469 1 0 0
470 1 0 0
471 1 0 0
472 1 0 0
473 1 0 0
474 1 0 0
475 1 0 0
476 1 0 0
477 1 0 0
478 1 0 0
479 1 0 0
480 1 0 0
481 1 0 0
482 1 0 0
483 1 0 0
484 1 0 0
485 1 0 0
486 1 0 0
487 1 0 0
488 1 0 0
489 1 0 0
490 1 0 0
491 1 0 0
492 1 0 0
493 1 0 0
494 1 0 0
495 1 0 0
496 1 0 0
497 1 0 0
498 1 0 0
499 1 0 0
500 1 0 0
501 1 0 0
502 1 0 0
503 1 0 0
504 1 0 0
505 1 0 0
506 1 0 0
507 1 0 0
508 1 0 0
509 1 0 0
510 1 0 0
511 1 0 0
512 1 0 0
513 1 0 0
514 1 0 0
515 1 0 0
516 1 0 0
517 1 0 0
518 1 0 0
519 1 0 0
520 1 0 0
521 1 0 0
522 1 0 0
523 1 0 0
524 1 0 0
525 1 0 0
526 1 0 0
527 1 0 0
528 1 0 0
529 1 0 0
530 1 0 0
531 1 0 0
532 1 0 0
533 1 0 0
534 1 0 0
535 1 0 0
536 1 0 0
537 1 0 0
538 1 0 0
539 1 0 0
540 1 0 0
541 1 0 0
542 1 0 0
543 1 0 0
544 1 0 0
545 1 0 0
546 1 0 0
547 1 0 0
548 1 0 0
549 1 0 0
550 1 0 0
551 1 0 0
552 1 0 0
553 1 0 0
554 1 0 0
555 1 0 0
556 1 0 0
557 1 0 0
558 1 0 0
559 1 0 0
560 1 0 0
561 1 0 0
562 1 0 0
563 1 0 0
564 1 0 0
565 1 0 0
566 1 0 0
567 1 0 0
568 1 0 0
569 1 0 0
570 1 0 0
571 1 0 0
572 1 0 0
573 1 0 0
574 1 0 0
575 1 0 0
576 1 0 0
577 1 0 0
578 1 0 0
579 1 0 0
580 1 0 0
581 1 0 0
582 1 0 0
583 1 0 0
584 1 0 0
585 1 0 0
586 1 0 0
587 1 0 0
588 1 0 0
589 1 0 0
590 1 0 0
591 1 0 0
592 1 0 0
593 1 0 0
594 1 0 0
595 1 0 0
596 1 0 0
597 1 0 0
598 1 0 0
599 1 0 0
600 1 0 0
601 1 0 0
602 1 0 0
603 1 0 0
604 1 0 0
605 1 0 0
606 1 0 0
607 1 0 0
608 1 0 0
609 1 0 0
610 1 0 0
611 1 0 0
612 1 0 0
613 1 0 0
614 1 0 0
615 1 0 0
616 1 0 0
617 1 0 0
618 1 0 0
619 1 0 0
620 1 0 0
621 1 0 0
622 1 0 0
623 1 0 0
624 1 0 0
625 1 0 0
626 1 0 0
627 1 0 0
628 1 0 0
629 1 0 0
630 1 0 0
631 1 0 0
632 1 0 0
633 1 0 0
634 1 0 0
635 1 0 0
636 1 0 0
637 1 0 0
638 1 0 0
639 1 0 0
640 1 0 0
641 1 0 0
642 1 0 0
643 1 0 0
644 1 0 0
645 1 0 0
646 1 0 0
647 1 0 0
648 1 0 0
649 1 0 0
650 1 0 0
651 1 0 0
652 1 0 0
653 1 0 0
654 1 0 0
655 1 0 0
656 1 0 0
657 1 0 0
658 1 0 0
659 1 0 0
660 1 0 0
661 1 0 0
662 1 0 0
663 1 0 0
664 1 0 0
665 1 0 0
666 1 0 0
667 1 0 0
668 1 0 0
669 1 0 0
670 1 0 0
671 1 0 0
672 1 0 0
673 1 0 0
674 1 0 0
675 1 0 0
676 1 0 0
677 1 0 0
678 1 0 0
679 1 0 0
680 1 0 0
681 1 0 0
682 1 0 0
683 1 0 0
684 1 0 0
685 1 0 0
686 1 0 0
687 1 0 0
688 1 0 0
689 1 0 0
690 1 0 0
691 1 0 0
692 1 0 0
693 1 0 0
694 1 0 0
695 1 0 0
696 1 0 0
697 1 0 0
698 1 0 0
699 1 0 0
700 1 0 0
701 1 0 0
702 1 0 0
703 1 0 0
704 1 0 0
705 1 0 0
706 1 0 0
707 1 0 0
708 1 0 0
709 1 0 0
710 1 0 0
711 1 0 0
712 1 0 0
713 1 0 0
714 1 0 0
715 1 0 0
716 1 0 0
717 1 0 0
718 1 0 0
719 1 0 0
720 1 0 0
721 1 0 0
722 1 0 0
723 1 0 0
724 1 0 0
725 1 0 0
726 1 0 0
727 1 0 0
728 1 0 0
729 1 0 0
730 1 0 0
731 1 0 0
732 1 0 0
733 1 0 0
734 1 0 0
735 1 0 0
736 1 0 0
737 1 0 0
738 1 0 0
739 1 0 0
740 1 0 0
741 1 0 0
742 1 0 0
743 1 0 0
744 1 0 0
745 1 0 0
746 1 0 0
747 1 0 0
748 1 0 0
749 1 0 0
750 1 0 0
751 1 0 0
752 1 0 0
753 1 0 0
754 1 0 0
755 1 0 0
756 1 0 0
757 1 0 0
758 1 0 0
759 1 0 0
760 1 0 0
761 1 0 0
762 1 0 0
763 1 0 0
764 1 0 0
765 1 0 0
766 1 0 0
767 1 0 0
768 1 0 0
769 1 0 0
770 1 0 0
771 1 0 0
772 1 0 0
773 1 0 0
774 1 0 0
775 1 0 0
776 1 0 0
777 1 0 0
778 1 0 0
779 1 0 0
780 1 0 0
781 1 0 0
782 1 0 0
783 1 0 0
784 1 0 0
785 1 0 0
786 1 0 0
787 1 0 0
788 1 0 0
789 1 0 0
790 1 0 0
791 1 0 0
792 1 0 0
793 1 0 0
794 1 0 0
795 1 0 0
796 1 0 0
797 1 0 0
798 1 0 0
799 1 0 0
800 1 0 0
801 1 0 0
802 1 0 0
803 1 0 0
804 1 0 0
805 1 0 0
806 1 0 0
807 1 0 0
808 1 0 0
809 1 0 0
810 1 0 0
811 1 0 0
812 1 0 0
813 1 0 0
814 1 0 0
815 1 0 0
816 1 0 0
817 1 0 0
818 1 0 0
819 1 0 0
820 1 0 0
821 1 0 0
822 1 0 0
823 1 0 0
824 1 0 0
825 1 0 0
826 1 0 0
827 1 0 0
828 1 0 0
829 1 0 0
830 1 0 0
831 1 0 0
832 1 0 0
833 1 0 0
834 1 0 0
835 1 0 0
836 1 0 0
837 1 0 0
838 1 0 0
839 1 0 0
840 1 0 0
841 1 0 0
842 1 0 1
843 1 0 1
844 1 0 1
845 1 0 1
846 1 0 1
847 1 0 1
848 1 0 1
849 1 0 1
850 1 0 1
851 1 0 1
852 1 0 1
853 1 0 1
854 1 0 1
855 1 0 1
856 1 0 1
857 1 0 1
858 1 0 1
859 1 0 1
860 1 0 1
861 1 0 1
862 1 0 1
863 1 0 1
864 1 0 1
865 1 0 1
866 1 0 1
867 1 0 1
868 1 0 1
869 1 0 1
870 1 0 1
871 1 0 1
872 1 0 1
873 1 0 1
874 1 0 1
875 1 0 1
876 1 0 1
877 1 0 1
878 1 0 1
879 1 0 1
880 1 0 1
881 1 0 1
882 1 0 1
883 1 0 1
884 1 0 1
885 1 0 1
886 1 0 1
887 1 0 1
888 1 0 1
889 1 0 1
890 1 0 1
891 1 0 1
892 1 0 1
893 1 0 1
894 1 0 1
895 1 0 1
896 1 0 1
897 1 0 1
898 1 0 1
899 1 0 1
900 1 0 1
901 1 0 1
902 1 0 1
903 1 0 1
904 1 0 1
905 1 0 1
906 1 0 1
907 1 0 1
908 1 0 1
909 1 0 1
910 1 0 1
911 1 0 1
912 1 0 1
913 1 0 1
914 1 0 1
915 1 0 1
916 1 0 1
917 1 0 1
918 1 0 1
919 1 0 1
920 1 0 1
921 1 0 1
922 1 0 1
923 1 0 1
924 1 0 1
925 1 0 1
926 1 0 1
927 1 0 1
928 1 0 1
929 1 0 1
930 1 0 1
931 1 0 1
932 1 0 1
933 1 0 1
934 1 0 1
935 1 0 1
936 1 0 1
937 1 0 1
938 1 0 1
939 1 0 1
940 1 0 1
941 1 0 1
942 1 0 1
943 1 0 1
944 1 0 1
945 1 0 1
946 1 0 1
947 1 0 1
948 1 0 1
949 1 0 1
950 1 0 1
951 1 0 1
952 1 0 1
953 1 0 1
954 1 0 1
955 1 0 1
956 1 0 1
957 1 0 1
958 1 0 1
959 1 0 1
960 1 0 1
961 1 0 1
962 1 0 1
963 1 0 1
964 1 0 1
965 1 0 1
966 1 0 1
967 1 0 1
968 1 0 1
969 1 0 1
970 1 0 1
971 1 0 1
972 1 0 1
973 1 0 1
974 1 0 1
975 1 0 1
976 1 0 1
977 1 0 1
978 1 0 1
979 1 0 1
980 1 0 1
981 1 0 1
982 1 0 1
983 1 0 1
984 1 0 1
985 1 0 1
986 1 0 1
987 1 0 1
988 1 0 1
989 1 0 1
990 1 0 1
991 1 0 1
992 1 0 1
993 1 0 1
994 1 0 1
995 1 0 1
996 1 0 1
997 1 0 1
998 1 0 1
999 1 0 1
1000 1 0 1
1001 1 0 1
1002 1 0 1
1003 1 0 1
1004 1 0 1
1005 1 0 1
1006 1 0 1
1007 1 0 1
1008 1 0 1
1009 1 0 1
1010 1 0 1
1011 1 0 1
1012 1 0 1
1013 1 0 1
1014 1 0 1
1015 1 0 1
1016 1 0 1
1017 1 0 1
1018 1 0 1
1019 1 0 1
1020 1 0 1
1021 1 0 1
1022 1 0 1
1023 1 0 1
1024 1 0 1
1025 1 0 1
1026 1 0 1
1027 1 0 1
1028 1 0 1
1029 1 0 1
1030 1 0 1
1031 1 0 1
1032 1 0 1
1033 1 0 1
1034 1 0 1
1035 1 0 1
1036 1 0 1
1037 1 0 1
1038 1 0 1
1039 1 0 1
1040 1 0 1
1041 1 0 1
1042 1 0 1
1043 1 0 1
1044 1 0 1
1045 1 0 1
1046 1 0 1
1047 1 0 1
1048 1 0 1
1049 1 0 1
1050 1 0 1
1051 1 0 1
1052 1 0 1
1053 1 0 1
1054 1 0 1
1055 1 0 1
1056 1 0 1
1057 1 0 1
1058 1 0 1
1059 1 0 1
1060 1 0 1
1061 1 0 1
1062 1 0 1
1063 1 0 1
1064 1 0 1
1065 1 0 1
1066 1 0 1
1067 1 0 1
1068 1 0 1
1069 1 0 1
1070 1 0 1
1071 1 0 1
1072 1 0 1
1073 1 0 1
1074 1 0 1
1075 1 0 1
1076 1 0 1
1077 1 0 1
1078 1 0 1
1079 1 0 1
1080 1 0 1
1081 1 0 1
1082 1 0 1
1083 1 0 1
1084 1 0 1
1085 1 0 1
1086 1 0 1
1087 1 0 1
1088 1 0 1
1089 1 0 1
1090 1 0 1
1091 1 0 1
1092 1 0 1
1093 1 0 1
1094 1 0 1
1095 1 0 1
1096 1 0 1
1097 1 0 1
1098 1 0 1
1099 1 0 1
1100 1 0 1
1101 1 0 1
1102 1 0 1
1103 1 0 1
1104 1 0 1
1105 1 0 1
1106 1 0 1
1107 1 0 1
1108 1 0 1
1109 1 0 1
1110 1 0 1
1111 1 0 1
1112 1 0 1
1113 1 0 1
1114 1 0 1
1115 1 0 1
1116 1 0 1
1117 1 0 1
1118 1 0 1
1119 1 0 1
1120 1 0 1
1121 1 0 1
1122 1 0 1
1123 1 0 1
1124 1 0 1
1125 1 0 1
1126 1 0 1
1127 1 0 1
1128 1 0 1
1129 1 0 1
1130 1 0 1
1131 1 0 1
1132 1 1 0
1133 1 1 0
1134 1 1 0
1135 1 1 0
1136 1 1 0
1137 1 1 0
1138 1 1 0
1139 1 1 0
1140 1 1 0
1141 1 1 0
1142 1 1 0
1143 1 1 0
1144 1 1 0
1145 1 1 0
1146 1 1 0
1147 1 1 1
1148 1 1 1
1149 1 1 1
1150 1 1 1
1151 1 1 1
1152 1 1 1
1153 1 1 1
1154 1 1 1
1155 1 1 1
1156 1 1 1
1157 */