{"id":463,"date":"2011-06-20T20:08:00","date_gmt":"2011-06-20T12:08:00","guid":{"rendered":"http:\/\/note.systw.net\/note\/?p=463"},"modified":"2023-11-02T20:09:57","modified_gmt":"2023-11-02T12:09:57","slug":"k-means","status":"publish","type":"post","link":"https:\/\/systw.net\/note\/archives\/463","title":{"rendered":"K-means"},"content":{"rendered":"\n<p><strong>k-means<\/strong><br>\u512a\u9ede:\u7c21\u55ae\u6709\u6548\u7387,\u4efb\u4e00\u6f14\u7b97\u6cd5\u6240\u5f97\u4e4b\u7d50\u679c,\u90fd\u53ef\u900f\u904e\u6b64\u65b9\u6cd5\u9032\u884c\u6539\u5584<br>\u7f3a\u9ede:1\u5404\u7fa4\u7684\u8cc7\u6599\u5206\u4f48\u9808\u5448\u5713\u5f62\u5206\u4f48\u4e14\u6709\u985e\u4f3c\u7684\u5927\u5c0f\u6642,\u624d\u80fd\u5f97\u5230\u8f03\u4f73\u7684\u89e3,2\u521d\u59cb\u503c\u6c92\u8a2d\u597d\u5bb9\u6613\u9677\u5165\u5340\u57df\u6700\u4f73\u89e3<\/p>\n\n\n\n<p><strong>\u8aaa\u660e<\/strong><br>\u5728\u5206\u5272\u5f0f\u65b9\u6cd5\u4e2d\uff0c\u6700\u5e38\u88ab\u4f7f\u7528\u4e5f\u6700\u5177\u4ee3\u8868\u6027\u7684\u65b9\u6cd5\u70baK-means \u5206\u7fa4\u6f14\u7b97\u6cd5\uff0c\u8a72\u65b9\u6cd5\u7531MacQueen\u65bc1967 \u6240\u63d0\u51fa\u4f86\u3002k-means \u5206\u7fa4\u6f14\u7b97\u6cd5\u662f\u4e00\u7a2e\u7c21\u55ae\u6613\u61c2\u4e14\u5ee3\u70ba\u4f7f\u7528\u7684\u975e\u76e3\u7763\u5f0f\u5b78\u7fd2\u7684\u6f14\u7b97\u6cd5\u3002K-means \u5206\u7fa4\u6f14\u7b97\u6cd5\u8981\u5148\u6c7a\u5b9a\u5c07\u8cc7\u6599\u5206\u70bax\u500b\u7fa4\u7d44\uff0c\u5176\u4e2d\u6bcf\u4e00\u500b\u7fa4\u7d44\u5fc5\u9808\u81f3\u5c11\u5305\u542b\u4e00\u9805\u8cc7\u6599\uff0c\u800c\u4efb\u4f55\u4e00\u500b\u8cc7\u6599\u90fd\u61c9\u8a72\u5c6c\u65bc\u67d0\u4e00\u500b\u7fa4\u7d44\uff0c\u4f9d\u64da\u8cc7\u6599\u4e4b\u9593\u7684\u8ddd\u96e2\uff0c\u53d6\u5f97\u7fa4\u7d44\u7684\u4e2d\u5fc3\u4f4d\u7f6e\uff0c\u5207\u5272\u51fa\u7fa4\u96c6\u8207\u7fa4\u96c6\u4e4b\u9593\u7684\u754c\u7dda\u3002<br>&nbsp;<\/p>\n\n\n\n<p><strong>step<\/strong><br>1\u6c7a\u5b9a\u7fa4\u6578\u91cf<br>2\u521d\u59cb\u5316,\u6709\u4ee5\u4e0b\u5169\u7a2e\u505a\u6cd5<br>\u505a\u6cd51,\u5c07\u5404\u8cc7\u6599\u7269\u4ef6\u6307\u6d3e(ex:\u96a8\u6a5f\u6307\u6d3e)\u5230\u5176\u4e2d\u4e00\u7fa4,\u5728\u8a08\u7b97\u5404\u7fa4\u4e2d\u5fc3<br>\u505a\u6cd52,\u6307\u6d3e(ex:\u96a8\u6a5f\u6307\u6d3e)\u5176\u4e2d\u4e00\u500b\u8cc7\u6599\u7269\u4ef6\u7576\u5176\u4e2d\u4e00\u500b\u7fa4\u4e2d\u5fc3<br>3\u5206\u914d\u6bcf\u500b\u8cc7\u6599\u7269\u4ef6\u5230\u64c1\u6709\u6700\u77ed\u77e9\u96e2\u7684\u7fa4(\u6bcf\u500b\u7269\u4ef6\u8981\u7b97\u81ea\u5df1\u8207\u6bcf\u500b\u7fa4\u4e2d\u5fc3\u7684\u8ddd\u96e2,\u82e5\u7b97\u51fa\u4f86\u7684\u8ddd\u96e2\u5047\u8a2d\u662f\u548ca\u7fa4\u6700\u8fd1,\u5247\u8a72\u7269\u4ef6\u5c6c\u65bca\u7fa4)<br>4\u91cd\u7b97\u6240\u6709\u7fa4\u4e2d\u5fc3<br>5\u91cd\u89863,4\u76f4\u5230\u6240\u6709\u7fa4\u4e2d\u5fc3\u4e0d\u5728\u6709\u4efb\u4f55\u6539\u8b8a<br>ps:<br>2\u7dad\u8ddd\u96e2\u516c\u5f0f sqrt( (1x-2x)^2 + (1y-2y)^2 )<br>2\u7dadN\u9ede\u4e2d\u5fc3\u516c\u5f0f (x1+x2+x3+&#8230;+xN)\/N,(y1+y2+&#8230;+yN)\/N<br>ps:<br>\u8a2d\u9ede\u67091,2,3,&#8230;,N<br>\u7dad\u5ea6\u6709x,y,z<br>3\u7dad\u8ddd\u96e2\u516c\u5f0f sqrt( (1x-2x)^2 + (1y-2y)^2 + (1z-2z)^2 )<br>3\u7dadN\u9ede\u4e2d\u5fc3\u516c\u5f0f (x1+x2+x3+&#8230;+xN)\/N,(y1+y2+y3+&#8230;+yN)\/N,(z1+z2+z3+&#8230;+zN)\/N<\/p>\n\n\n\n<p>ex:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>&nbsp;<\/td><td>x1&nbsp;<\/td><td>x2&nbsp;<\/td><\/tr><tr><td>a&nbsp;<\/td><td>5&nbsp;<\/td><td>3&nbsp;<\/td><\/tr><tr><td>b&nbsp;<\/td><td>-1&nbsp;<\/td><td>1&nbsp;<\/td><\/tr><tr><td>c&nbsp;<\/td><td>1&nbsp;<\/td><td>-2&nbsp;<\/td><\/tr><tr><td>d&nbsp;<\/td><td>-3&nbsp;<\/td><td>-2&nbsp;<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>1<br>\u8a2d\u5b9a\u7fa4\u6578\u91cf\u70ba2<br>\u4e26\u96a8\u6a5f\u5206\u5169\u7fa4\u70baab,cd,<br>2<br>\u6c7a\u5b9aab\u7684\u7fa4\u4e2d\u5fc3\u548ccd\u7684\u7fa4\u4e2d\u5fc3,\u5982\u4e0b<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>&nbsp;<\/td><td>x1&nbsp;<\/td><td>x2&nbsp;<\/td><\/tr><tr><td>ab&nbsp;<\/td><td>(5+(-1))\/2=2&nbsp;<\/td><td>(3+1)\/2=2&nbsp;<\/td><\/tr><tr><td>cd&nbsp;<\/td><td>(1+(-3))\/2=-1&nbsp;<\/td><td>(-2+(-2))\/2=-2&nbsp;<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>3<br>\u627e\u51fa\u9ede\u8207ab\u6216cd\u90a3\u500b\u6700\u8fd1,\u4ee5\u5206\u914d\u6bcf\u500b\u8cc7\u6599\u7269\u4ef6\u5230\u6700\u9069\u5408\u7684\u7fa4,\u5982\u4e0b<br>min{(a,ab),(a,cd)}={10,61}=(a,ab)=sqrt(10)<br>min{(b,ab),(b,cd)}={10,9}=(b,cd)=sqrt(9) \u56e0b,cd\u5c0f\u65bcb,ab,\u6240\u4ee5b\u5f9eab\u7fa4\u6539\u5230cd\u7fa4<br>min{(c,ab),(c,cd)}={17,4}=(c,cd)=sqrt(4)<br>min{(d,ab),(d,cd)}={41,4}=(d,cd)=sqrt(4)<br>ps:(x1,y1),(x2,y2)\u7684\u8ddd\u96e2=sqrt((x1-x2)(x1-x2)+(y1-y2)(y1-y2))<br>\u6839\u64da\u4ee5\u4e0a\u7d50\u679c,\u5169\u7fa4\u5df2\u8b8a\u6210a,bcd<br>4<br>\u91cd\u7b97\u6240\u6709\u7fa4\u4e2d\u5fc3,\u6c7a\u5b9aa\u7684\u7fa4\u4e2d\u5fc3\u548cb(cd)\u7684\u7fa4\u4e2d\u5fc3,\u5982\u4e0b<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>&nbsp;<\/td><td>x1&nbsp;<\/td><td>x2&nbsp;<\/td><\/tr><tr><td>a&nbsp;<\/td><td>5&nbsp;<\/td><td>3&nbsp;<\/td><\/tr><tr><td>b(cd)&nbsp;<\/td><td>(-1+(-1))\/2=-1&nbsp;<\/td><td>(1+(-2))\/2=-0.5&nbsp;&nbsp;<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>5<br>\u627e\u51fa\u9ede\u8207a\u6216b(cd)\u90a3\u500b\u6700\u8fd1,\u4ee5\u5206\u914d\u6bcf\u500b\u8cc7\u6599\u7269\u4ef6\u5230\u6700\u9069\u5408\u7684\u7fa4,\u5982\u4e0b<br>min{(a,a),(a,b(cd))}={0,52}=(a,a)=sqrt(0)<br>min{(b,a),(b,b(cd))}={40,4}=(b,b(cd))=sqrt(4)<br>min{(c,a),(c,b(cd))}={41,5}=(c,b(cd))=sqrt(5)<br>min{(d,a),(d,b(cd))}={89,5}=(d,b(cd))=sqrt(5)<br>\u6839\u64da\u4ee5\u4e0a\u7d50\u679c,\u5169\u7fa4\u4ecd\u7136\u662fa,bcd<br>6<br>\u56e0\u7d50\u679c\u4e0d\u8b8a,\u6240\u4ee5\u70ba\u6700\u7d42\u5206\u7fa4\u7d50\u679c<\/p>\n\n\n\n<p><br>&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.<br>\u4f7f\u7528\u5de5\u5177<br>minitab<\/p>\n\n\n\n<p><strong>k-mean\u6b65\u9a5f<\/strong><br>1\u5148\u5c07\u8cc7\u6599\u8cbc\u5230worksheet<br>2\u9ede\u64castat &gt; multivariate &gt; cluster k-mean ,\u6703\u8df3\u51fa\u5c0d\u8a71\u8996\u7a97<br>2.1\u5c07\u5de6\u6b04\u8981\u7528\u5230\u7684\u6b04\u4f4d\u9078\u53d6\u597d\u5f8c\u6309select,\u5247\u8981\u7528\u5230\u7684\u6b04\u4f4d\u6703\u51fa\u73fe\u5728\u53f3\u6b04variables\u4e2d<br>2.2\u9ede\u64canumber of cluster,\u4e26\u8f38\u5165\u7fa4\u7684\u6578\u91cf<br>2.3\u9ede\u64ca\u4e0b\u65b9storage,\u6703\u8df3\u51fa\u5c0d\u8a71\u8996\u7a97,<br>2.3.1\u5728cluster membership column\u5167\u8f38\u5165\u4e00\u6b04\u4f4d ex:d<br>2.3.2\u9ede\u64caok\u5f8cstorage\u5c0d\u8a71\u8996\u7a97\u95dc\u9589<br>2.4\u9ede\u64caok,cluster k-means\u5c0d\u8a71\u8996\u7a97\u95dc\u9589<br>4\u7d50\u679c\u986f\u793a<br>ps:<br>k-mean\u7684\u8f38\u5165\u8cc7\u6599\u5f62\u5f0f\u901a\u5e38\u70ba\u4e00\u7b46\u7b46\u7684\u8cc7\u6599,\u5982\u4e0b(\u53d6\u81eauci iris data)<br>5.7,4.4,1.5,0.4,Iris-setosa<br>5.4,3.9,1.3,0.4,Iris-setosa<br>5.1,3.5,1.4,0.3,Iris-setosa<br>ex:<br>\u4ee5\u4e0a\u8ff0\u7bc4\u4f8b\u70ba\u4f8b,\u5247\u7d50\u679c\u70ba<br>a (5,3) \u7fa41<br>b (-1,1) \u7fa42<br>c (1,-2) \u7fa42<br>d (-3,-2)\u7fa42<br>\u5c07\u4e0a\u8ff0\u7bc4\u4f8b\u6539\u70ba3\u500b\u7fa4\u70ba\u4f8b,\u5247\u7d50\u679c\u70ba<br>a (5,3) \u7fa41<br>b (-1,1) \u7fa42<br>c (1,-2) \u7fa43<br>d (-3,-2)\u7fa42<\/p>\n\n\n\n<p>&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;..<\/p>\n\n\n\n<p><br><strong>kmean for php \u7a0b\u5f0f\u78bc<\/strong>(beta)<br>ps:\u597d\u50cf\u9084\u6709\u4e00\u4e9b\u554f\u984c<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/kmean for php<br>\/\/time record<br>$startime=caclutime();<br>if($_GET&#91;'debug']==1)$kmean&#91;'para']&#91;'debug']=1; \/\/\u662f\u5426\u555f\u7528debug mode<br>$kmean&#91;'cluster']&#91;'count']=3; \/\/\u8981\u5206\u7684\u7fa4\u6578\u91cf<br>$datapath='data'; \/\/\u8cc7\u6599\u4f86\u6e90<br>\/\/\u8b80\u53d6\u8cc7\u6599<br>input_fromfile($kmean&#91;'dot'],$datapath);<br>\/\/\u57f7\u884ckmean<br>kmean($kmean);<br>\/\/$endtime<br>$endtime=caclutime();<br>printf('query took:%3.5fsec',($endtime-$startime));<br>\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<br>\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<br>\/\/kmean main function start<br>function kmean($kmean){<br>\/*<br>paramenter list<br>$_GET&#91;'init']=1,2,NULL<br>$_GET&#91;'debug']=1,NULL<br>*\/<br>\/\/\u8a18\u9304\u6240\u6709\u7fa4\u4e2d\u5fc3\u7684\u4f4d\u7f6e<br>\/\/$kmean&#91;cluster]&#91;center]&#91;int:clusterid:1~n]&#91;int:dimensions:1~m]<br>\/\/ex:<br>\/\/$kmean&#91;cluster]&#91;center]&#91;1]&#91;1]=cluster1 center value1<br>\/\/$kmean&#91;cluster]&#91;center]&#91;1]&#91;2]=cluster1 center value2<br>\/\/$kmean&#91;cluster]&#91;center]&#91;1]&#91;n]=cluster1 center valuem<br>$kmean&#91;'cluster']&#91;'center']&#91;1]&#91;1]=0;<br>$kmean&#91;'cluster']&#91;'center']&#91;1]&#91;2]=0;<br>\/\/\u8a18\u9304\u8a72\u7fa4\u76ee\u524d\u6709\u7684\u9ede<br>\/\/$kmean&#91;'cluster']&#91;'dot']&#91;int:cluster_id:1~m]&#91;]<br>\/\/$kmean&#91;cluster]&#91;dot]&#91;1]&#91;0]=dot_id \u7b2c\u4e00\u500b\u7fa4\u7684\u7b2c\u4e00\u500b\u9ede\u7684id<br>\/\/$kmean&#91;cluster]&#91;dot]&#91;1]&#91;1]=dot_id \u7b2c\u4e00\u500b\u7fa4\u7684\u7b2c\u4e8c\u500b\u9ede\u7684id<br>\/\/\u8a18\u9304\u6240\u6709\u9ede\u7684\u4f4d\u7f6e\u53ca\u540d\u7a31<br>\/\/$kmean&#91;dot]&#91;int:dot_id:1~n]&#91;str:name:0]<br>\/\/$kmean&#91;dot]&#91;int:dot_id:1~n]&#91;int:dimensions:1~m]<br>\/\/ex:<br>\/\/$kmean&#91;dot]&#91;1]&#91;0]=name<br>\/\/$kmean&#91;dot]&#91;1]&#91;1]=value1<br>\/\/$kmean&#91;dot]&#91;1]&#91;2]=value2<br>\/\/$kmean&#91;dot]&#91;1]&#91;3]=value3<br>\/\/\u8a18\u9304\u8a72\u9ede\u76ee\u524d\u7684\u7fa4<br>\/\/$kmean&#91;dotcluster]&#91;int:round:1~n]&#91;int:dot_id:1~n]<br>\/\/ex:<br>\/\/$kmean&#91;dotcluster]&#91;0]&#91;1]= \u5b58\u653e\u7b2c0\u56de\u5408\u9ede1\u7684\u7fa4<br>\/\/$kmean&#91;dotcluster&#91;0]&#91;2]= \u5b58\u653e\u7b2c0\u56de\u5408\u9ede2\u7684\u7fa4<br>\/\/$kmean&#91;dotcluster]&#91;1]&#91;1]= \u5b58\u653e\u7b2c1\u56de\u5408\u9ede1\u7684\u7fa4<br>\/\/$kmean&#91;dotcluster]&#91;1]&#91;2]= \u5b58\u653e\u7b2c1\u56de\u5408\u9ede2\u7684\u7fa4<br>if($_GET&#91;'debug']==1)$debug=1; \/\/\u662f\u5426\u555f\u7528debug mode<br>\/\/\u53d6\u5f97\u6240\u6709\u9ede\u7684\u7e3d\u6578<br>$kmean&#91;'dotsum']=count($kmean&#91;'dot']);<br>\/\/\u521d\u59cb\u5316,\u5148\u5206\u914ddot\u7d66\u6307\u5b9a\u7684\u7fa4\u6578<br>if($_GET&#91;'init']==null)init_dotcentr_order($kmean);<br>if($_GET&#91;'init']==1)init_dotcentr_remainder($kmean);<br>if($_GET&#91;'init']==2)init_dotcentr_rand($kmean);<br><br>\/\/\/\/\/\/\/\/\/\/\/\/\/kmean start<br>while($same&lt;$kmean&#91;'dotsum']){<br>&nbsp; $same=0; \/\/\u8a18\u9304\u6240\u6709\u7684\u9ede\u5728\u672c\u56de\u5408\u8207\u4e0a\u4e00\u56de\u5408\u76f8\u540c\u7684\u6578\u91cf<br>&nbsp; $round++; \/\/\u8a18\u9304\u56de\u5408\u6578<br>&nbsp; if($debug==1)echo 'step'.$round.'\/n';<br>\/\/\u7b97\u7fa4\u4e2d\u5fc3<br>&nbsp; for($i=1;$i&lt;=$kmean&#91;'cluster']&#91;'count'];$i++){<br>\/\/$kmean&#91;dot]\u662f\u6240\u6709\u9ede\u7684\u8cc7\u6599<br>\/\/$kmean&#91;cluster]&#91;dot]&#91;$i]\u662f$i\u7fa4\u7684\u6240\u64c1\u6709\u7684\u9ede<br>\/\/\u7fa4\u4e2d\u5fc3\u7684\u7d50\u679c\u6703\u5132\u5b58\u5728$kmean&#91;cluster]&#91;center]&#91;$i]<br>&nbsp; computer_clustercenter($kmean&#91;'dot'], $kmean&#91;'cluster']&#91;'dot']&#91;$i] , $kmean&#91;'cluster']&#91;'center']&#91;$i]);<br>&nbsp; if($debug==1){echo 'cluster'.$i.'center=';print_r($kmean&#91;'cluster']&#91;'center']&#91;$i]);echo '&lt; br&gt;';}<br>}<br>unset($kmean&#91;'cluster']&#91;'dot']);\/\/\u6e05\u7a7a\u5404\u7fa4\u6709\u90a3\u4e9b\u9ede\u7684\u8cc7\u6599<br>\/\/\u91cd\u65b0\u53d6\u5f97\u5404\u9ede\u8207\u7fa4\u4e2d\u5fc3\u7684\u8ddd\u96e2,$i\u662f\u9ede<br>for($i=1;$i&lt;=$kmean&#91;'dotsum'];$i++){<br>\/\/\u53d6\u5f97\u8a72\u9ede\u8207\u6240\u6709\u7fa4\u7684\u8ddd\u96e2,$j\u662f\u7fa4<br>&nbsp; for($j=1;$j&lt;=$kmean&#91;'cluster']&#91;'count'];$j++){<br>\/\/\u53d6\u5f97\u8a72\u9ede\u8207\u8a72\u7fa4\u7684\u8ddd\u96e2<br>&nbsp; &nbsp; $dot2centr&#91;$j]=computer_dot2center($kmean&#91;'dot']&#91;$i],$kmean&#91;'cluster']&#91;'center']&#91;$j]);<br>\/\/\u627e\u51fa\u548c\u9ede\u6700\u8fd1\u7684\u7fa4\u4e2d\u5fc3<br>&nbsp; &nbsp; if($dot2centrmin==null){&nbsp;<br>&nbsp; &nbsp; &nbsp; $dot2centrmin=$dot2centr&#91;$j];<br>&nbsp; &nbsp; &nbsp; $kmean&#91;'dotcluster']&#91;$round]&#91;$i]=$j;<br>&nbsp; &nbsp; }else{<br>&nbsp; &nbsp; &nbsp; if($dot2centr&#91;$j]&lt;$dot2centrmin){<br>&nbsp; &nbsp; &nbsp; &nbsp; $dot2centrmin=$dot2centr&#91;$j];<br>&nbsp; &nbsp; &nbsp; &nbsp; $kmean&#91;'dotcluster']&#91;$round]&#91;$i]=$j; \/\/\u8a2d\u5b9a\u70ba\u9ede\u7684\u65b0\u7fa4<br>&nbsp; &nbsp; &nbsp; }<br>&nbsp; &nbsp; }<br>&nbsp; }<br>if($debug==1){echo 'dot'.$i.'-clustercenter distance=';print_r($dot2centr);echo '&lt; br&gt;';}<br>$dot2centrmin=null;<br>$kmean&#91;'cluster']&#91;'dot']&#91;$kmean&#91;'dotcluster']&#91;$round]&#91;$i]]&#91;]=$i; \/\/\u8a18\u9304\u5404\u7fa4\u6709\u90a3\u4e9b\u9ede\u7684\u8cc7\u6599<br>if( $kmean&#91;'dotcluster']&#91;$round]&#91;$i]== $kmean&#91;'dotcluster']&#91;$round-1]&#91;$i])$same++;<br>\/\/\u82e5\u8a72\u56de\u5408\u9ede\u7684\u7fa4\u8207\u4e0a\u4e00\u56de\u5408\u76f8\u540c\u5247\u8a18\u9304\u6b21\u6578,\u5247\u8a18\u9304\u7684\u6b21\u6578\u7b49\u540c\u65bc\u65bc\u9ede\u7684\u6578\u91cf\u6642,\u5c31\u8868\u793a\u672c\u56de\u5408\u8207\u4e0a\u4e00\u56de\u5408\u9ede\u7684\u7fa4\u90fd\u6c92\u8b8a\u904e,\u5c07\u89f8\u767cwhile\u7684\u96e2\u958b\u689d\u4ef6<br>if($debug==1){if( $kmean&#91;'dotcluster']&#91;$round]&#91;$i]!=$kmean&#91;'dotcluster']&#91;$round-1]&#91;$i]){<br>&nbsp; $debuginfo.=$i.'='.$kmean&#91;'dotcluster']&#91;$round-1]&#91;$i].'---&gt;'.$kmean&#91;'dotcluster']&#91;$round]&#91;$i].'&lt; br&gt;';}}<br>}<br>if($debug==1){echo 'cluster dot=';print_r($kmean&#91;'cluster']&#91;'dot']);echo '&lt; br&gt;'.$debuginfo;}<br>}<br>\/\/\/\/\/\/kmean end<br><br>\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<br>\/\/report<br>for($i=1;$i&lt;=$kmean&#91;'dotsum'];$i++){<br>while(list($key,$data)=each($kmean&#91;'dot']&#91;$i])){<br>$result.=$data.',';<br>}<br>$result.='='.$kmean&#91;'dotcluster']&#91;$round]&#91;$i];<br>$result.='<br>';<br>}<br>echo $result;<br>\/\/other infomation<br>echo '&lt; br&gt;round='.$round.'&lt; br&gt;';<br>}<br>\/\/kmean main function end<br>\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<br>\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<br>\/\/init method1 use %<br>function init_dotcentr_remainder(&amp;$kmean){<br>for($i=1;$i&lt;=$kmean&#91;'dotsum'];$i++){<br>$clusterid=$i%$kmean&#91;'cluster']&#91;'count']+1; \/\/\u8a08\u7b97\u8a72\u9ede\u5206\u914d\u7684\u7fa4<br>$kmean&#91;'dotcluster']&#91;0]&#91;$i]=$clusterid; \/\/\u8a18\u9304\u7b2c0\u56de\u5408\u6642\u8a72\u9ede($i)\u70ba\u90a3\u4e00\u7fa4<br>$kmean&#91;'cluster']&#91;'dot']&#91;$clusterid]&#91;]=$i; \/\/\u8a18\u9304\u8a72\u7fa4($clusterid)\u6709\u90a3\u4e9b\u9ede($i),\u4e26\u505a\u7d22\u5f15($j)<br>}<br>\/\/print_r($kmean&#91;'dotcluster']&#91;0]);<br>\/\/print_r($kmean&#91;'cluster']&#91;'dot']);<br>}<br>\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<br>\/\/init method2 use rand<br>function init_dotcentr_rand(&amp;$kmean){<br>for($i=1;$i&lt;=$kmean&#91;'dotsum'];$i++){<br>$clusterid=rand(1,$kmean&#91;'cluster']&#91;'count']); \/\/\u8a08\u7b97\u8a72\u9ede\u5206\u914d\u7684\u7fa4<br>$kmean&#91;'dotcluster']&#91;0]&#91;$i]=$clusterid; \/\/\u8a18\u9304\u7b2c0\u56de\u5408\u6642\u8a72\u9ede($i)\u70ba\u90a3\u4e00\u7fa4<br>$kmean&#91;'cluster']&#91;'dot']&#91;$clusterid]&#91;]=$i; \/\/\u8a18\u9304\u8a72\u7fa4($clusterid)\u6709\u90a3\u4e9b\u9ede($i),\u4e26\u505a\u7d22\u5f15($j)<br>}<br>\/\/print_r($kmean&#91;'dotcluster']&#91;0]);<br>\/\/print_r($kmean&#91;'cluster']&#91;'dot']);<br>}<br>\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<br>\/\/init method3 user by order<br>function init_dotcentr_order(&amp;$kmean){<br>$groupcount=ceil($kmean&#91;'dotsum']\/$kmean&#91;'cluster']&#91;'count']);<br>for($i=1;$i&lt;=$kmean&#91;'dotsum'];$i++){<br>if($i%$groupcount==1)$clusterid++;<br>$kmean&#91;'dotcluster']&#91;0]&#91;$i]=$clusterid; \/\/\u8a18\u9304\u7b2c0\u56de\u5408\u6642\u8a72\u9ede($i)\u70ba\u90a3\u4e00\u7fa4<br>$kmean&#91;'cluster']&#91;'dot']&#91;$clusterid]&#91;]=$i; \/\/\u8a18\u9304\u8a72\u7fa4($clusterid)\u6709\u90a3\u4e9b\u9ede($i),\u4e26\u505a\u7d22\u5f15($j)<br>}<br>\/\/print_r($kmean&#91;'dotcluster']&#91;0]);<br>\/\/print_r($kmean&#91;'cluster']&#91;'dot']);<br>}<br>\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<br>function computer_clustercenter($dot_all,$clusterdot_index,&amp;$center){<br>\/\/$dot_all&#91;1~n]&#91;1~m]<br>\/\/$clusterdot_index&#91;1~x]<br>\/\/$center&#91;1~m]<br>$debug=0;<br>$clusterdot_total=count($clusterdot_index);<br>$dimensions_total=count($dot_all&#91;1])-1;\/\/\u8981\u6263\u9664name,\u6240\u4ee5\u8981\u6e1b1<br>for($i=1;$i&lt;=$dimensions_total;$i++){<br>$center&#91;$i]=0;<br>for($j=0;$j&lt;$clusterdot_total;$j++){<br>$center&#91;$i]+=$dot_all&#91;$clusterdot_index&#91;$j]]&#91;$i];<br>if($debug==1){$debuginfo.=$dot_all&#91;$clusterdot_index&#91;$j]]&#91;$i].'+';}<br>}<br>$center&#91;$i]=$center&#91;$i]\/$clusterdot_total;<br>if($debug==1){echo $center&#91;$i].'='.$debuginfo.'\/'.$clusterdot_total.';&lt; br&gt;'; $debuginfo=null;}<br>}<br>\/\/ (x1+x2+x3+...+xN)\/N,(y1+y2+y3+...+yN)\/N,(z1+z2+z3+...+zN)\/N<br>}<br>\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<br>function computer_dot2center($dot,$center){<br>$dimensions_total=count($center);<br>for($i=1;$i&lt;=$dimensions_total;$i++){<br>$distance+=($dot&#91;$i]-$center&#91;$i])*($dot&#91;$i]-$center&#91;$i]);<br>}<br>\/\/sqrt( (1x-2x)^2 + (1y-2y)^2 + (1z-2z)^2 )<br>return $distance;<br>}<br>\/\/kmean end<br>\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<br>\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<br>\/\/\/\/\/\/\/\/\/\/optional function<br>\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<br>\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<br>function input_fromfile(&amp;$kmeandot,$sourcedata){<br>\/*<br>data fromat description<br>name1,attribute1_value,attribute2_value,...attributeN_value<br>name2,attribute1_value,attribute2_value,...attributeN_value<br>.......<br>nameN,attribute1_value,attribute2_value,...attributeN_value<br>ex:<br>Iris-setosa,5.1,3.5,1.4,0.2<br>Iris-setosa,4.9,3,1.4,0.2<br>Iris-setosa,4.7,3.2,1.3,0.2<br>Iris-setosa,4.6,3.1,1.5,0.2<br>Iris-setosa,5,3.6,1.4,0.2<br>ps:attribute must is continue,not discrete<br>*\/<br>$inputdata=file($sourcedata);<br>$i=1;<br>while(list($key,$dot_id)=each($inputdata)){<br>$dot_id = trim($dot_id, \" n.\");<br>$kmeandot&#91;$i++]=explode(',',$dot_id);<br>}<br>}<br>\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<br>function caclutime(){<br>$time = explode( \" \", microtime());<br>$usec = (double)$time&#91;0];<br>$sec = (double)$time&#91;1];<br>return $sec + $usec;<br>}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>k-means\u512a\u9ede:\u7c21\u55ae\u6709\u6548\u7387,\u4efb\u4e00\u6f14\u7b97\u6cd5\u6240\u5f97\u4e4b\u7d50\u679c,\u90fd\u53ef\u900f &#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[13],"tags":[],"class_list":["post-463","post","type-post","status-publish","format-standard","hentry","category-dataanalysis"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/systw.net\/note\/wp-json\/wp\/v2\/posts\/463","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/systw.net\/note\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/systw.net\/note\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/systw.net\/note\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/systw.net\/note\/wp-json\/wp\/v2\/comments?post=463"}],"version-history":[{"count":0,"href":"https:\/\/systw.net\/note\/wp-json\/wp\/v2\/posts\/463\/revisions"}],"wp:attachment":[{"href":"https:\/\/systw.net\/note\/wp-json\/wp\/v2\/media?parent=463"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/systw.net\/note\/wp-json\/wp\/v2\/categories?post=463"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/systw.net\/note\/wp-json\/wp\/v2\/tags?post=463"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}