hambuger_case.java
· 12 KiB · Java
原始檔案
____ ____ _________
import java.util.ArrayList;
____ ____ _________
____ ____ ____
import java.util.List;
____ ____ ____
____ ____ ______
import java.util.Random;
____ ____ ______
______
public class KMeans {
______
_
private static int k;
_
_____________
private static int maxIterations;
_____________
____ ______ _________
private static List<Double[]> centroids;
____ ______ _________
____ _______ ______ ____ ______ __________ _ _____________
public static List<Integer> kMeans(List<Double[]> dataPoints, int k, int maxIterations) {
____ _______ ______ ____ ______ __________ _ _____________
______ _ _
KMeans.k = k;
______ _ _
______ _____________ _____________
KMeans.maxIterations = maxIterations;
______ _____________ _____________
_________ _________
centroids = new ArrayList<>();
_________ _________
_________ ___________________ __________
centroids = initializeCentroids(dataPoints);
_________ ___________________ __________
____ _______ __________________ _________
List<Integer> clusterAssignments = new ArrayList<>();
____ _______ __________________ _________
_ _ _ _____________ _
for (int i = 0; i < maxIterations; i++) {
_ _ _ _____________ _
__________________ ______________ __________
clusterAssignments = assignClusters(dataPoints);
__________________ ______________ __________
____ ______ ____________ _______________ __________ __________________
List<Double[]> newCentroids = updateCentroids(dataPoints, clusterAssignments);
____ ______ ____________ _______________ __________ __________________
_________ ____________
if (converged(newCentroids)) {
_________ ____________
break;
}
_________ ____________
centroids = newCentroids;
_________ ____________
}
__________________
return clusterAssignments;
__________________
}
____ ______ ___________________ ____ __________
private static List<Double[]> initializeCentroids(List<Double[]> dataPoints) {
____ ______ ___________________ ____ __________
____ ______ _________ _________
List<Double[]> centroids = new ArrayList<>();
____ ______ _________ _________
______ ______ ______
Random random = new Random();
______ ______ ______
_ _ _ _
for (int i = 0; i < k; i++) {
_ _ _ _
_____ ______ _______ __________ ____
int index = random.nextInt(dataPoints.size());
_____ ______ _______ __________ ____
_________ ___ __________ ___ _____ _____
centroids.add(dataPoints.get(index).clone());
_________ ___ __________ ___ _____ _____
}
_________
return centroids;
_________
}
____ _______ ______________ ____ ______ __________
private static List<Integer> assignClusters(List<Double[]> dataPoints) {
____ _______ ______________ ____ ______ __________
____ _______ __________________ _________
List<Integer> clusterAssignments = new ArrayList<>();
____ _______ __________________ _________
______ _____ __________
for (Double[] point : dataPoints) {
______ _____ __________
______ ___________ ______ _________
Double minDistance = Double.MAX_VALUE;
______ ___________ ______ _________
_______ _
int cluster = 0;
_______ _
_ _ _________ ____ _
for (int i = 0; i < centroids.size(); i++) {
_ _ _________ ____ _
______ ________ _________________ _____ _________ ___ _
Double distance = calculateDistance(point, centroids.get(i));
______ ________ _________________ _____ _________ ___ _
________ ___________
if (distance < minDistance) {
________ ___________
___________ ________
minDistance = distance;
___________ ________
_______ _
cluster = i;
_______ _
}
}
__________________ ___ _______
clusterAssignments.add(cluster);
__________________ ___ _______
}
__________________
return clusterAssignments;
__________________
}
______ _________________ ______ ______
private static Double calculateDistance(Double[] point1, Double[] point2) {
______ _________________ ______ ______
______ ________ _ _
Double distance = 0.0;
______ ________ _ _
_ _ ______ ______ _
for (int i = 0; i < point1.length; i++) {
_ _ ______ ______ _
________ ____ ___ ______ _ ______ _
distance += Math.pow(point1[i] - point2[i], 2);
________ ____ ___ ______ _ ______ _
}
____ ____ ________
return Math.sqrt(distance);
____ ____ ________
}
____ ______ _______________ ____ ______ __________ ____ _______ __________________
private static List<Double[]> updateCentroids(List<Double[]> dataPoints, List<Integer> clusterAssignments) {
____ ______ _______________ ____ ______ __________ ____ _______ __________________
____ ______ ____________ _________
List<Double[]> newCentroids = new ArrayList<>();
____ ______ ____________ _________
__________ __________ ___ ______
int dimensions = dataPoints.get(0).length;
__________ __________ ___ ______
_ _ _ _
for (int i = 0; i < k; i++) {
_ _ _ _
____ ______ _______________ _________
List<Double[]> pointsInCluster = new ArrayList<>();
____ ______ _______________ _________
_ _ __________ ____ _
for (int j = 0; j < dataPoints.size(); j++) {
_ _ __________ ____ _
__________________ ___ _ _
if (clusterAssignments.get(j) == i) {
__________________ ___ _ _
_______________ ___ __________ ___ _
pointsInCluster.add(dataPoints.get(j));
_______________ ___ __________ ___ _
}
}
_______________ _______
if (pointsInCluster.isEmpty()) {
_______________ _______
____________ ___ ______ __________
newCentroids.add(new Double[dimensions]);
____________ ___ ______ __________
continue;
}
______ ___________ ______ __________
Double[] newCentroid = new Double[dimensions];
______ ___________ ______ __________
_ _ __________ _
for (int d = 0; d < dimensions; d++) {
_ _ __________ _
___
double sum = 0.0;
___
______ _____ _______________
for (Double[] point : pointsInCluster) {
______ _____ _______________
___ _____ _
sum += point[d];
___ _____ _
}
___________ _ ___ _______________ ____
newCentroid[d] = sum / pointsInCluster.size();
___________ _ ___ _______________ ____
}
____________ ___ ___________
newCentroids.add(newCentroid);
____________ ___ ___________
}
____________
return newCentroids;
____________
}
_________ ____ ____________
private static boolean converged(List<Double[]> newCentroids) {
_________ ____ ____________
_ _ _________ ____ _
for (int i = 0; i < centroids.size(); i++) {
_ _ _________ ____ _
_________ ___ _ ______ ____________ ___ _
if (!centroids.get(i).equals(newCentroids.get(i))) {
_________ ___ _ ______ ____________ ___ _
return false;
}
}
return true;
}
____ ______ ____
public static void main(String[] args) {
____ ______ ____
____ ______ __________ _________
List<Double[]> dataPoints = new ArrayList<>();
____ ______ __________ _________
__________ ___ ______
dataPoints.add(new Double[]{1.0, 2.0});
__________ ___ ______
__________ ___ ______
dataPoints.add(new Double[]{1.5, 1.8});
__________ ___ ______
__________ ___ ______
dataPoints.add(new Double[]{5.0, 8.0});
__________ ___ ______
__________ ___ ______
dataPoints.add(new Double[]{8.0, 8.0});
__________ ___ ______
__________ ___ ______
dataPoints.add(new Double[]{1.0, 0.6});
__________ ___ ______
__________ ___ ______
dataPoints.add(new Double[]{9.0, 11.0});
__________ ___ ______
_
int k = 2;
_
_____________
int maxIterations = 100;
_____________
____ _______ ________ ______ __________ _ _____________
List<Integer> clusters = kMeans(dataPoints, k, maxIterations);
____ _______ ________ ______ __________ _ _____________
_ _ __________ ____ _
for (int i = 0; i < dataPoints.size(); i++) {
_ _ __________ ____ _
______ ___ _______ ____ _____ _ _______ __ _______ ________ ___ _
System.out.println("Data point " + (i + 1) + " belongs to cluster " + (clusters.get(i) + 1));
______ ___ _______ ____ _____ _ _______ __ _______ ________ ___ _
}
}
}
| 1 | ____ ____ _________ |
| 2 | import java.util.ArrayList; |
| 3 | ____ ____ _________ |
| 4 | ____ ____ ____ |
| 5 | import java.util.List; |
| 6 | ____ ____ ____ |
| 7 | ____ ____ ______ |
| 8 | import java.util.Random; |
| 9 | ____ ____ ______ |
| 10 | ______ |
| 11 | public class KMeans { |
| 12 | ______ |
| 13 | _ |
| 14 | private static int k; |
| 15 | _ |
| 16 | _____________ |
| 17 | private static int maxIterations; |
| 18 | _____________ |
| 19 | ____ ______ _________ |
| 20 | private static List<Double[]> centroids; |
| 21 | ____ ______ _________ |
| 22 | ____ _______ ______ ____ ______ __________ _ _____________ |
| 23 | public static List<Integer> kMeans(List<Double[]> dataPoints, int k, int maxIterations) { |
| 24 | ____ _______ ______ ____ ______ __________ _ _____________ |
| 25 | ______ _ _ |
| 26 | KMeans.k = k; |
| 27 | ______ _ _ |
| 28 | ______ _____________ _____________ |
| 29 | KMeans.maxIterations = maxIterations; |
| 30 | ______ _____________ _____________ |
| 31 | _________ _________ |
| 32 | centroids = new ArrayList<>(); |
| 33 | _________ _________ |
| 34 | _________ ___________________ __________ |
| 35 | centroids = initializeCentroids(dataPoints); |
| 36 | _________ ___________________ __________ |
| 37 | ____ _______ __________________ _________ |
| 38 | List<Integer> clusterAssignments = new ArrayList<>(); |
| 39 | ____ _______ __________________ _________ |
| 40 | _ _ _ _____________ _ |
| 41 | for (int i = 0; i < maxIterations; i++) { |
| 42 | _ _ _ _____________ _ |
| 43 | __________________ ______________ __________ |
| 44 | clusterAssignments = assignClusters(dataPoints); |
| 45 | __________________ ______________ __________ |
| 46 | ____ ______ ____________ _______________ __________ __________________ |
| 47 | List<Double[]> newCentroids = updateCentroids(dataPoints, clusterAssignments); |
| 48 | ____ ______ ____________ _______________ __________ __________________ |
| 49 | _________ ____________ |
| 50 | if (converged(newCentroids)) { |
| 51 | _________ ____________ |
| 52 | break; |
| 53 | } |
| 54 | _________ ____________ |
| 55 | centroids = newCentroids; |
| 56 | _________ ____________ |
| 57 | } |
| 58 | __________________ |
| 59 | return clusterAssignments; |
| 60 | __________________ |
| 61 | } |
| 62 | ____ ______ ___________________ ____ __________ |
| 63 | private static List<Double[]> initializeCentroids(List<Double[]> dataPoints) { |
| 64 | ____ ______ ___________________ ____ __________ |
| 65 | ____ ______ _________ _________ |
| 66 | List<Double[]> centroids = new ArrayList<>(); |
| 67 | ____ ______ _________ _________ |
| 68 | ______ ______ ______ |
| 69 | Random random = new Random(); |
| 70 | ______ ______ ______ |
| 71 | _ _ _ _ |
| 72 | for (int i = 0; i < k; i++) { |
| 73 | _ _ _ _ |
| 74 | _____ ______ _______ __________ ____ |
| 75 | int index = random.nextInt(dataPoints.size()); |
| 76 | _____ ______ _______ __________ ____ |
| 77 | _________ ___ __________ ___ _____ _____ |
| 78 | centroids.add(dataPoints.get(index).clone()); |
| 79 | _________ ___ __________ ___ _____ _____ |
| 80 | } |
| 81 | _________ |
| 82 | return centroids; |
| 83 | _________ |
| 84 | } |
| 85 | ____ _______ ______________ ____ ______ __________ |
| 86 | private static List<Integer> assignClusters(List<Double[]> dataPoints) { |
| 87 | ____ _______ ______________ ____ ______ __________ |
| 88 | ____ _______ __________________ _________ |
| 89 | List<Integer> clusterAssignments = new ArrayList<>(); |
| 90 | ____ _______ __________________ _________ |
| 91 | ______ _____ __________ |
| 92 | for (Double[] point : dataPoints) { |
| 93 | ______ _____ __________ |
| 94 | ______ ___________ ______ _________ |
| 95 | Double minDistance = Double.MAX_VALUE; |
| 96 | ______ ___________ ______ _________ |
| 97 | _______ _ |
| 98 | int cluster = 0; |
| 99 | _______ _ |
| 100 | _ _ _________ ____ _ |
| 101 | for (int i = 0; i < centroids.size(); i++) { |
| 102 | _ _ _________ ____ _ |
| 103 | ______ ________ _________________ _____ _________ ___ _ |
| 104 | Double distance = calculateDistance(point, centroids.get(i)); |
| 105 | ______ ________ _________________ _____ _________ ___ _ |
| 106 | ________ ___________ |
| 107 | if (distance < minDistance) { |
| 108 | ________ ___________ |
| 109 | ___________ ________ |
| 110 | minDistance = distance; |
| 111 | ___________ ________ |
| 112 | _______ _ |
| 113 | cluster = i; |
| 114 | _______ _ |
| 115 | } |
| 116 | } |
| 117 | __________________ ___ _______ |
| 118 | clusterAssignments.add(cluster); |
| 119 | __________________ ___ _______ |
| 120 | } |
| 121 | __________________ |
| 122 | return clusterAssignments; |
| 123 | __________________ |
| 124 | } |
| 125 | ______ _________________ ______ ______ |
| 126 | private static Double calculateDistance(Double[] point1, Double[] point2) { |
| 127 | ______ _________________ ______ ______ |
| 128 | ______ ________ _ _ |
| 129 | Double distance = 0.0; |
| 130 | ______ ________ _ _ |
| 131 | _ _ ______ ______ _ |
| 132 | for (int i = 0; i < point1.length; i++) { |
| 133 | _ _ ______ ______ _ |
| 134 | ________ ____ ___ ______ _ ______ _ |
| 135 | distance += Math.pow(point1[i] - point2[i], 2); |
| 136 | ________ ____ ___ ______ _ ______ _ |
| 137 | } |
| 138 | ____ ____ ________ |
| 139 | return Math.sqrt(distance); |
| 140 | ____ ____ ________ |
| 141 | } |
| 142 | ____ ______ _______________ ____ ______ __________ ____ _______ __________________ |
| 143 | private static List<Double[]> updateCentroids(List<Double[]> dataPoints, List<Integer> clusterAssignments) { |
| 144 | ____ ______ _______________ ____ ______ __________ ____ _______ __________________ |
| 145 | ____ ______ ____________ _________ |
| 146 | List<Double[]> newCentroids = new ArrayList<>(); |
| 147 | ____ ______ ____________ _________ |
| 148 | __________ __________ ___ ______ |
| 149 | int dimensions = dataPoints.get(0).length; |
| 150 | __________ __________ ___ ______ |
| 151 | _ _ _ _ |
| 152 | for (int i = 0; i < k; i++) { |
| 153 | _ _ _ _ |
| 154 | ____ ______ _______________ _________ |
| 155 | List<Double[]> pointsInCluster = new ArrayList<>(); |
| 156 | ____ ______ _______________ _________ |
| 157 | _ _ __________ ____ _ |
| 158 | for (int j = 0; j < dataPoints.size(); j++) { |
| 159 | _ _ __________ ____ _ |
| 160 | __________________ ___ _ _ |
| 161 | if (clusterAssignments.get(j) == i) { |
| 162 | __________________ ___ _ _ |
| 163 | _______________ ___ __________ ___ _ |
| 164 | pointsInCluster.add(dataPoints.get(j)); |
| 165 | _______________ ___ __________ ___ _ |
| 166 | } |
| 167 | } |
| 168 | _______________ _______ |
| 169 | if (pointsInCluster.isEmpty()) { |
| 170 | _______________ _______ |
| 171 | ____________ ___ ______ __________ |
| 172 | newCentroids.add(new Double[dimensions]); |
| 173 | ____________ ___ ______ __________ |
| 174 | continue; |
| 175 | } |
| 176 | ______ ___________ ______ __________ |
| 177 | Double[] newCentroid = new Double[dimensions]; |
| 178 | ______ ___________ ______ __________ |
| 179 | _ _ __________ _ |
| 180 | for (int d = 0; d < dimensions; d++) { |
| 181 | _ _ __________ _ |
| 182 | ___ |
| 183 | double sum = 0.0; |
| 184 | ___ |
| 185 | ______ _____ _______________ |
| 186 | for (Double[] point : pointsInCluster) { |
| 187 | ______ _____ _______________ |
| 188 | ___ _____ _ |
| 189 | sum += point[d]; |
| 190 | ___ _____ _ |
| 191 | } |
| 192 | ___________ _ ___ _______________ ____ |
| 193 | newCentroid[d] = sum / pointsInCluster.size(); |
| 194 | ___________ _ ___ _______________ ____ |
| 195 | } |
| 196 | ____________ ___ ___________ |
| 197 | newCentroids.add(newCentroid); |
| 198 | ____________ ___ ___________ |
| 199 | } |
| 200 | ____________ |
| 201 | return newCentroids; |
| 202 | ____________ |
| 203 | |
| 204 | } |
| 205 | _________ ____ ____________ |
| 206 | private static boolean converged(List<Double[]> newCentroids) { |
| 207 | _________ ____ ____________ |
| 208 | _ _ _________ ____ _ |
| 209 | for (int i = 0; i < centroids.size(); i++) { |
| 210 | _ _ _________ ____ _ |
| 211 | _________ ___ _ ______ ____________ ___ _ |
| 212 | if (!centroids.get(i).equals(newCentroids.get(i))) { |
| 213 | _________ ___ _ ______ ____________ ___ _ |
| 214 | |
| 215 | return false; |
| 216 | } |
| 217 | } |
| 218 | return true; |
| 219 | } |
| 220 | ____ ______ ____ |
| 221 | public static void main(String[] args) { |
| 222 | ____ ______ ____ |
| 223 | ____ ______ __________ _________ |
| 224 | List<Double[]> dataPoints = new ArrayList<>(); |
| 225 | ____ ______ __________ _________ |
| 226 | __________ ___ ______ |
| 227 | dataPoints.add(new Double[]{1.0, 2.0}); |
| 228 | __________ ___ ______ |
| 229 | __________ ___ ______ |
| 230 | dataPoints.add(new Double[]{1.5, 1.8}); |
| 231 | __________ ___ ______ |
| 232 | __________ ___ ______ |
| 233 | dataPoints.add(new Double[]{5.0, 8.0}); |
| 234 | __________ ___ ______ |
| 235 | __________ ___ ______ |
| 236 | dataPoints.add(new Double[]{8.0, 8.0}); |
| 237 | __________ ___ ______ |
| 238 | __________ ___ ______ |
| 239 | dataPoints.add(new Double[]{1.0, 0.6}); |
| 240 | __________ ___ ______ |
| 241 | __________ ___ ______ |
| 242 | dataPoints.add(new Double[]{9.0, 11.0}); |
| 243 | __________ ___ ______ |
| 244 | _ |
| 245 | int k = 2; |
| 246 | _ |
| 247 | _____________ |
| 248 | int maxIterations = 100; |
| 249 | _____________ |
| 250 | |
| 251 | |
| 252 | |
| 253 | ____ _______ ________ ______ __________ _ _____________ |
| 254 | List<Integer> clusters = kMeans(dataPoints, k, maxIterations); |
| 255 | ____ _______ ________ ______ __________ _ _____________ |
| 256 | |
| 257 | |
| 258 | |
| 259 | _ _ __________ ____ _ |
| 260 | for (int i = 0; i < dataPoints.size(); i++) { |
| 261 | _ _ __________ ____ _ |
| 262 | ______ ___ _______ ____ _____ _ _______ __ _______ ________ ___ _ |
| 263 | System.out.println("Data point " + (i + 1) + " belongs to cluster " + (clusters.get(i) + 1)); |
| 264 | ______ ___ _______ ____ _____ _ _______ __ _______ ________ ___ _ |
| 265 | } |
| 266 | } |
| 267 | } |