
è¯ãäžæ¥ã
ããªãé·ãéãå人ã®ãŽã«ã³ããšç§ã¯å°giãããã®ã奜ãã§ãã ã ãããŠç§ãã¡ã¯ããŸãã«ã倢äžã«ãªã£ãã®ã§ããã®çŽ æŽãããã²ãŒã ã®ããã«ç¬èªã®ããããæžãããšã«ããŸããã ãã®èšäºã¯ããããéçºããã»ã¹ã®è©³çŽ°ãªèª¬æã§ãããããéçºããã»ã¹ã¯ãããã€ãã®äžæã䌎ããªãããæ°ãæéè¡ãããŠããŸããã
ã¢ã«ãã¡ããŒã¿ã¯ãªããã³ã°ã«ã€ããŠããŸãã¯åãããœãŒãããããšãéèŠã§ããçç±
ãã§ã¹ïŒäŒçµ±çããã³æ¥æ¬èªïŒããã§ãã«ãŒãäžç®äžŠã¹ãªã©ã®æ®æã²ãŒã ã§ã©ã®åããè¡ããã決å®ããããã«ãã¢ã«ãã¡-ããŒã¿ã¯ãªããã³ã°ãšåŒã°ããæé©åã䌎ãããããã¯ã¹æŠç¥ã䜿çšãããŸãã
ãã®ã¢ã«ãŽãªãºã ã¯ãç§ã®å人ã®èšäºãšä»ã®èšäºã®äž¡æ¹ã§ãHabréã§ç¹°ãè¿ãæ€èšãããŸããã
次ã®åçã§ãã®æ¬è³ªãç°¡åã«æãåºããŸãã

