用python实验聚类k-平均算法
时间: 2024-05-07 07:23:30 浏览: 58
好的,让我们来实现 k-平均算法(k-means clustering)。
首先,我们需要导入必要的库:
```python
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
```
接下来,我们可以使用 `make_blobs` 函数生成一些模拟数据:
```python
X, y = make_blobs(n_samples=200, centers=4, n_features=2, random_state=42)
```
这会生成一个包含 200 个样本和 2 个特征的数据集,其中有 4 个不同的簇。现在,我们可以可视化这些数据:
```python
plt.scatter(X[:, 0], X[:, 1])
plt.show()
```
这会生成以下散点图:
![k-means-1.png](attachment:k-means-1.png)
现在我们来实现 k-平均算法。首先,我们需要初始化一些随机的簇中心。我们可以使用 `np.random.choice` 函数从数据集中选择一些随机的样本作为初始簇中心:
```python
def initialize_centers(X, k):
idx = np.random.choice(len(X), k, replace=False)
centers = X[idx]
return centers
```
接下来,我们需要计算每个样本到每个簇中心的距离。这可以通过计算欧几里得距离来实现:
```python
def compute_distances(X, centers):
distances = np.zeros((len(X), len(centers)))
for i, x in enumerate(X):
for j, c in enumerate(centers):
distances[i, j] = np.sqrt(np.sum((x - c) ** 2))
return distances
```
现在,我们可以将每个样本分配到距离其最近的簇中心:
```python
def assign_clusters(X, centers):
distances = compute_distances(X, centers)
clusters = np.argmin(distances, axis=1)
return clusters
```
接下来,我们需要更新每个簇的中心。这可以通过计算每个簇中所有样本的平均值来实现:
```python
def update_centers(X, clusters, k):
centers = np.zeros((k, X.shape[1]))
for i in range(k):
centers[i] = np.mean(X[clusters == i], axis=0)
return centers
```
最后,我们可以将所有这些步骤组合到一起,并迭代执行它们,直到簇中心不再变化或达到最大迭代次数为止:
```python
def k_means(X, k, max_iter=100):
centers = initialize_centers(X, k)
for i in range(max_iter):
old_centers = np.copy(centers)
clusters = assign_clusters(X, centers)
centers = update_centers(X, clusters, k)
if np.allclose(centers, old_centers):
break
return clusters, centers
```
现在,我们可以使用上面的 `k_means` 函数来对数据进行聚类,并可视化结果:
```python
clusters, centers = k_means(X, k=4)
plt.scatter(X[:, 0], X[:, 1], c=clusters)
plt.scatter(centers[:, 0], centers[:, 1], marker='X', color='red', s=200)
plt.show()
```
这会生成以下散点图:
![k-means-2.png](attachment:k-means-2.png)
我们可以看到,k-平均算法成功地将数据分成了 4 个簇,并且簇中心位于每个簇的中心。
阅读全文