A K-means célja a következő célfüggvény minimalizálása: ahol: - : A -edik klaszterhez tartozó pontok halmaza, - : A -edik klaszter középpontja.
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
# Mintaadatok generálása
X, y = make_blobs(n_samples=300, centers=4, cluster_std=0.6, random_state=0)
# K-means futtatása
kmeans = KMeans(n_clusters=4, init='k-means++', max_iter=300, n_init=10, random_state=0)
y_kmeans = kmeans.fit_predict(X)
# Eredmények vizualizálása
plt.scatter(X, X, c=y_kmeans, cmap='viridis', marker='o')
plt.scatter(kmeans.cluster_centers_, kmeans.cluster_centers_, s=200, c='red', marker='X')
plt.title("K-means klaszterezés")
plt.xlabel("X tengely")
plt.ylabel("Y tengely")
plt.show()
#include <iostream>
#include <vector>
#include <cmath>
#include <cstdlib>
#include <limits>
using namespace std;
// Euklideszi távolság számítása
double euclidean_distance(const vector<double>& a, const vector<double>& b) {
double sum = 0.0;
for (size_t i = 0; i < a.size(); ++i) {
sum += (a - b) * (a - b);
}
return sqrt(sum);
}
// K-means algoritmus
void kmeans(const vector<vector<double>>& data, int k, int max_iterations) {
int n = data.size(); // Adatpontok száma
int d = data.size(); // Dimenziók száma
vector<vector<double>> centroids(k, vector<double>(d)); // Középpontok
vector<int> labels(n); // Klaszter címkék
// Középpontok inicializálása véletlenszerűen
for (int i = 0; i < k; ++i) {
centroids = data;
}
for (int iter = 0; iter < max_iterations; ++iter) {
// Hozzárendelés lépés
for (int i = 0; i < n; ++i) {
double min_dist = numeric_limits<double>::max();
for (int j = 0; j < k; ++j) {
double dist = euclidean_distance(data, centroids);
if (dist < min_dist) {
min_dist = dist;
labels = j;
}
}
}
// Középpont frissítés lépés
vector<vector<double>> new_centroids(k, vector<double>(d, 0.0));
vector<int> counts(k, 0);
for (int i = 0; i < n; ++i) {
int cluster = labels;
for (int j = 0; j < d; ++j) {
new_centroids += data;
}
counts++;
}
for (int j = 0; j < k; ++j) {
for (int l = 0; l < d; ++l) {
new_centroids /= counts;
}
}
centroids = new_centroids;
}
// Eredmények kiírása
for (int i = 0; i < n; ++i) {
cout << "Adatpont: ";
for (double val : data) {
cout << val << " ";
}
cout << " -> Klaszter: " << labels << endl;
}
}
int main() {
vector<vector<double>> data = {
{1.0, 2.0}, {1.5, 1.8}, {5.0, 8.0}, {8.0, 8.0},
{1.0, 0.6}, {9.0, 11.0}, {8.0, 2.0}, {10.0, 2.0}, {9.0, 3.0}
};
int k = 3;
int max_iterations = 100;
kmeans(data, k, max_iterations);
return 0;
}
A K-means egy hatékony és gyors klaszterezési algoritmus, amely ideális jól elkülönülő gömb alakú klaszterek azonosítására. Bár korlátai vannak, mint például az érzékenység az inicializációra és az outlierekre, továbbfejlesztett változatai, például a K-means++, jelentős javulást nyújtanak. Széles körben alkalmazzák adatbányászati és gépi tanulási problémákban.