ããã«ã¡ã¯ãHabrïŒ ãã€ãŠãç§ã¯äžåŠçãšããŠãæé©åçè«ãšæé©ãªéç·åœ¢ååŠç³»ã®åæã®åéã§ç ç©¶ãå§ããŸããã ã»ãŒåææã«ããã®åéãæ®åããã圌ãã®çµéšãèãã人ã
ãšå
±æããããšããèŠæããããŸããã ããã®ç¢ºèªã¯ãHabréã«é¢ããç§ã®
åäŸãã¡ã®æªçãªèšäºã®ããã€ãã§ãã ããããåœæããã®èãã¯ç§ã«ãšã£ãŠå§åçã§ããã ãããããç§ã®ä»äºãçµéšã®æµ
ããæ¹å€ãã¢ããã€ã¹ã§ä»äºãããããšãã§ããªãããŸãã¯äœãä»ã®ãã®ã®ããã«ã çç±ãç¡éã«èŠã€ããããšããããšã¯ã§ããŸãããç¶æ³ã¯å€ãããŸããããã®ã¢ã€ãã¢ãæ£ã«æããŠããããŸã§å®å
šã«çœ®ããŠã»ãããæããŸããã
å°éãçµããŠè«æãå®ãæºåãããåŸãè«ççãªè³ªåãããŸããããæ¬¡ã¯äœã§ããïŒãã»ããã®äžã ããããç§ã¯ããæèçãªåœ¢ã§ãã®èãã«æ»ããŸããã
ç§ã¯ã8幎åããåãçµãã§ããæ¥çã«é¢é£ãããœãããŠã§ã¢ã®éçºãšãæé©åææ³ãæ©æ¢°åŠç¿ãªã©ã®å人çãªåŠåçãã€ã¢ã¹ã®éçºãéå§ããããšã«ããŸããã