åè§ã®æ°åã¯ã察å¿ããäžé£ã®åããè¡ã£ãåŸã®äœçœ®ã®è©äŸ¡ã瀺ããŸãã
ãã®äŸã§ã¯ãããŒããã¯ãªããããããã®å€ã«ã¯çå笊ãä»ããããŠããŸãã
ããŒãbã®å€ãèšç®ããåŒãäœæããããšã«ããããã®ãããªã«ãããªãã®æå¹æ§ãæ€èšŒã§ããŸãã
b =æå°ïŒcãdïŒ=æå°ïŒæ倧ïŒ4,6ïŒãæ倧ïŒ7ãXïŒïŒ
æããã«ãåŒmaxïŒ7ãXïŒã¯7以äžã§ããããããã®åŒã®å€ã¯Xã«äŸåããŸããããããã£ãŠã maxïŒ4,6ïŒãã倧ããã bã®å€ã¯b = 6ã«çãããªããŸãã
ãããã£ãŠãã¢ã«ãã¡-ããŒã¿ã¯ãªããã³ã°ã¢ã«ãŽãªãºã ã«ãããæ¢ã«ååŸãããŠãããã®ãããæå³çã«æªãçµæãäžãããã©ã³ããèæ ®ããªãããšãå¯èœã«ãªããŸãã
ãããã£ãŠãæåã®ããææãªåããèæ ®ãããšãã¢ã«ãŽãªãºã ãå éãããŸãã ã©ã®åããããææããå€æããããšãããã®èšäºã®ç®çã§ãã
仮説
ã²ãŒã ã§ã¯ãç¹å®ã®åããèæ ®ããå¿ èŠããªãããšã¯äººã«ãšã£ãŠãã°ãã°æããã§ãã ããšãã°ã察æŠçžæãã«ãŒã¯ãæ»æããç¬éã«ããŒãã®ç«¯ã«ç«ã£ãŠããããŒã³ã移åããã«ã¯ã
ã³ã³ãã¥ãŒã¿ãŒã®å ŽåããæçœãªããšããæŠå¿µã¯ååšããŸããããã¹ãŠã®å¯èœãªåããé çªã«ãã§ãã¯ãããã®åŸãããŒããé£ã¹ãããšãæ£ãã決å®ã§ãããšçµè«ä»ããŸãã
äœããã®æ¹æ³ã§ãã«ãŒã¯ã®ãã£ããã£ãæåã«èæ ®ãããããã«ç§»åã®èæ ®ãé åºä»ããããŠããå Žåãã¢ã«ãã¡-ããŒã¿ã«ãããªãã¢ã«ãŽãªãºã ã¯ããã«çµäºããã«ãŒã¯ãåããšããããæããã«è©äŸ¡ãæªããã©ã³ãããã¹ãŠç Žæ£ããŸãã
ãã®äŸã§ã¯ã移åã®èæ ®ã®é åºã®ãã¥ãŒãªã¹ãã£ãã¯ãªéžæã®ç¹å¥ãªã±ãŒã¹ãèæ ®ãããŠãããããã°ã©ã ã§åå¥ã«äœ¿çšããããšã¯ã»ãšãã©ã§ããŸããã ç¹æ®ãªã±ãŒã¹ã®ã»ãããæåã§èª¬æããã®ã¯éåžžã«é¢åã§ãããã«ãã«ãŒã¯ãæ»æãåããŠãããªãã·ã§ã³ã®äžéšã®ãµãã»ããã§ã¯ãããŒã³ã®åããå¯äžã®æ£ãããã®ã«ãªãå¯èœæ§ãåžžã«ãããŸãã
ããã¯ããã§ã«ãã¬ã€ãããã²ãŒã ããææãªåãã«é¢ããæ å ±ãèªåçã«ååŸããå¯èœæ§ã®ã¢ã€ãã¢ãåºãŠãããšããã§ãã ãã®å Žåãæ©æ¢°åŠç¿æ³ã®äœ¿çšã¯ãåæ§ã®ãã©ã¡ãŒã¿ãŒïŒä»¥äžã®ãã©ã¡ãŒã¿ãŒã«ã€ããŠïŒã§ç§»åãããšåæ§ã®çµæãåŸããããšãã仮説ã«ãã£ãŠæ£åœåãããŸãã
ãã¬ãŒãã³ã°ãµã³ãã«
æ©æ¢°åŠç¿ã䜿çšãããšãã«è§£æ±ºããå¿ èŠãããæåã®è³ªåã¯ããã¬ãŒãã³ã°ãµã³ãã«ãååŸããããšã§ããããã«ãããåäœã®å質ã決å®ãããŸãã
å¥åŠãªããšã«ãéåžžã®ãã§ã¹ãšæ¯èŒããŠå°giã®äººæ°ãå£ã£ãŠããã«ãããããããããã¯æå°ã®åé¡ã§ããããšãå€æããŸããã
ãŠã§ãäžã«ã¯playok.comããããä»ã®ãã¬ã€ã€ãŒãšããŸããŸãªããŒãã²ãŒã ãç¡æã§ãã¬ã€ããæ©äŒãæäŸããŠããŸãã æäŸãããã²ãŒã ã®äžã«ã¯å°areããããŸãã ããã«ããã®ãµã€ãã§ãã¬ã€ããããã¹ãŠã®ã²ãŒã ã¯kifu圢åŒã§ä¿åããããããªãã¯ãã¡ã€ã³ã«ãããããå¿ èŠãªæ°ã®ã²ãŒã ãããŠã³ããŒãããç°¡åãªã¹ã¯ãªãããäœæã§ããŸãã
ãã®ãµã€ãã«ä¿åãããŠããã²ãŒã ã®æ°ã¯éåžžã«å€ãïŒæ°çŸäžïŒã®ã§ãã²ãŒã ãšã ãŒãã®ãã©ã¡ãŒã¿ãŒã®ããŒã«ã«ã¹ãã¬ãŒãžçšã®ããŒã¿ããŒã¹ãäœæããããšã«ããŸããã
ããŒã¿ããŒã¹ãæäœããããã»ã¹ã§ã¯ãããŒãã£çªå·ããšã®ç§»åãååŸããããã«å€æ°ã®æäœãå¿ èŠã«ãªãããããã®ãããªããŒã¿ãä¿åããã¿ã¹ã¯ã¯ããã»ã©ç°¡åã§ã¯ãããŸããã
ã€ãŸã SQLã®å Žåãæ°çŸäžè¡ãå«ãããŒãã«ããæ°åè¡ã®éžæã
MongoDBãªã©ã®NoSQLããŒã¿ããŒã¹ã䜿çšããå¯èœæ§ãæ€èšããŸããã NoSQLã®å Žåããã®ãããªæäœã¯åçŽãªãã€ã³ã¿ãŒãžã£ã³ãã«èŠçŽãããŸãã ãã®NoSQLã®å©ç¹ã«ãããããããçŸåšã®å®è£ ã§ã¯PostgreSQLã䜿çšãããŠããã移åããŒãã«ã«ã¯ãããçªå·ã«ããã€ã³ããã¯ã¹ããããŸãã
playok.comããããããããŠã³ããŒãããŠããŒã¿ããŒã¹ã«å ¥åããã¹ã¯ãªãããããã³ããŒã¿ãæºåããã¹ã¯ãªããïŒã€ãŸããå®è¡æéãéèŠã§ã¯ãªãé¢æ°ïŒã¯ãRubyã§èšè¿°ãããŠããŸãã ãã®èšèªã¯ãé«éã®ã³ãŒãèšè¿°ãæäŸããããŒã¿ããŒã¹ãæäœããããã«å¿ èŠãªãã¹ãŠã®ã³ã³ããŒãã³ããåããŠããŸãã ãœãŒã¹ã³ãŒããžã®ãªã³ã¯ã¯ãèšäºã®æåŸã«èšèŒãããŠããŸãã
åãã®èª¬æã«ã€ããŠ
æ©æ¢°åŠç¿ææ³ã®é©çšãå¯èœã«ããã«ã¯ãäžé£ã®æ©èœã䜿çšããŠååããèšè¿°ããå¿ èŠããããŸãã å¥åŠã«æãããããããŸãããããã®ãããªèšè¿°ã¯ãªããžã§ã¯ãã®æ©èœèšè¿°ãšåŒã°ããŸãã
ç¹æ§èšè¿°ã¯å€ã®ãã¯ãã«ã§ãããå€ã®ãã¯ãã«ã¯å±æ§ç©ºéå ã®ãã€ã³ãã®åº§æšã§ãã
ããšãã°ãããã¯ã¹ã®å¯žæ³ãšééã¯ã説æãšããŠåœ¹ç«ã€å ŽåããããŸãã ãããã£ãŠã2 x 3 x 1ã¡ãŒãã«ã§ééã10ããã°ã©ã ã®ç®±ã«ã¯ãæšèã®4次å 空éã«ç¹åŸŽã®èª¬æïŒ2,3,1,10ïŒããããŸãã
ç°ãªãåœäºè ã®æå®ã«ããåãåãïŒe2e4ïŒãå察ã®çµæã«ã€ãªããå¯èœæ§ããããšããäºå®ã®ãããåãã®ç¹åŸŽçãªèª¬æã«ããŒãäžã®ä»ã®äººç©ã®äœçœ®ã«é¢ããæ å ±ãå«ãæšèãå«ããå¿ èŠããããŸãã
æšèã®å Žåããã¬ãŒãã³ã°ã»ããã§ã¯é»ãšçœã®äž¡æ¹ã®åããè¯ããããåããããéšåã®è²ã«é¢ããäžå€æ§ã芳å¯ããå¿ èŠããããŸãã ããšãã°ã移åã®æ°Žå¹³æ¹åã®æ°ã¯ãéå§äœçœ®ãŸã§ã®æ°Žå¹³ç·ã®æ°ã«çœ®ãæããæ¹ãé©åã§ãïŒãã®å Žåãé»ã¯æ°Žå¹³9ããå§ãŸããçœã¯æ°Žå¹³1ããå§ãŸããšèããããŠããŸãïŒã
䜿çšãããç¹æ§èšè¿°ã®ããªã¢ã³ãã¯ã以äžã®ãã©ã¡ãŒã¿ãŒã§æ§æãããŠããŸãã
é·ããªã¹ã
- åããã£ã®ã¥ã¢ã®éã
- é£ã¹ã人ç©ã®äœéïŒããã§ãªãå Žåã¯0ïŒ
- éå§äœçœ®ãã移åãè¡ãããäœçœ®ãŸã§ã®æ°Žå¹³ã®é
- 移åå ã®åçŽç·ã®çªå·
- éå§äœçœ®ãã移åããäœçœ®ãŸã§ã®æ°Žå¹³æ¹åã®æ°
- 移åãè¡ãããåçŽã®çªå·
- å³ãå転ããŸããïŒ1/0ïŒ
- æ»æãããç Žçã®ç·éé
- æ匷æ»æãã£ã®ã¥ã¢ã®éé
- æ»æããã人ç©ã®éã¿ã®ç®è¡å¹³å
- æ»æãããæ匱ã®äººç©ã®äœé
- 移åå ã®äœçœ®ãæ»æããçžæã®ããŒã¹ã®ç·éé
- 移åå ã®äœçœ®ãæ»æããŠããæ匷ã®æµã®é§ã®éé
- 移åå ã®äœçœ®ãæ»æããçžæã®ããŒã¹ã®å¹³åéé
- 移åå ã®äœçœ®ãæ»æããŠããæã匱ãçžæã®é§ã®éé
- æ°ããäœçœ®ãæ»æããŠããæµã®é§ã®ç·éé
- æ°ããäœçœ®ãæ»æããæ匷ã®æµã®é§ã®éé
- æ°ããäœçœ®ãæ»æããŠããæµã®é§ã®å¹³åéé
- æ°ããäœçœ®ãæ»æããŠããæã匱ãæµãã£ã®ã¥ã¢ã®éé
- æ°ããããŒã¹ãæ»æããããŒã¹ã®æ°
- éå§äœçœ®ãä¿è·ãããã£ã®ã¥ã¢ã®ç·éé
- éå§äœçœ®ãå®ãæ匷ã®ããŒã¹ã®éé
- éå§äœçœ®ãä¿è·ãããã£ã®ã¥ã¢ã®å¹³åéé
- éå§äœçœ®ãå®ããã®æ°åã®æã匱ãã®éé
- æ°ããäœçœ®ãå®ãæ°åã®ç·éé
- æ°ããããžã·ã§ã³ãå®ãæ匷ã®ãã£ã®ã¥ã¢ã®éé
- å ã®æ°ãããä¿è·ãã圌ãã®äœåã®å¹³åéé
- æ°ããããžã·ã§ã³ãå®ã圌ã®æã匱ã人ç©ã®äœé
- æ°ããå°äœãå®ãæ°åã®æ°
- æ°ããäœçœ®ã«ããæµã®çãŸã§ã®æ°Žå¹³è·é¢
- æµã®çãŸã§ã®åçŽè·é¢
- 圌ã®çãŸã§ã®æ°Žå¹³è·é¢
- 圌ã®çãŸã§ã®åçŽè·é¢
- ãããçªå·
åé¡ã¢ã«ãŽãªãºã ã®éžæã«ã€ããŠ
åé¡ã®èšè¿°ã¯ãåããææãªãã®ãšããã§ãªããã®ïŒè¯ããã®ãšæªããã®ïŒã«åé¡ããããšãæå³ããŸãããã¢ã«ãŽãªãºã ã«ã¯ããã€ãã®è¿œå æ¡ä»¶ã課ãããŸãã
- åããæé«ããæäœã«ã©ã³ã¯ä»ãããããšãå¯èœã§ããã¹ãã§ãã
- ããªãŒã衚瀺ããå段éã§åé¡ïŒããã³ãœãŒãïŒãè¡ãå¿ èŠããããããé«éã確ä¿ããå¿ èŠããããŸãã
åé¡ã¢ã«ãŽãªãºã ã®äžã§ã¯ã æè¿åæ³ãã¿ã¹ã¯ã«é©ããŠããŸãã
ãã®æ¹æ³ã¯ãå±æ§ç©ºéã§åé¡ããããªããžã§ã¯ãã«æãè¿ãã¯ã©ã¹ã®ãªããžã§ã¯ãã誰ã§ããããå€æããããšã§æ§æãããŸãã
ãã®æ¹æ³ã¯ãæ€èšäžã®2ã€ã®åãã®ãã¡ã©ã¡ããè¯ãããèªç¶ã«æ±ºå®ãããããåªããŠããŸãã ãããè¡ãã«ã¯ãè·é¢ãæãè¿ãé£äººãšæ¯èŒããã ãã§ååã§ãã
ãã ãããã®æ¹æ³ã«ã¯é倧ãªæ¬ ç¹ããããŸããæãè¿ããªããžã§ã¯ããèŠã€ãã£ããšäž»åŒµããåã«ãå€æ°ã®ãªããžã§ã¯ãããã§ãã¯ããå¿ èŠããããŸãã
ãã®åé¡ã解決ãã1ã€ã®æ¹æ³ã¯ãã¯ã©ã¹ã¿ãªã³ã°ã䜿çšããããšã§ãã
éå§ç¹ã®ã»ãããã¯ã©ã¹ã¿ãŒã®äžå¿ã§ããç¹ã®ã»ããã§çœ®ãæãããšããªããžã§ã¯ãã®åé¡ã«å¿ èŠãªæäœã®æ°ãå€§å¹ ã«åæžãããŸãã ãã®ãããªçœ®æã¯æããã«åé¡ã®å質ãäœäžãããåºåã»ããã«ããã¯ã©ã¹ã¿ãŒãå°ãªãã»ã©å質ãäœäžããŸãã ãããã£ãŠãã¯ã©ã¹ã¿ãŒã®æ°ã¯ã粟床ãšé床ã®éã®åŠ¥åãåæ ããå€ã§ãã
åãã®éžæã«ã€ããŠ
åœäºè ã®åŠçã«é²ãåã«ãã©ã®åããè¯ããšèŠãªãããã©ã®åããç§ãã¡ã®ããŒã¹ãšããŠæªããšå€æããå¿ èŠããããŸãã ããã€ãã®ãªãã·ã§ã³ãããã«æãæµ®ãã³ãŸãïŒ
- ç©è³ªçãªåªäœæ§ããããããåãã
- ãããã«ã€ãªãã£ãåãã
- é«è©äŸ¡ã®ãã¬ãŒã€ãŒã移åããŸãã
å°ãèããŠã¿ããšãæåãš2çªç®ã®ãªãã·ã§ã³ãè¯ãããšãä¿èšŒãããŠããªãããšãæããã«ãªããŸãã
第äžã«ã匷ã人ç©ã®ç ç²è ããã®åŸç ç²è ãåãå ¥ãããã¬ãŒã€ãŒã®æ倱ã«ã€ãªãããã¬ãŒã€ãŒãããç¶æ³ãããããã§ãã
第äºã«ãè² ããŠãããã¬ã€ã€ãŒã®äžæ³šæã®ããã«ãã§ãã¯ã¡ã€ãã眮ãããšãã§ããŸããããã¯éåžžã«é »ç¹ã«èµ·ãããŸãã
ã¬ãŒãã£ã³ã°ãé«ããã¬ãŒã€ãŒãã²ãŒã ã«åã£ãå Žåã圌ã¯æçœã«æããªåããããªãã£ããšèšãããšãã§ããŸãïŒããã³ã¯ååãªã¬ãã«ã§æåã«ã€ãªããããšãä¿èšŒãããŠããŸãïŒãç§ãã¡ã®ã¿ã¹ã¯ã¯ãç¹å®ã®ç¶æ³ã§çµ¶å¯Ÿã«æ£ç¢ºãªåãã確ç«ããªãããšã§ãããœãŒãã¯å¹³åããŠå質ã§ç§»åããŸãã
äžèšã®è°è«ã«åºã¥ããŠãç§ãã¡ã¯åé¡ã解決ããããã«åœå±ãä¿¡é Œããå¿ èŠããããšèããŠããŸãã
çŸåšã®å®è£ ã§ã¯ã移åã¯æ¬¡ã®ããã«éžæãããŸãã
- äžéãšäžéã®è©äŸ¡ãããå€ãèšå®ãããŸãã
- åè ã®è©äŸ¡ãäžéã®ãããå€ããé«ãåã²ãŒã ã§ãåè ã®åãã®æåŸã®2/3ãéžæãããè¯å¥œãšããŠããŒã¯ãããŸãã
- è©äŸ¡ãäžéãããå€ä»¥äžã®åã²ãŒã ã§ã¯ãæè ã®æåŸã®2/3ã®åããéžæãããæªããšããŒã¯ãããŸãã
æåã®åãã®ã¹ã¯ãªãŒãã³ã°ã¯ãããŒãã£ãŒã®ããã¥ãŒã«ã¯ä»ã®ããå¹æçãªã¢ã«ãŽãªãºã ãããããã®èæ ®ã¯èšäºã®ç¯å²ãè¶ ããŠãããšããäºå®ã«ãã£ãŠæ£åœåãããŸãã
ã¯ã©ã¹ã¿ãªã³ã°ã«ã€ããŠ
ã²ãŒã ããªãŒã衚瀺ããåã¹ãããã§å®è¡ããå¿ èŠã®ããåé¡ãšã¯å¯Ÿç §çã«ããã®å Žåãã¯ã©ã¹ã¿ãªã³ã°ã«å¯ŸããèŠä»¶ã¯ããã»ã©å³ãããããŸããã
ãŸããã¯ã©ã¹ã¿ãªã³ã°ã¯1åã ãè¡ãå¿ èŠããããŸããããã«ãããã²ãŒã ã®æç¹ã§å¿ èŠãªæéãããå€ãã®æéãå¿ èŠãšããã¢ã«ãŽãªãºã ã䜿çšããæš©å©ãäžããããŸãã
ã¯ã©ã¹ã¿ãªã³ã°ã¿ã¹ã¯èªäœã¯æ確ã«å®åŒåãããŠããªãããã解éã®å€ãã®ãªãã·ã§ã³ãæäŸãããŸãã 次ã®å®çŸ©ã䜿çšããŸãã
ã¯ã©ã¹ã¿ãªã³ã°ãšã¯ãã¯ã©ã¹ã¿ãŒå ã®ãªããžã§ã¯ãéã®è·é¢ãæå°åããã¯ã©ã¹ã¿ãŒéã®è·é¢ãæ倧åãããããªæ¹æ³ã§ããªããžã§ã¯ãã®ã»ãããäºãã«çŽ ãªã»ããïŒã¯ã©ã¹ã¿ãŒïŒã«åå²ããããšã§ãã
æ£åŒã«ã¯ããã®å®çŸ©ã¯æ¬¡ã®ããã«èšè¿°ã§ããŸãã

