k-means聚类算法python实验
时间: 2023-09-30 14:02:56 浏览: 113
好的,让我们来实现一下k-means聚类算法的Python代码吧!
首先,我们需要导入一些必要的库,包括numpy、matplotlib和sklearn等:
```python
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
```
接下来,我们可以使用make_blobs函数生成一些随机数据来测试我们的聚类算法。这些数据的特征数量为2,聚类数量为3,标准差为1.0:
```python
# 生成随机数据
X, y = make_blobs(n_samples=300, centers=3, n_features=2, cluster_std=1.0, random_state=42)
```
然后,我们可以使用matplotlib将数据可视化,看一看数据的分布情况:
```python
# 将生成的数据可视化
plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='viridis')
plt.show()
```
接下来,我们可以实现k-means算法的核心部分。首先,我们需要定义一个函数来计算两个向量之间的欧几里得距离:
```python
def euclidean_distance(x1, x2):
return np.sqrt(np.sum((x1 - x2)**2))
```
然后,我们可以定义k-means算法的主要函数。该函数需要指定数据集X、聚类数量k和最大迭代次数max_iter:
```python
def k_means(X, k, max_iter=100):
# 随机初始化k个质心
centroids = X[np.random.choice(len(X), k, replace=False)]
# 进行最大max_iter次迭代
for i in range(max_iter):
# 计算每个样本到k个质心的距离
distances = []
for j in range(k):
distances.append(euclidean_distance(X, centroids[j]))
distances = np.array(distances).T
# 将样本划分到距离最近的质心所在的簇中
labels = np.argmin(distances, axis=1)
# 更新每个簇的质心
for j in range(k):
centroids[j] = np.mean(X[labels == j], axis=0)
return labels, centroids
```
最后,我们可以调用k-means函数来进行聚类,然后再次使用matplotlib将聚类结果可视化:
```python
# 运行k-means算法
labels, centroids = k_means(X, k=3)
# 将聚类结果可视化
plt.scatter(X[:, 0], X[:, 1], c=labels, s=50, cmap='viridis')
plt.scatter(centroids[:, 0], centroids[:, 1], c='black', s=200, alpha=0.5)
plt.show()
```
这样,我们就完成了k-means聚类算法的Python实验!
阅读全文