ããŠãèå³ã®ããæ¹ãžïŒ
åæ¥èšŒæžïŒããã³ãã®åŸã®è«æïŒã®ãœãããŠã§ã¢ã®å®è£
ã«æºãã£ãŠããã®ã§ããã®åé¡ã«ãæ£é¢ãããåãçµã¿ãŸãããã·ã¹ãã ã®æè»æ§ãäœæã®å®¹æããæ°ã«ããŸããã§ããã ããã§çµæãååŸããããšããæ¬²æ±ã¯ãçµéšäžè¶³ãšçžãŸã£ãŠãã³ãŒããçµ¶ããæžãçŽããªããã°ãªããªããšããäºå®ã«ã€ãªãããŸããããããã¯ãã¡ããå°éçãªéçºã«ãã©ã¹ã®åœ±é¿ãäžããŸããã§ããã ãã§ã«ç§ã¯ãç§ãã©ã®ããã«æãã§ããåé¡ã解決ããããã«çã£åããæ¥ãããšã¯ã§ããªãããšãçè§£ããŠããŸãã ãã®æ¬è³ªãæãäžããæ¢åã®ç¥èãè©äŸ¡ããäžè¶³ããŠãããã®ãçè§£ãããµããžã§ã¯ãé åã®æŠå¿µãã¯ã©ã¹ãã€ã³ã¿ãŒãã§ãŒã¹ãããã³æœè±¡åãšæ¯èŒããå¿
èŠããããŸãã ã€ãŸããå©çšå¯èœãªåèµéãå®çŸãããœãããŠã§ã¢ã¢ããªã±ãŒã·ã§ã³ã®ã¢ãŒããã¯ãã£ã®èšèšã«é©åã«ã¢ãããŒãããå¿
èŠããããŸãã
ãæ³åã®ãšããããã®èšäºã¯å°æ¥ã®ã¢ããªã±ãŒã·ã§ã³ã®æåã®èŠçŽ ã®éçºãšèª¬æã«å°å¿µããŸãã
éçºã¢ãããŒãã®å®çŸ©ãšäž»ãªã¿ã¹ã¯ã®å®åŒå
Habréã«ã¯ããœãããŠã§ã¢éçºæ¹æ³è«ã«é¢ããèšäºã倿°ãããŸãã ããšãã°ã
ããã¯äž»ãªã¢ãããŒããéåžžã«æç¢ºã«èª¬æããŠããŸãã ããããã«ã€ããŠèª¬æããŸãããã
- ããŠã©ãŒã¿ãŒãã©ãŒã«ã¢ãã«ã -å°ãªããšãèŠä»¶ãæç¢ºã«å®çŸ©ãããŠããªããããé©åã§ã¯ãããŸããããã®åŸãçžäºäœçšã確ç«ããå¿
èŠãããäžé£ã®ã¢ã€ãã¢ããããŸãã
- ãVã¢ãã«ã -åãçç±ã§é©åããªã
- ãã€ã³ã¯ãªã¡ã³ã¿ã«ã¢ãã«ãã¯ä»¥åã®ã¢ãã«ãããé©åãªã¢ãã«ã§ãããããã§ã詳现ãªåœ¢åŒåãå¿
èŠã§ãã
- ãRADã¢ãã«ã -çµéšè±å¯ãªå°éå®¶ã®ããŒã ã«ããé©ããã¢ãã«ã
- ãã¢ãžã£ã€ã«ã¢ãã«ã -èŠä»¶ãæå®ããå¿
èŠããªããšããåºæºãããã³éçºããã»ã¹ã®æè»æ§ã«å®å
šã«é©åããŠããã
- ãå埩ã¢ãã«ã -ä»äºã¯ç®æšã®æç¢ºãªå®çŸ©ã®å¿
èŠæ§ã瀺ããŠãããšããäºå®ã«ãããããããã€ããªãã®ãŒçã«ããã®ãããªã¢ãã«ã¯è¿ãããã§ãïŒãäž»ãªã¿ã¹ã¯ãå®çŸ©ããå¿
èŠããããŸãããå®è£
ã®è©³çŽ°ã¯æéãšãšãã«é²åããå¯èœæ§ããããŸããïŒã
- ãã¹ãã€ã©ã«ã¢ãã«ã -ææ¡ããããœãããŠã§ã¢ã«èµ·å ããããšã¯ã»ãšãã©ãªãå€§èŠæš¡ãããžã§ã¯ãã®å®è£
ãç®çãšããŠããŸãã
ç§ã¯ã¢ãžã£ã€ã«ã¢ãã«ã®æŠå¿µãå³å®ããããšããŸãã éçºã®å埩ããšã«ãç¹å®ã®ç®æšãšç®çã®ã»ãããææ¡ãããŸããããã«ã€ããŠã¯ãèšäºã§ããã«è©³ãã説æããŸãã
ãã®ãããçŸæç¹ã§ã¯äžè¬çãªåé¡ã®æ¬¡ã®å®åŒåããããŸãïŒéçºäžã®ãœãããŠã§ã¢ã¯ãããŸããŸãªæé©åã¢ã«ãŽãªãºã ïŒå€å
žçãªåæãšçŸä»£ã®ãã¥ãŒãªã¹ãã£ãã¯ã®äž¡æ¹ïŒããã³æ©æ¢°åŠç¿ïŒåé¡ãã¯ã©ã¹ã¿ãªã³ã°ãç©ºéæ¬¡å
åæžãååž°ïŒã¢ã«ãŽãªãºã ãå®è£
ããå¿
èŠããããŸãã æåŸã®æçµç®æšã¯ããããã®ã¢ã«ãŽãªãºã ãæé©å¶åŸ¡åæã®åéã«é©çšããéèåžå Žã§ååŒæŠç¥ãäœæããæ¹æ³ãéçºããããšã§ãã Scalaãäž»èŠãªéçºèšèªãšããŠéžã°ããŸããã
ãããã£ãŠããã®äœæ¥ã§ã¯æ¬¡ã®ããã«äŒããŸãã
- æé©åã®åé¡ãšããããç ç©¶ã®åºæ¬çãªå¯Ÿè±¡ãšããŠéžæããçç±ã«ã€ããŠã¯ã
- äž»ãªæœè±¡åãšãã®å®è£
ã§ã¯ãæé©åã®åé¡ãæžããããšã«ãããé©çšãããåé¡ã解決ããããšã«åºã¥ããã¢ãããŒãã䜿çšã§ããŸãã
- K-Meansã¢ã«ãŽãªãºã ãæãåçŽãªã©ã³ãã æ€çŽ¢ã¢ã«ãŽãªãºã ãããã³ããããåéã«ããŠåäžã®ç®æšã®ããã«æ©èœãããæ¹æ³ã«ã€ããŠã
æé©å
ç§ã¯ã»ãšãã©ã®ç ç©¶æ¥åãæé©ååé¡ã®è§£æ±ºã«è²»ããããšããäºå®ã«ããããã®èгç¹ããæäœããæ¹ããã䟿å©ã«ãªããŸãã
éåžžãæé©ååé¡ãè§£ãããšã«ãããã©ããªã«äºçްã§éãèšèªã«èãããŠããäœããã®ãæé©ãªãïŒå顿¡ä»¶ã®èгç¹ããïŒãªããžã§ã¯ãã®æ€çŽ¢ãæââå³ããŸãã ãæé©æ§ãã®æŠå¿µã¯ãäž»é¡åéããšã«ç°ãªããŸãã ããšãã°ã颿°ã®æå°å€ãèŠã€ããåé¡ã§ã¯ãç®ç颿°ã®æå°å€ã«å¯Ÿå¿ããç¹ãèŠã€ããå¿
èŠããããŸããã¡ã¿æé©ååé¡ã§ã¯ãæé©ãªå¶åŸ¡ã®åæã®åé¡ã§ãæãæ£ç¢ºãªçµæ/æãè¿
éã«æºãã/æãå®å®ããçµæãäžããã¢ã«ãŽãªãºã ã®ãã©ã¡ãŒã¿ãŒã決å®ããå¿
èŠããããŸãæçæéã§ãªããžã§ã¯ããæçµç¶æ
ã«å€æã§ããã³ã³ãããŒã©ãåæããå¿
èŠããããŸãã ãã¹ãŠã®å°éå®¶ã¯ã圌ã®å°éåéã«é¢é£ãããã®ã¿ã¹ã¯ã®ãªã¹ããç¶ç¶ã§ãããšç¢ºä¿¡ããŠããŸãã
æ°åŠã§ã¯ã
éç·åœ¢ããã°ã©ãã³ã°åé¡ã«ç¹å¥ãªæ³šæãæãããŸãã
éç·åœ¢åé¡ã«ã¯ãä»ã®å€ãã®å¿çšåé¡ãæžããããšãã§ããŸãã äžè¬çãªå Žåãéç·åœ¢èšç»åé¡ã®å®åŒåã«ã¯ã以äžãæå®ããå¿
èŠããããŸãã
- ä»»æã®é¢æ° ïŒç¹å®ã®åè³ªåºæºã®åœ¹å²ãæããïŒæå°ååé¡ã®å Žåãæå°åã«å¯Ÿå¿ãããã¯ãã«ãèŠã€ããå¿
èŠããããéã«æå€§åã®å ŽåïŒã
- åºæ¬çã«èš±å®¹å€ã®ç¯å²ãå®çŸ©ããäžé£ã®å¶é X = \å·Š\ {g_i \å·ŠïŒx \å³ïŒ\ leq 0ãi = 1ã...ãs \å³\} è°è« æé©åãããæ©èœã
ãããã£ãŠããã®åé¡ã®æ¬è³ªã¯æ¬¡ã®ããã«èª¬æã§ããŸããç®ç颿°ã®æå°/æå€§å€ãæäŸãããã¯ãã«ãæ€çŽ¢é åã§èŠã€ããå¿
èŠããããŸãã
ãã®åé¡ã解決ããããã®èšå€§ãªæ°ã®ã¢ã«ãŽãªãºã ããããŸãã åŸæ¥ããããã¯2ã€ã®ã°ã«ãŒãã«åããããšãã§ããŸãã
- åæã¢ã«ãŽãªãºã ïŒ
- ã¿ã¹ã¯ã®ã³ã³ããŒãã³ãã«å¶éã課ãããšãã§ãããšããäºå®ã«é¢é£ããŠãã¿ã¹ã¯ã®ç¯å²ãçããªããŸãã
- ããé«ãã¬ãã«ã®ãªããžã§ã¯ããã¿ã¹ã¯ã«å°å
¥ã§ããŸãïŒããšãã°ãç¹å®ã®é åºã®æŽŸçç©ïŒã
- ãã®ãããªæ¹æ³ã®ééããªãå©ç¹ã¯ãã»ãšãã©ã®å Žåãç¹å®ã®ç²ŸåºŠã®çµæã確å®ã«ååŸã§ããããšã§ãã
- çºèŠçã¢ã«ãŽãªãºã ïŒ
- èšç®ã®ä¿èšŒãããç¹æ§ã¯ãããŸããã åŸãããè§£ãå±ææ¥µå€ã®åŒåã®é åã§ããèœã¡ãããšã確信ããããšã¯ã§ããŸããã
- èšç®ã®è€éãã¯å°ãªããããå®çšçãªçµæã蚱容æéå
ã«ååŸããããã«äœ¿çšã§ããŸãïŒããšãã°ãåæã¢ã«ãŽãªãºã ã䜿çšããŠåçãååŸããå Žåã1æ¥ãããå¯èœæ§ã®ãã倧ããªæ¬¡å
ã®åé¡ã«ã€ããŠïŒã
ååãšããŠããã¥ãŒãªã¹ãã£ãã¯ã¢ã«ãŽãªãºã ã¯ãæ¹åæ§åæã®æ¹æ³ãšããŠèªèã§ããŸãã ãã®ã°ã«ãŒãã«ã¯ãããªãæåãª
éºäŒçã¢ã«ãŽãªãºã ã
ã¢ããŒãªã³ã°ã·ãã¥ã¬ãŒã·ã§ã³ã¢ã«ãŽãªãºã ãããŸããŸãª
ãã㥠ã¬ãŒã·ã§ã³ã¢ã«ãŽãªãºã ããããŸãã 倿°ã®ã¢ã«ãŽãªãºã ãéåžžã«ç°¡åã«èª¬æãããŠããŸãããã¹ãŠã®ã¿ã€ãã®ã¿ã¹ã¯ã«åæã«é©ããæ®éçãªã¢ã«ãŽãªãºã ã¯ãããŸããã åžé¢æ°ãããŸãåŠçã§ãã人ãããã°ãã¬ãã«ç·ã®æžè°·æ§é ãæã€é¢æ°ãæ±ãããšãç®çãšãã人ãããŸãã 人çã®ããã«-ãã¹ãŠã«ã¯ç¬èªã®å°éæ§ããããŸãã
䜿çšãããæœè±¡å
äžèšã®æšè«ã«åºã¥ããŠã
倿ãš
ã¢ã«ãŽãªãºã ãšãã 2ã€ã®æŠå¿µãæ±ãæãç°¡åãªæ¹æ³ã¯ç§ã«ã¯æã
ãŸã ã ãããã«ã€ããŠããã«è©³ãã説æããŸãã
倿
ã»ãšãã©ãã¹ãŠã®ããã·ãŒãžã£/颿°/ã¢ã«ãŽãªãºã ã¯ãããçš®ã®å€æãšèŠãªãããšãã§ããããããã®ãªããžã§ã¯ããåºæ¬çãªãã®ã®1ã€ãšããŠæäœããŸãã
ããŸããŸãªã¿ã€ãã®å€æã®éã«ã次ã®éå±€ãææ¡ãããŠããŸãã