ããã§ã K y-çªå·yã®ã¯ã©ã¹ã¿ãŒ
pïŒxãyïŒã¯ãæå®ãããã¡ããªãã¯ã§è·é¢ã決å®ããé¢æ°ã§ã
ÎŒyã¯ãçªå·yã®ã¯ã©ã¹ã¿ãŒã®äžå¿ã§ãã
x i-çªå·iã®ãªããžã§ã¯ã
ç§ã®å®è£ ã§ã¯ãk-meansã¯ã©ã¹ã¿ãªã³ã°ã¢ã«ãŽãªãºã ã䜿çšããŸãã;詳现ãªèª¬æã¯ãããšãã°Wikipediaã«ãããŸãã
ã¢ã«ãŽãªãºã ã®ç¹åŸŽã¯ãã¯ã©ã¹ã¿ãŒãžã®åæããŒãã£ã·ã§ã³ãšããŠã©ã³ãã ãªå€ã䜿çšããããšã§ãããã®éžæã¯ãããã«ããŒãã£ã·ã§ã³åã®çµæã«åŒ·ã圱é¿ããŸããããã«ãããããè¯ãçµæãéæããããã«ã¯ã©ã¹ã¿ãªã³ã°ãç¹°ãè¿ãå®è¡ããããšãå¯èœã«ãªãããã®æ®µéã§ã®å®è¡æéã«å¶éãããŸããã
ããšãã°ã2次å 空éã§ã®ã©ã³ãã ãã€ã³ãã®ã¯ã©ã¹ã¿ãªã³ã°ã¯æ¬¡ã®ããã«ãªããŸãã

Rubyã®å®è£
def midle(cluster) # "" res = [0]*cluster[0].size(); cluster.each do |e| i = 0; e.each do |x| res[i] += x; i+=1; end end res.map! {|x| x/cluster.size.to_f} return res; end def dist(x1,x2) if(x1.size != x2.size) raise "WrongSizeException"; end mode = 1 if mode ==1 then # dist = 0; for i in 0..x1.size-1 dist += (x1[i]-x2[i])**2 end return dist; end if mode == 2 then # dist = 0; x1_s = 0; x2_s = 0; for i in 0..x1.size-1 dist += x1[i]*x2[i] x1_s += x1[i]**2; x2_s += x2[i]**2; end dist =1 - dist / Math.sqrt(x1_s) / Math.sqrt(x2_s) end end def quality1 (clusters) # ( , - ) sum = 0; clusters.each do |cluster| center = midle(cluster) local_sum = 0 cluster.each do |vector| local_sum += dist(vector, center); end sum += local_sum / cluster.size.to_f; end return sum; end def quality2 (clusters) # centers = []; clusters.each do |cl| centers += [midle(cl)]; end sum = 0 centers.each do |c1| centers.each do |c2| sum += dist(c1,c2) end end return sum; end def quality (clusters) # return quality1(clusters)/quality2(clusters); end def find_nearest(vectors, point) min = Float::INFINITY imin = 0 i = 0 vectors.each do |vector| d = dist(vector, point) if(d < min) then min = d; imin = i; end i += 1; end return imin end def k_means(vectors, k) len = vectors.size; clusters = []; centers_index = []; if len < k then raise "count of clusters more than objects"; end while centers_index.size != k do # k centers_index = (1..k).map { Random.rand(len)}; # k centers_index.uniq! end centers = centers_index.map{ |e| vectors[e] } clusters_new = [] begin # clusters = clusters_new; clusters_new = k.times.map {[]}; vectors.each do |vector| clusters_new[find_nearest(centers, vector)] += [vector]; end # centers = []; clusters_new.each do |cluster| return nil if cluster == nil; # , - return nil if cluster.size == 0; centers += [midle(cluster)] end end until clusters_new == clusters return clusters_new end
ã¯ã©ã¹ã¿ãªã³ã°ã®çµæãšããŠãç¹åŸŽç©ºéã§ã®è¯ãåããšæªãåãã®ã¯ã©ã¹ã¿ãŒã®äžå¿ã§ããN ïŒç§ã¯N = 20ãéžæããŸããïŒãã€ã³ããååŸããŸãã
ãããã®ãã€ã³ããŸã§ã®è·é¢ã¯ã衚瀺ã®åãã®é åºã䞊ã¹æ¿ãããšãã«äœ¿çšãããŸãã
åé¡ã«ã€ããŠ
å ã®ããŒã¹ã«æ¯ã¹ãŠãã€ã³ãã®æ°ãå€§å¹ ã«å°ãªããªã£ãã®ã§ããããã®ãã€ã³ããžã®è¿æ¥åºŠã«åºã¥ããŠäžŠã¹æ¿ããé©çšã§ããŸãã
åã®æ®µéãšåæ§ã«ãéžæã®äœå°ããããŸãã ã€ãŸããã¯ã©ã¹ã¿ãŒãŸã§ã®è·é¢ãèšç®ãããã¡ããªãã¯ã®éžæã
ç¹ã®åº§æšéã®çžé¢ãèæ ®ããŠãéåžžã®ãŠãŒã¯ãªããã¡ããªãã¯ãšããã©ããã¹ã¡ããªãã¯ã®äž¡æ¹ãé©çšã§ããŸãã
æ確ã«ããããã®åçïŒ
2次å 空éã®ãŠãŒã¯ãªããã¡ããªãã¯ã
2次å 空éã§ã®ããã©ããã¹ã¡ããªãã¯ã æ¥åã¯å€ã®åæ£ã瀺ããŸãã

