Advertisement
Guest User

Untitled

a guest
Oct 21st, 2016
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.02 KB | None | 0 0
  1. <?php
  2.  
  3. function makeMatrix($columns, $rows) {
  4. $matrix = array();
  5. for ($i = 0; $i < $columns; $i ++) {
  6. $column = array();
  7. for ($j = 0; $j < $rows; $j ++) {
  8. $column[] = 0;
  9. }
  10. $matrix[] = $column;
  11. }
  12. return $matrix;
  13. }
  14.  
  15. function uniqueCountSorted($input) {
  16. $uniqueValueCount = 0;
  17. $lastSeenValue = FALSE;
  18. for ($i = 0; $i < count($input); $i++) {
  19. if ($i === 0 || $input[$i] !== $lastSeenValue) {
  20. $lastSeenValue = $input[$i];
  21. $uniqueValueCount ++;
  22. }
  23. }
  24. return $uniqueValueCount;
  25. }
  26.  
  27. function ckmeans($data, $nClusters) {
  28. if ($nClusters > count($data)) {
  29. throw Exception('Cannot generate more classes than there are data values');
  30. }
  31. sort($data);
  32. $sorted = $data;
  33. $uniqueCount = uniqueCountSorted($sorted);
  34.  
  35. $matrix = makeMatrix($nClusters, count($data));
  36. $backtrackMatrix = makeMatrix($nClusters, count($data));
  37.  
  38. for ($cluster = 0; $cluster < $nClusters; $cluster ++) {
  39. $firstClusterMean = $sorted[0];
  40. for ($sortedIdx = max($cluster, 1); $sortedIdx < count($sorted); $sortedIdx ++) {
  41. if ($cluster === 0) {
  42. $squaredDifference = pow($sorted[$sortedIdx] - $firstClusterMean, 2);
  43. $matrix[$cluster][$sortedIdx] = $matrix[$cluster][$sortedIdx - 1] + ($sortedIdx / ($sortedIdx + 1)) * $squaredDifference;
  44. $newSum = $sortedIdx * $firstClusterMean + $sorted[$sortedIdx];
  45. $firstClusterMean = $newSum / ($sortedIdx + 1);
  46. }
  47. else {
  48. $sumSquaredDistances = 0;
  49. $meanXJ = 0;
  50.  
  51. for ($j = $sortedIdx; $j >= $cluster; $j --) {
  52. $sumSquaredDistances += ($sortedIdx - $j) / ($sortedIdx - $j + 1) * pow($sorted[$j] - $meanXJ, 2);
  53.  
  54. $meanXJ = ($sorted[$j] + ($sortedIdx - $j) * $meanXJ) / ($sortedIdx - $j + 1);
  55.  
  56. if ($j === $sortedIdx) {
  57. $matrix[$cluster][$sortedIdx] = $sumSquaredDistances;
  58. $backtrackMatrix[$cluster][$sortedIdx] = $j;
  59. if ($j > 0) {
  60. $matrix[$cluster][$sortedIdx] += $matrix[$cluster - 1][$j - 1];
  61. }
  62. }
  63. else {
  64. if ($j === 0) {
  65. if ($sumSquaredDistances <= $matrix[$cluster][$sortedIdx]) {
  66. $matrix[$cluster][$sortedIdx] = $sumSquaredDistances;
  67. $backtrackMatrix[$cluster][$sortedIdx] = $j;
  68. }
  69. }
  70. else if ($sumSquaredDistances + $matrix[$cluster - 1][$j - 1] < $matrix[$cluster][$sortedIdx]) {
  71. $matrix[$cluster][$sortedIdx] = $sumSquaredDistances + $matrix[$cluster - 1][$j - 1];
  72. $backtrackMatrix[$cluster][$sortedIdx] = $j;
  73. }
  74. }
  75. }
  76. }
  77. }
  78. }
  79.  
  80. $clusters = array();
  81. $clusterRight = count($backtrackMatrix[0]) - 1;
  82.  
  83. for ($cluster = count($backtrackMatrix) - 1; $cluster >= 0; $cluster --) {
  84. $clusterLeft = $backtrackMatrix[$cluster][$clusterRight];
  85.  
  86. $clusters[$cluster] = array_slice($sorted, $clusterLeft, ($clusterRight + 1) - $clusterLeft);
  87. if ($cluster > 0) {
  88. $clusterRight = $clusterLeft - 1;
  89. }
  90. }
  91.  
  92. return $clusters;
  93. }
  94.  
  95. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement