k-means聚类算法python代码并对算法进行性能分析
时间: 2023-07-20 13:40:11 浏览: 113
K-means 聚类算法 python 代码实现
以下是使用Python实现k-means聚类算法的代码:
```python
import numpy as np
import random
def k_means(data, k, max_iter):
# 随机选择k个中心点
centers = random.sample(data, k)
for i in range(max_iter):
# 初始化簇
clusters = [[] for _ in range(k)]
for point in data:
# 计算每个点到中心点的距离
distances = [np.linalg.norm(point - center) for center in centers]
# 将点分配到距离最近的簇
cluster_index = np.argmin(distances)
clusters[cluster_index].append(point)
# 更新中心点为簇内所有点的平均值
new_centers = []
for cluster in clusters:
if cluster:
new_centers.append(np.mean(cluster, axis=0))
else:
# 如果簇内没有点,随机选择一个点作为中心点
new_centers.append(random.choice(data))
# 如果中心点不再改变,算法收敛
if np.allclose(centers, new_centers):
break
centers = new_centers
return clusters, centers
```
下面是对算法的性能分析:
- 时间复杂度:k-means算法的时间复杂度为O(k*n*i),其中k为簇的个数,n为数据点的数量,i为迭代次数。在实际应用中,通常迭代次数不超过20次,因此时间复杂度主要由簇的个数和数据点的数量决定。当k较大时,算法的时间复杂度也会增加。
- 空间复杂度:k-means算法的空间复杂度为O(k*n),主要消耗在存储数据点和簇的信息上。
- 算法的优点:k-means算法简单易实现,对于大规模数据集有较好的可扩展性。
- 算法的缺点:k-means算法需要预先确定簇的个数,且对初始中心点的选择较为敏感,容易陷入局部最优解。同时,k-means算法对于不同形状、密度的簇难以处理。
阅读全文