2次å 空éã®ãŠãŒã¯ãªããã¡ããªãã¯ã

2次å 空éã§ã®ããã©ããã¹ã¡ããªãã¯ã æ¥åã¯å€ã®åæ£ã瀺ããŸãã
ã©ã®ã¡ããªãã¯ãåªããŠãããã©ã®ãã©ã¡ãŒã¿ãå¥ã®éåžžã«é£ãã質åã§ããã®ã§ãæåã¯åçŽãªããŒãžã§ã³ã§ãããŠãŒã¯ãªããã¡ããªãã¯ã«çŠç¹ãåœãŠãŸãã
移åã®äžŠã¹æ¿ãã«äœ¿çšããå€ã¯ã次ãéžæããŸãïŒ ïŒïŒæªã移åã®æãè¿ãã¯ã©ã¹ã¿ãŒãŸã§ã®è·é¢ïŒ-ïŒè¯ã移åã®æãè¿ãã¯ã©ã¹ã¿ãŒãŸã§ã®è·é¢ïŒïŒ ã
ãããã£ãŠã瀺ããã移åã®å€ã倧ããã»ã©ãã²ãŒã ããªãŒãæ§ç¯ãããšãã«ãããããæ©ãèæ ®ããå¿ èŠããããŸãã
ä»ã®åŒã䜿çšããŠãã³ãŒã¹ã®æšå®å€ãããšãã°ãè¯ãåãã®ã¯ã©ã¹ã¿ãŒãŸã§ã®å¹³åè·é¢ãªã©ãååŸããããšãã§ããŸãã
Javaå®è£
ã®äžéš
public static double euclidian(ArrayList<Double> p1, ArrayList<Double> p2) { Double sum = 0.0; for (int i = 0; i < p1.size(); i++) { sum += (p1.get(i) - p2.get(i)) * (p1.get(i) - p2.get(i)); } return sum; } public static double getMinDist(ArrayList<Double> point, ArrayList<ArrayList<Double>> clusters) { Double min = Double.MAX_VALUE; for (ArrayList<Double> cluster : clusters) { min = Math.min(min, euclidian(cluster, point)); } return min; } private void sortMoves(CMovesList movesList) { // ( ) - ( ) for (CMove move : movesList.Moves) { ArrayList<Double> move_params = CDataMining.getFeature(localBoard, move).toArray(); // // Double good_dist = CAdviser.getMinDist(move_params, clusters_good); // Double bad_dist = CAdviser.getMinDist(move_params, clusters_bad); move.H = bad_dist - good_dist; } movesList.sortH(); } /** * - * * @param color * @param D * @param A * @param B * @return */ public int AB(boolean color, int D, int A, int B) { ABtimes++; if ((D == 0) || Math.abs(localBoard.Evaluate(color)) >= 15000) return localBoard.Evaluate(color); CMovesList ML; ML = localBoard.getAllMoves(color); if (D == MaxD) { // sortMoves(ML); // < ----- . } else { ML.sortH(); } while ((ML.getMovesCount() > 0) && (A < B)) { CMove Move = ML.getMoveByIndex(0); CFigure previousFigure = localBoard.makeMove(Move); int tmp = -AB(!color, D - 1, -B, -A); localBoard.unmakeMove(Move, previousFigure); if (tmp > A) { A = tmp; if (D == MaxD) BestMove.cp(Move); } ML.removeByIndex(0); } return A; }
çµæ
説æããæ¹æ³ã®æå¹æ§ãè©äŸ¡ããäž»ãªåºæºã¯ãã¢ã«ãã¡ããŒã¿ã¯ãªããã³ã°ããã·ãŒãžã£ã®ååž°åŒã³åºãã®æ°ã§ããããã®åºæºã¯å®è£ ã«äŸåããªããããæã客芳çã§ããããã§ãã
å®éšã«ããããã®æ¹æ³ã®æå¹æ§ã¯ããŒãäžã®ç¶æ³ã«å€§ããäŸåããããšã瀺ãããŠããŸãã åé¡åšã¯å®éã®ã²ãŒã ã§èšç·ŽãããŠãããããããã¯é©ãããšã§ã¯ãããŸããããããã£ãŠã人工çã«æ§ç¯ãããåé¡ã解決ããå¹æã¯ãæ»æãããããŒã¹ã®ééã§åãããœãŒãããåçŽãªãã¥ãŒãªã¹ãã£ãã¯ã®å Žåãããããªãäœããªãå¯èœæ§ããããŸãã
äœæ¥äŸïŒãããããããããããçµæã¯BCDGamesããã°ã©ã ã䜿çšããŠè¡šç€ºãããŸãïŒïŒ
æ倧ã¬ã³ããªã³ã°æ·±åºŠïŒ4ããŒããã¹ã
å®éã®ãããããååŸããã©ã³ãã ãªäœçœ®ã
åçŽãªãã¥ãŒãªã¹ãã£ãã¯ïŒ
ååž°åŒã³åºãã®æ°-22027
æåã®æ©æ¢°åŠç¿ã䜿çšãããã¥ãŒãªã¹ãã£ãã¯ããã®åŸã®ç§»å-åçŽãªãã¥ãŒãªã¹ãã£ãã¯ïŒ
ååž°åŒã³åºãã®æ°-18719
æ§ç¯ãããããªãŒã§ã¯ãæ倧深床ã§ã®ã²ãŒã ã®ã¬ãŒãã£ã³ã°ãåãã§ãããããè¡ãããåãã¯ç°ãªããŸãã
åçŽãªãã¥ãŒãªã¹ãã£ãã¯ïŒ
ååž°åŒã³åºãã®æ°-32561
æåã®æ©æ¢°åŠç¿ã䜿çšãããã¥ãŒãªã¹ãã£ãã¯ããã®åŸã®ç§»å-åçŽãªãã¥ãŒãªã¹ãã£ãã¯ïŒ
ååž°åŒã³åºãã®æ°-28524
ããŒãäžã«å°æ°ã®ããŒã¹ããããæã«ããã€ãã®ããŒã¹ããã人工çãªç¶æ³ã
ïŒã«ããŒã®è¡šç€º-3ããŒããã¹ïŒ
åçŽãªãã¥ãŒãªã¹ãã£ãã¯ïŒ
ååž°åŒã³åºãã®æ°-379376
æåã®æ©æ¢°åŠç¿ã䜿çšãããã¥ãŒãªã¹ãã£ãã¯ããã®åŸã®ç§»å-åçŽãªãã¥ãŒãªã¹ãã£ãã¯ïŒ
ååž°åŒã³åºãã®æ°-541866
ã芧ã®ããã«ãããŒãäžã§äººçºçã«çæãããç¶æ³ã®å Žåãäºæ³ã©ããã®æ©æ¢°åŠç¿ãã¥ãŒãªã¹ãã£ãã¯ã¯ãåçŽãªãã¥ãŒãªã¹ãã£ãã¯ã«æ¯ã¹ãŠå¹çãäœäžããŸãã
å®éã®ãããããååŸããã©ã³ãã ãªäœçœ®ã

åçŽãªãã¥ãŒãªã¹ãã£ãã¯ïŒ
ååž°åŒã³åºãã®æ°-22027

æåã®æ©æ¢°åŠç¿ã䜿çšãããã¥ãŒãªã¹ãã£ãã¯ããã®åŸã®ç§»å-åçŽãªãã¥ãŒãªã¹ãã£ãã¯ïŒ
ååž°åŒã³åºãã®æ°-18719

æ§ç¯ãããããªãŒã§ã¯ãæ倧深床ã§ã®ã²ãŒã ã®ã¬ãŒãã£ã³ã°ãåãã§ãããããè¡ãããåãã¯ç°ãªããŸãã

åçŽãªãã¥ãŒãªã¹ãã£ãã¯ïŒ
ååž°åŒã³åºãã®æ°-32561

æåã®æ©æ¢°åŠç¿ã䜿çšãããã¥ãŒãªã¹ãã£ãã¯ããã®åŸã®ç§»å-åçŽãªãã¥ãŒãªã¹ãã£ãã¯ïŒ
ååž°åŒã³åºãã®æ°-28524

ããŒãäžã«å°æ°ã®ããŒã¹ããããæã«ããã€ãã®ããŒã¹ããã人工çãªç¶æ³ã
ïŒã«ããŒã®è¡šç€º-3ããŒããã¹ïŒ

åçŽãªãã¥ãŒãªã¹ãã£ãã¯ïŒ
ååž°åŒã³åºãã®æ°-379376

æåã®æ©æ¢°åŠç¿ã䜿çšãããã¥ãŒãªã¹ãã£ãã¯ããã®åŸã®ç§»å-åçŽãªãã¥ãŒãªã¹ãã£ãã¯ïŒ
ååž°åŒã³åºãã®æ°-541866

ã芧ã®ããã«ãããŒãäžã§äººçºçã«çæãããç¶æ³ã®å Žåãäºæ³ã©ããã®æ©æ¢°åŠç¿ãã¥ãŒãªã¹ãã£ãã¯ã¯ãåçŽãªãã¥ãŒãªã¹ãã£ãã¯ã«æ¯ã¹ãŠå¹çãäœäžããŸãã
ã¡ãœããã®æ¬ ç¹
- é·ãéã
æãè¿ããã€ã³ããèšç®ããããã»ã¹ã§ã¯ãå®æ°ã«ããæŒç®ã䜿çšãããã²ãŒã ããªãŒã®è¡šç€ºæéãå€§å¹ ã«å¢å ããŸãã
- éãããã¢ããªã±ãŒã·ã§ã³ã
äžèšã®ããã«ãç¶æ³ã«ãã£ãŠã¯ãæ©æ¢°åŠç¿æ³ã¯åçŽãªãã¥ãŒãªã¹ãã£ãã¯ãããæªãçµæãããããå ŽåããããŸãã
æ¹åããå¯èœãªæ¹æ³
ããšãã°ã ãã³ããã¿ã³è·é¢ã䜿çšããŠãæææäœãåãé€ãããšãã§ããŸãã
ã¯ã©ã¹ã¿ãŒã®æ°ãæžããããšã«ãããéèŠãªãã©ã³ã¶ã¯ã·ã§ã³ã®æ°ãæžããããšãã§ããŸãã ãã®ãããªåæžã¯ç²ŸåºŠã®äœäžã«ã€ãªããããã®çµæãã¢ã«ãã¡ããŒã¿ã¯ãªããã³ã°ã¢ã«ãŽãªãºã ã®ããã©ãŒãã³ã¹ãäœäžããåäœæéãé·ããªããŸãã ãããã£ãŠãçæ³çã«ã¯ããã®ãã©ã¡ãŒã¿ãŒã®æé©ååé¡ã解決ããå¿ èŠããããŸãã
æ©æ¢°åŠç¿ã®ãã¥ãŒãªã¹ãã£ãã¯ã®é©çšå¯èœæ§ã®åé¡ã解決ããããã«ã次ã®æ¹åãå¯èœã§ãã
- ããŒãäžã®ç¶æ³ã®ã³ã³ããã¹ãã§ã®åãã®æ€èšãããã«ã¯ãæ°åã®çžäºäœçšã®ã°ã©ãã®æ§ç¯ãšããã®ã°ã©ãã®æ å ±ãåãã®ãã©ã¡ãŒã¿ãŒã«è¿œå ããããšãå«ãŸããŸãã
- ããŒãäžã®ããŸããŸãªçš®é¡ã®ããžã·ã§ã³ã«ç°ãªãã¯ã©ã¹ã¿ãŒãªãã·ã§ã³ãäœæãïŒæ»ææŠç¥ã®å Žåãé²åŸ¡æŠç¥ã®å Žåãªã©ãããŒã¹ã®æ°ã«å¿ããŠïŒãã²ãŒã ã®ç¶æ³ã«å¿ããŠ1ã€ãŸãã¯å¥ã®ã¯ã©ã¹ã¿ãŒã»ãããé©çšããŸãã
åèæç®ãšæç®
- æ©æ¢°åŠç¿ã«ã€ããŠã¯ãK.VãVorontsovã«ããçŽ æŽãããè¬çŸ©ã³ãŒã¹ããããŸããããããã䜿çšãããæ¹æ³ã«é¢ããæ å ±ãåŸãŸããã 圌ã®è¬çŸ©ã¯æè¿Habrã«æçš¿ãããŸããã
- Javaã§èšè¿°ããããããèªäœã®ãããªããžããªïŒ https : //github.com/gorkoff/Shogi/tree/DataMining
- Rubyã¹ã¯ãªããããµããŒããããªããžããªïŒ https : //github.com/generall/ScriptsForShogi
ãæž èŽããããšãããããŸããã