用python实现一个简单的kmeans算法实例
时间: 2023-12-28 16:03:30 浏览: 126
Python KMeans算法实现实例
好的,下面是一个简单的KMeans算法的Python实现示例:
```python
import random
import math
class KMeans:
def __init__(self, k, data):
self.k = k
self.data = data
self.centroids = []
self.clusters = [[] for _ in range(self.k)]
def run(self, max_iterations):
self._init_centroids()
for i in range(max_iterations):
self._assign_clusters()
old_centroids = self.centroids[:]
self._update_centroids()
if self._has_converged(old_centroids):
break
return self.clusters
def _init_centroids(self):
self.centroids = random.sample(self.data, self.k)
def _assign_clusters(self):
self.clusters = [[] for _ in range(self.k)]
for point in self.data:
distances = [math.dist(point, centroid) for centroid in self.centroids]
closest_centroid_idx = distances.index(min(distances))
self.clusters[closest_centroid_idx].append(point)
def _update_centroids(self):
for i, cluster in enumerate(self.clusters):
if cluster:
self.centroids[i] = [sum(col) / len(cluster) for col in zip(*cluster)]
def _has_converged(self, old_centroids):
return set(tuple(x) for x in self.centroids) == set(tuple(x) for x in old_centroids)
```
这个实现包含一个 `KMeans` 类,它接受两个输入参数:`k` 和 `data`。 `k` 是要聚类的数量, `data` 是要聚类的数据集。
`run` 方法运行KMeans算法,并返回一个列表,表示每个聚类中的点。 `max_iterations` 参数确定算法运行的最大迭代次数。
在 `run` 方法中,我们首先初始化质心,然后在最大迭代次数内进行循环,直到质心不再变化或达到最大迭代次数为止。在每个迭代中,我们分别执行以下操作:
- 将每个点分配到与其最近的质心所在的聚类中。
- 更新每个聚类的质心以反映该聚类中所有点的平均值。
- 检查质心是否已经收敛,如果是,则停止迭代。
该实现使用欧几里得距离来计算点之间的距离。
阅读全文