帮我写一个基于python语言的Kmeans聚类
时间: 2024-05-02 19:18:58 浏览: 81
基于Python实现并测试K-means聚类算法【100011717】
以下是基于Python语言的Kmeans聚类的代码示例:
```python
import numpy as np
import random
class KMeans:
def __init__(self, k, max_iterations=100):
self.k = k
self.max_iterations = max_iterations
def fit(self, X):
centroids = self._init_centroids(X)
for i in range(self.max_iterations):
clusters = self._create_clusters(X, centroids)
new_centroids = self._calculate_centroids(clusters)
if np.allclose(centroids, new_centroids):
break
centroids = new_centroids
return centroids, clusters
def predict(self, X, centroids):
clusters = self._create_clusters(X, centroids)
return clusters
def _init_centroids(self, X):
n_samples = X.shape[0]
idx = np.random.choice(n_samples, self.k, replace=False)
centroids = X[idx, :]
return centroids
def _create_clusters(self, X, centroids):
clusters = [[] for _ in range(self.k)]
for idx, sample in enumerate(X):
distances = np.linalg.norm(sample - centroids, axis=1)
closest_centroid = np.argmin(distances)
clusters[closest_centroid].append(idx)
return clusters
def _calculate_centroids(self, clusters):
centroids = []
for cluster in clusters:
cluster_mean = np.mean(cluster, axis=0)
centroids.append(cluster_mean)
return np.array(centroids)
# Example usage:
X = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]])
kmeans = KMeans(k=2)
centroids, clusters = kmeans.fit(X)
print("Centroids:", centroids)
print("Clusters:", clusters)
```
在这个示例中,我们首先定义了一个`KMeans`类,该类有`__init__`、`fit`和`predict`方法。`__init__`方法初始化模型的超参数,`fit`方法用于训练模型,`predict`方法用于预测新的数据点。
在`fit`方法中,我们首先使用`_init_centroids`方法初始化k个聚类中心,然后在循环中进行以下操作:
1. 使用`_create_clusters`方法将每个数据点分配到最近的聚类中心。
2. 使用`_calculate_centroids`方法重新计算每个聚类的中心。
3. 如果新计算出的聚类中心和旧的聚类中心非常接近,则退出循环。
在`_create_clusters`方法中,我们计算每个数据点到每个聚类中心的距离,并将每个数据点分配到距离最近的聚类中心。
在`_calculate_centroids`方法中,我们计算每个聚类中心的新位置,即该聚类中所有数据点的平均值。
最后,我们使用`KMeans`类对示例数据进行聚类,并输出聚类中心和每个数据点所属的聚类。
阅读全文