मध्यम 0 हल किए गए 0% स्वीकृति

K-Means Clustering

Group points into k clusters by repeatedly assigning them to the nearest centroid and moving the centroids.

आप क्या सीखेंगे

  • Assign points to the nearest centroid
  • Move centroids to the cluster mean
  • Iterate an algorithm until it settles

समस्या

अनुवाद दिखाएँ

K-means finds groups in unlabeled data. Starting from the given centroids, repeat iterations times:

  1. Assign: put each point in the cluster of its nearest centroid (Euclidean distance). If two centroids are equally close, choose the one with the smaller index.
  2. Update: move each centroid to the average of the points assigned to it. A centroid with no points stays where it is.

Implement k_means(points, centroids, iterations).

Input

points: The data points, each a list of coordinates.

centroids: The k starting centroids, with the same number of coordinates.

iterations: How many assign-and-update rounds to run.

Output

Return the final centroids in their original order.

सीमाएँ

1 ≤ number of points ≤ 1,000, 1 ≤ k ≤ 20, 1 ≤ dimensions ≤ 10

0 ≤ iterations ≤ 100

-1,000 ≤ each coordinate ≤ 1,000

उदाहरण

उदाहरण 1
इनपुट:
points = [
    [1.0, 1.0],
    [1.5, 2.0],
    [8.0, 8.0],
    [9.0, 8.5]
]
centroids = [
    [0.0, 0.0],
    [10.0, 10.0]
]
iterations = 1

अपेक्षित आउटपुट:
expected = [
    [1.25, 1.5],
    [8.5, 8.25]
]
इनपुट:
std::vector<std::vector<double>> points = {
    {1.0, 1.0},
    {1.5, 2.0},
    {8.0, 8.0},
    {9.0, 8.5}
};
std::vector<std::vector<double>> centroids = {
    {0.0, 0.0},
    {10.0, 10.0}
};
long long iterations = 1;

अपेक्षित आउटपुट:
std::vector<std::vector<double>> expected = {
    {1.25, 1.5},
    {8.5, 8.25}
};
इनपुट:
double[][] points = new double[][] {
    new double[] {1.0, 1.0},
    new double[] {1.5, 2.0},
    new double[] {8.0, 8.0},
    new double[] {9.0, 8.5}
};
double[][] centroids = new double[][] {
    new double[] {0.0, 0.0},
    new double[] {10.0, 10.0}
};
long iterations = 1;

अपेक्षित आउटपुट:
double[][] expected = new double[][] {
    new double[] {1.25, 1.5},
    new double[] {8.5, 8.25}
};

व्याख्या

The first two points are nearer to (0, 0) and the last two nearer to (10, 10). The new centroids are the averages: ((1 + 1.5) / 2, (1 + 2) / 2) = (1.25, 1.5) and ((8 + 9) / 2, (8 + 8.5) / 2) = (8.5, 8.25).

उदाहरण 2
इनपुट:
points = [
    [0.0],
    [1.0],
    [10.0]
]
centroids = [
    [0.0],
    [100.0]
]
iterations = 2

अपेक्षित आउटपुट:
expected = [
    [3.666667],
    [100.0]
]
इनपुट:
std::vector<std::vector<double>> points = {
    {0.0},
    {1.0},
    {10.0}
};
std::vector<std::vector<double>> centroids = {
    {0.0},
    {100.0}
};
long long iterations = 2;

अपेक्षित आउटपुट:
std::vector<std::vector<double>> expected = {
    {3.666667},
    {100.0}
};
इनपुट:
double[][] points = new double[][] {
    new double[] {0.0},
    new double[] {1.0},
    new double[] {10.0}
};
double[][] centroids = new double[][] {
    new double[] {0.0},
    new double[] {100.0}
};
long iterations = 2;

अपेक्षित आउटपुट:
double[][] expected = new double[][] {
    new double[] {3.666667},
    new double[] {100.0}
};

व्याख्या

Round 1: (100) is far from every point, so all three points join centroid 1, which moves to (0 + 1 + 10) / 3 ≈ 3.666667; centroid 2 gets no points and stays at 100. Round 2 assigns the same way, so the result is [[3.666667], [100]].

संदर्भ

यह चुनौती CodeUtility के लिए अनुकूलित की गई है। ऊपर दिए गए स्टेटमेंट और सीमाओं का पालन करें।

दूसरों से सीखें

समुदाय समाधान

अभी तक कोई प्रकाशित समाधान नहीं। पहला साझा करने के लिए इस चुनौती को हल करें।