èŠçŽ ã«ã€ããŠããã«è©³ããèŠãŠãããŸãããã
- äžåäžãªå€æã¯ãå
¥åãªããžã§ã¯ããšåºåãªããžã§ã¯ãã®ã¯ã©ã¹ãç°ãªãå¯èœæ§ãããå Žåã®æãäžè¬çãªå€æã§ãã
- åçš®å€æã¯ãå
¥åãªããžã§ã¯ããšåºåãªããžã§ã¯ãã®ã¯ã©ã¹ãåãå Žåã®ç¹å®ã®ã¿ã€ãã®ç°çš®å€æã§ãã
- ãã¯ãã«é¢æ°ã¯ãã»ããAã®èŠçŽ ã§æ§æããããã¯ãã«ããåãã»ããã®èŠçŽ ã§æ§æãããå¥ã®ãã¯ãã«ã«å€æãã倿ã§ãã
- 颿°ïŒé¢æ°ïŒ-ãã¯ãã«é¢æ°ã«äŒŒãŠããŸãïŒåºåèŠçŽ ãã¹ã«ã©ãŒã«ãªã£ãŠããããšãé€ããŠïŒã
- ã¡ããªãã¯ïŒMetricïŒ-ãªããžã§ã¯ããæ°å€ãšäžèŽãããè©äŸ¡å€æã
äžåäžãªå€æã¯ã©ã¹ã³ãŒãclass InhomogeneousTransformation[A, B](transform: A => B) extends Serializable { def apply(a: A): B = transform(a) def *[C](f: InhomogeneousTransformation[B, C]) = new InhomogeneousTransformation[A, C](x => f(transform(x))) }
2ã€ã®ã¡ãœããã®ã¿ãå«ãŸããŠããããã®ãã¡ã®1ã€
ãããã€ãã®å€æã®
æ§æãäœæããæé ãå®è£
ããŠããããšãããããŸãïŒéåžžãšã¯ç°ãªãæ¹æ³ã§ã®ã¿ïŒã ããã¯ãåçŽãªå€æããããè€éãªå€æãäœæããããã«å°æ¥å¿
èŠã«ãªããŸãã
åäžå€æã¯ã©ã¹ã³ãŒã class HomogeneousTransformation[A](transform: A => A) extends InhomogeneousTransformation[A, A](transform) { }
ããã§ã¯ã2ã€ã®åãã©ã¡ãŒã¿ãŒã1ã€ã«ãŸãšããããŸããã
ãã¯ãã«é¢æ°ã¯ã©ã¹ã³ãŒã class VectorFunction[A <: Algebra[A]] (transform: Vector[A] => Vector[A])(implicit converter: Double => A) extends HomogeneousTransformation[Vector[A]](transform) { }
äžè¬åã¯ã©ã¹ã®ä¿®æ£ããããã©ã¡ãŒã¿ãŒåããããŸãã çŸåšããã®ãã©ã¡ãŒã¿ãŒã¯ã倿ããããã¯ãã«ãã©ã®ãªããžã§ã¯ãã®ã¯ã©ã¹ã§æ§æãããããæ±ºå®ããŸãã ãã®ã³ãŒãã[A <ïŒAlgebra [A]]ãã«ãã£ãŠæ±ºå®ãããã¯ã©ã¹ã«èª²ããããå¶éã«æ³šæããå¿
èŠããããŸãã å¶éã¯æ¬¡ã®ããã«è¡šãããŸãããã¯ãã«ãæ§æãããªããžã§ã¯ãã¯åºæ¬çãªç®è¡æŒç®ããµããŒãããå¿
èŠããããããªãã¿ã®åºæ¬é¢æ°ïŒææ°é¢æ°ãäžè§é¢æ°ãªã©ïŒã®åŒæ°ãšããŠäœ¿çšã§ããŸãã 詳现ãªã³ãŒãã¯ãgithub'eã«æçš¿ãããŠãããœãŒã¹ã§èŠãããšãã§ããŸãïŒãªã³ã¯ã¯äœæ¥ã®æåŸã«ãããŸãïŒã
Functionã¯ã©ã¹ã®ã³ãŒããšãæé»çã«ç°çš®å€æã«å€æããæ¹æ³ class Function[A <: Algebra[A]] (transform: Vector[A] => A)(implicit converter: Double => A) extends VectorFunction[A](x => Vector("result" -> transform(x))) { def calculate(v: Vector[A]): A = transform(v) } object Function { implicit def createFromInhomogeneousTransformation[A <: Algebra[A]] (transformation: InhomogeneousTransformation[Vector[A], A])(implicit converter: Double => A) = new Function[A](x => transformation(x)) }
ã¡ããªãã¯ã¯ã©ã¹ã³ãŒããšé¢é£ãã倿 class Metric[A](transform: A => Real) extends InhomogeneousTransformation[A, Real](transform) { } object Metric { implicit def createFromInhomogeneousTransformation[A](transformation: InhomogeneousTransformation[A, Real]) = new Metric[A](x => transformation(x)) implicit def toFunction (metric: Metric[Vector[Real]])(implicit converter: Double => Real): Function[Real] = new Function[Real](x => metric(x)) }
äžèšã®æœè±¡åã¯ãäžèŠãããšãããåé¡ã®ãããªãå®åŒåã«å¿
èŠãšãªãå¯èœæ§ã®ããåºæ¬çãªã¿ã€ãã®å€æãã«ããŒããŠããŸãã
ã¢ã«ãŽãªãºã
ã¢ã«ãŽãªãºã ã3ã€ã®æäœã®ã»ãããšããŠå®çŸ©ããã®ã¯èªç¶ã ãšæããŸãïŒåæåãå埩éšåãçµäºã ã¢ã«ãŽãªãºã ã®å
¥åã§ãããã€ãã®
ã¿ã¹ã¯ïŒTaskïŒãæäŸãããŸãã åæåäž
ã«ãã¢ã«ãŽãªãºã ã®
ç¶æ
ãçæãããå埩éšåãç¹°ãè¿ãããšã§ä¿®æ£ãããŸãã æåŸã«ãçµäºæé ã䜿çšããŠ
ãã¢ã«ãŽãªãºã ã®
åºåãã©ã¡ãŒã¿ãŒã®ã¿ã€ãRã«å¯Ÿå¿ãããªããžã§ã¯ã
ããã¢ã«ãŽãªãºã ã®æåŸã®
ç¶æ
ããäœæãããŸãã
ã¯ã©ã¹ã³ãŒãã¢ã«ãŽãªãºã trait GeneralAlgorithm[T <: GeneralTask, S <: GeneralState, R] { def initializeRandomly(task: T): S def initializeFromSeed(task: T, seed: S): S final def initialize(task: T, state: Option[S]): S = { state match { case None => initializeRandomly(task) case Some(seed) => initializeFromSeed(task, seed) } } def iterate(task: T, state: S): S def terminate(task: T, state: S): R def prepareFolder(log: Option[String]): Unit = { if (log.isDefined) { val temp = new File(log.get) if (!temp.exists() || !temp.isDirectory()) temp.mkdir() else { if (temp.exists() && temp.isDirectory()) { def prepare(file: File): Unit = if (file.isDirectory()) { file.listFiles.foreach(prepare) file.delete() } else file.delete() prepare(temp) } } } } def logState(log: Option[String], state: S, fileId: Int): Unit = { log match { case Some(fileName) => { val writer = new ObjectOutputStream(new FileOutputStream(s"${fileName}/${fileId}.st")) writer.writeObject(state) writer.close() } case None => () } } final def work(task: T, terminationRule: S => Boolean, seed: Option[S] = None, log: Option[String] = None): R = { prepareFolder(log) var currentState = initialize(task, seed) var id = 0 logState(log, currentState, id) val startTime = System.nanoTime() while (!terminationRule(currentState)) { currentState = iterate(task, currentState) id = id + 1 currentState.id = id currentState.timestamp = 1e-9 * (System.nanoTime() - startTime) logState(log, currentState, id) } terminate(task, currentState) } }
ãããã£ãŠãç¹å®ã®ã¢ã«ãŽãªãºã ãäœæããã«ã¯ãåè¿°ã®3ã€ã®æé ãåå®çŸ©ããå¿
èŠããããŸãã
æé©åã¢ã«ãŽãªãºã ãšã¯äœã§ããïŒéç·åœ¢èšç»åé¡ã®åè¿°ã®èª¬æãããæé©åã¢ã«ãŽãªãºã ã®
ã¿ã¹ã¯ã颿°ãšæ€çŽ¢é åã§æ§æãããŠããããšã¯æããã§ãïŒçŸæç¹ã§ã¯ãæ€çŽ¢é åã倿¬¡å
å¹³è¡å
é¢äœã§æå®ãããŠããåçŽãªã±ãŒã¹ã«éå®ããŠããŸãïŒã
case class OptimizationTask[A <: Algebra[A]](f: Function[A], searchArea: Map[String, (Double, Double)]) extends GeneralTask { def apply(v: Vector[A]): A = f.calculate(v) }
éåžžãæé©åã¢ã«ãŽãªãºã ã®
ç¶æ
㯠ãã·ã³ã°ã«ãã€ã³ãïŒäœæ¥äžã«1ã€ã®ãã¯ãã«ãåæããã³å€æŽãããå ŽåïŒãŸãã¯ããã¥ã¬ãŒã·ã§ã³/ãã«ããã€ã³ãïŒäœæ¥äžã«è€æ°ã®ãã¯ãã«ãåæããã³å€æŽãããå ŽåïŒã®ããããã®åœ¢åŒããšããŸãã
abstract class OptimizationState[A <: Algebra[A]] extends GeneralState { def getCurrentBest(optimizationTask: OptimizationTask[A])(implicit cmp: Ordering[A]): Vector[A] } class MultiPointOptimizationState[A <: Algebra[A]](points: Seq[Vector[A]]) extends OptimizationState[A] { override def toString: String = { s"ID: ${id}\n" + s"Timestamp: ${timestamp}\n" + points.zipWithIndex.map{ case (point, id) => s"# ${id}\n${point}\n"}.mkString("\n") } override def getCurrentBest(optimizationTask: OptimizationTask[A])(implicit cmp: Ordering[A]): Vector[A] = points.minBy(point => optimizationTask(point)) def apply(id: Int): Vector[A] = points(id) def size: Int = points.size } class OnePointOptimizationState[A <: Algebra[A]](point: Vector[A]) extends MultiPointOptimizationState(points = Seq(point)) { override def getCurrentBest(optimizationTask: OptimizationTask[A])(implicit cmp: Ordering[A]): Vector[A] = point def apply(): Vector[A] = point }
ãããã£ãŠãæé©åã¢ã«ãŽãªãºã ã¯æ¬¡ã®ã³ãŒãã§èšè¿°ãããŸãã
abstract class OptimizationAlgorithm[A <: Algebra[A], S <: OptimizationState[A]] extends GeneralAlgorithm[OptimizationTask[A], S, Vector[A]] { }
K-MeansVSã ã©ã³ãã æ€çŽ¢
ããŠãçŽæã®ããã°ã©ã ã®æåã®2ã€ã®ãã€ã³ãã¯ã«ããŒãããŠããŸãã3çªç®ã®ãã€ã³ãã«ç§»ããšãã§ãã
äž¡æ¹ã®ã¢ã«ãŽãªãºã ã¯ããŸããŸãªãœãŒã¹ã§ãã説æãããŠãããããèªè
ããããã«å¯ŸåŠããããšã¯é£ãããªããšæããŸãã 代ããã«ãåè¿°ã®æœè±¡åã«é¡äŒŒç¹ãæããŸãã
K-Meansã¢ã«ãŽãªãºã K-Meansã¢ã«ãŽãªãºã ã®ã¿ã¹ã¯ã¯ãã¯ã©ã¹ã¿ãªã³ã°ã®ãã€ã³ãã®ã»ããããã³å¿
èŠãªã¯ã©ã¹ã¿ãŒã®æ°ãšããŠæç¢ºã«å®çŸ©ã§ããŸãã
class Task(val vectors: Seq[Vector[Real]], val numberOfCentroids: Int) extends GeneralTask { def apply(id: Int): Vector[Real] = vectors(id) def size: Int = vectors.size def toOptimizationTask(): (OptimizationTask[Real], InhomogeneousTransformation[Vector[Real], kCentroidsClusterization]) = { val varNames = vectors.head.components.keys.toSeq val values = vectors.flatMap(_.components.toSeq) val searchAreaPerName = varNames.map { name => val accordingValues = values .filter(_._1 == name) .map(_._2.value) (name, (accordingValues.min, accordingValues.max)) } val totalSearchArea = Range(0, numberOfCentroids) .flatMap { centroidId => searchAreaPerName .map { case (varName, area) => (s"${varName}_${centroidId}", area) } }.toMap val varNamesForCentroids = Range(0, numberOfCentroids) .map { centroidId => (centroidId, varNames.map { varName => s"${varName}_${centroidId}" }) } .toMap val splitVector: InhomogeneousTransformation[Vector[Real], Map[Int, Vector[Real]]] = new InhomogeneousTransformation( v => Range(0, numberOfCentroids) .map { centroidId => (centroidId, Vector(v(varNamesForCentroids(centroidId)) .components .map { case (key, value) => (key.dropRight(1 + centroidId.toString.length), value) })) }.toMap) val vectorsToClusterization: InhomogeneousTransformation[Map[Int, Vector[Real]], kCentroidsClusterization] = new InhomogeneousTransformation(v => new kCentroidsClusterization(v)) val clusterizationForMetric: InhomogeneousTransformation[kCentroidsClusterization, (kCentroidsClusterization, Seq[Vector[Real]])] = new InhomogeneousTransformation(clusterization => (clusterization, vectors)) val quality: Metric[Vector[Real]] = splitVector * vectorsToClusterization * clusterizationForMetric * SquareDeviationSumMetric (new OptimizationTask(f = quality, searchArea = totalSearchArea), splitVector * vectorsToClusterization) } }
ããã§2è¡ã«æ³šæããŠãã ããã
val quality: Metric[Vector[Real]] = splitVector * vectorsToClusterization * clusterizationForMetric * SquareDeviationSumMetric (new OptimizationTask(f = quality, searchArea = totalSearchArea), splitVector * vectorsToClusterization)
ãããã®æåã§ã¯ãå€æã®æ§æãæ§ç¯ãããŸãããã¯ãã«ã¯ãéå¿ãèšè¿°ãããã¯ãã«ã®ã·ã¹ãã ã«åå²ãããéå¿ã¯ã¯ã©ã¹ã¿ãŒåãããŸããã¯ã©ã¹ã¿ãŒåã¯ãã察å¿ããéå¿ããã¯ã©ã¹ã¿ãŒç¹ã®åèšè·é¢ãã«ãã£ãŠæšå®ãããŸã
ã çµæãšããŠçããå€æã®æ§æã¯ãæé©ååé¡ã®ç®ç颿°ãšèŠãªãããšãã§ããŸãã
ã©ã³ãã æ€çŽ¢ã¢ã«ãŽãªãºã ã©ã³ãã æ€çŽ¢ã¢ã«ãŽãªãºã ã®æãç°¡åãªèª¬æã¯ã
Wikipediaã«ãããŸãã å®è£
ãããããŒãžã§ã³ã®éãã¯ãçŸåšã®ããŒãžã§ã³ãã1ã€ã®ãã€ã³ããçæãããã®ã§ã¯ãªããè€æ°ã®ãã€ã³ããçæãããæ£èŠååžã®ä»£ããã«åäžãªãã€ã³ãã䜿çšãããããšã§ãã
K-Meansã¢ã«ãŽãªãºã ã䜿çšããŠæ§ç¯ãããã¯ã©ã¹ã¿ãŒåããŒã«ã¯ããã®éå¿ã«ãã£ãŠäžæã«æ±ºå®ãããŸãã K-Meansã¢ã«ãŽãªãºã èªäœã¯ãåã
ã®ã¯ã©ã¹ã¿ãŒå
ã®ãã¹ãŠã®ãã¯ãã«ã®å¹³åãšããŠèšç®ããããçŸåšã®éå¿ãæ°ããéå¿ã«åžžã«çœ®ãæãããã®ã§ãã ãããã£ãŠãK-Meansã¢ã«ãŽãªãºã ã®ç¶æ
ã¯ãã€ã§ããã¯ãã«ã®ã»ãããšããŠè¡šãããšãã§ããŸãã
ãããã£ãŠãã¯ã©ã¹ã¿ãªã³ã°ã¯ãK-Meansã¢ã«ãŽãªãºã ã䜿çšããŠçŽæ¥æ§ç¯ããããæé©ãªã¯ã©ã¹ã¿ãªã³ã°ãèŠã€ããåé¡ã解決ããŠã察å¿ããéå¿ããã®ã¯ã©ã¹ã¿ãŒãã€ã³ãã®åèšè·é¢ã®æå°å€ãæäŸããããšã§æ§ç¯ã§ããŸãã
次å
2ã3ã5ã®ããã€ãã®åæããŒã¿ã»ãããçæããŸãã
ããŒã¿çæã³ãŒãæ£èŠååžã©ã³ãã 倿°ã®çæ f[mu_, sigma_, N_] := RandomVariate[#, N] & /@ MapThread[NormalDistribution, {mu, sigma}]
2D Num = 100; sigma = 0.1; data2D = Join[ f[{0.5, 0}, {sigma, sigma}, Num], f[{-0.5, 0}, {sigma, sigma}, Num] ]; ListPlot[data2D] Export[NotebookDirectory[] <> "data2D.csv", data2D, "CSV"];

3DïŒt-SNEã䜿çšãã2次å
空éãžã®æåœ±ïŒ Num = 100; mu1 = 0.0; sigma1 = 0.1; mu2 = 2.0; sigma2 = 0.2; mu3 = 5.0; sigma3 = 0.3; data3D = Join[ f[{mu1, mu1, mu1}, {sigma1, sigma1, sigma1}, Num], f[{mu2, mu2, mu2}, {sigma2, sigma2, sigma2}, Num], f[{mu3, mu3, mu3}, {sigma3, sigma3, sigma3}, Num] ]; dimReducer = DimensionReduction[data3D, Method -> "TSNE"]; ListPlot[dimReducer[data3D]] Export[NotebookDirectory[] <> "data3D.csv", data3D, "CSV"];

5DïŒt-SNEã䜿çšãã2次å
空éãžã®æåœ±ïŒ Num = 250; mu1 = -2.5; sigma1 = 0.9; mu2 = 0.0; sigma2 = 1.5; mu3 = 2.5; sigma3 = 0.9; data5D = Join[ f[{mu1, mu1, mu1, mu1, mu1}, {sigma1, sigma1, sigma1, sigma1, sigma1}, Num], f[{mu2, mu2, mu2, mu2, mu2}, {sigma2, sigma2, sigma2, sigma2, sigma2}, Num], f[{mu3, mu3, mu3, mu3, mu3}, {sigma3, sigma3, sigma3, sigma3, sigma3}, Num] ]; dimReducer = DimensionReduction[data5D, Method -> "TSNE"]; ListPlot[dimReducer[data5D]] Export[NotebookDirectory[] <> "data5D.csv", data5D, "CSV"];

ãããŠãäž¡æ¹ã®ã¢ã«ãŽãªãºã ã䜿çšããŠãããããé§åãããã¯ã©ã¹ã¿ãŒåããŒã«ãæ§ç¯ããŸãã çµæã¯è¡šã«ãŸãšããããŠããŸãã
| 2D | 3D | 5D |
---|
ã¯ã©ã¹ã¿ãªã³ã°å質ïŒK-Meansçµç±ïŒïŒ | 90.30318857796479 | 96.48947132305597 | 1761.3743823022821 |
ã¯ã©ã¹ã¿ãŒåã®åè³ªïŒæé©åã«ããïŒïŒ | 87.42370021528419 | 96.4552486768293 | 1760.993575500699 |
ã¯ã©ã¹ã¿ãŒçµæ3DïŒt-SNEã䜿çšãã2次å
空éãžã®æåœ±ïŒ 5DïŒt-SNEã䜿çšãã2次å
空éãžã®æåœ±ïŒ ãã®è¡šã¯ãåçŽãªæé©åã¢ã«ãŽãªãºã ã§ãããåçŽãªã¯ã©ã¹ã¿ãŒåããŒã«ãæ§ç¯ããåé¡ãããŸã解決ã§ããããšã瀺ããŠããŸãã ãã®å Žåãäœæãããã¯ã©ã¹ã¿ãŒåããŒã«ã¯ã䜿çšãããå質ã¡ããªãã¯ã®èгç¹ãã
æé©ã§ãïŒäœ¿çšãããæé©åæ¹æ³ã¯
ã°ããŒãã«ãªæé©ãã€ã³ãã®æ€åºãä¿èšŒããªããããæ£çŽãæº
æé©ã§ãïŒã åœç¶ã䜿çšãããæé©åã¢ã«ãŽãªãºã ã¯ã髿¬¡å
ã®ã¿ã¹ã¯ã«ã¯ã»ãšãã©é©ããŠããŸããïŒããŸããŸãªã¬ãã«ã®ããã€ãã®ãã¥ãŒãªã¹ãã£ãã¯ã«åºã¥ãããããè€éã§å¹ççãªã¢ã«ãŽãªãºã ã䜿çšããããšããå§ãããŸãïŒã å°ããªåæåé¡ã®å Žåãã©ã³ãã æ€çŽ¢ã¯ããªãããŸããããŸããã
ããšããã®ä»£ããã«
ã³ã¡ã³ãã賌èªããŠããªãèšäºãèªãã§ããããã¹ãŠã®äººã«æè¬ããããšæããŸãã ã€ãŸãããã®äœåã®äœæã«è²¢ç®ãããã¹ãŠã®äººã ããããããã®ãããã¯ã«é¢ããèšäºãå¯èœãªéã衚瀺ãããçŸåšã®ã¯ãŒã¯ããŒãã衚瀺ãããããšã«ããæ³šæããŠãã ããã ããããä»åºŠã¯ãç§ãå§ããåé¡ãçµããããããšããããšãèšããããšæããŸãã
åèæç®ãšæç®