python语言,使用kmeans++算法进行聚类
时间: 2023-12-02 12:08:53 浏览: 30
好的,下面是使用 Python 语言实现 kmeans++ 算法进行聚类的示例代码:
```python
import numpy as np
def euclidean_distance(x1, x2):
return np.sqrt(np.sum((x1 - x2)**2))
class KMeans:
def __init__(self, k=5, max_iters=100, plot_steps=False):
self.k = k
self.max_iters = max_iters
self.plot_steps = plot_steps
# 初始化聚类中心点
self.centroids = None
# 记录每个数据点所属的聚类
self.clusters = None
def initialize_centroids(self, X):
n_samples, n_features = X.shape
centroids = np.zeros((self.k, n_features))
# 随机选择第一个聚类中心点
random_idx = np.random.choice(n_samples)
centroids[0] = X[random_idx]
# 选择剩下的聚类中心点
for i in range(1, self.k):
# 计算每个样本到最近的聚类中心的距离平方和
distances = np.zeros((n_samples, i))
for j in range(i):
distances[:, j] = np.apply_along_axis(euclidean_distance, 1, X, centroids[j])
min_distances = np.min(distances, axis=1)
# 概率选择下一个聚类中心点
probabilities = min_distances / np.sum(min_distances)
random_idx = np.random.choice(n_samples, p=probabilities)
centroids[i] = X[random_idx]
return centroids
def assign_clusters(self, X):
n_samples = X.shape[0]
distances = np.zeros((n_samples, self.k))
for i in range(self.k):
distances[:, i] = np.apply_along_axis(euclidean_distance, 1, X, self.centroids[i])
self.clusters = np.argmin(distances, axis=1)
def update_centroids(self, X):
for i in range(self.k):
self.centroids[i] = np.mean(X[self.clusters == i], axis=0)
def fit(self, X):
self.centroids = self.initialize_centroids(X)
for i in range(self.max_iters):
self.assign_clusters(X)
if self.plot_steps:
self.plot(X)
old_centroids = self.centroids.copy()
self.update_centroids(X)
if np.allclose(self.centroids, old_centroids):
break
def predict(self, X):
distances = np.zeros((X.shape[0], self.k))
for i in range(self.k):
distances[:, i] = np.apply_along_axis(euclidean_distance, 1, X, self.centroids[i])
return np.argmin(distances, axis=1)
```
这里我们使用 numpy 库来进行计算。首先定义一个计算欧式距离的函数 `euclidean_distance`,然后定义 `KMeans` 类。在 `__init__` 方法中,我们设置了聚类数量 `k`,最大迭代次数 `max_iters` 和是否绘制聚类过程的标志 `plot_steps`,并初始化了聚类中心点和聚类结果。
我们实现了三个方法来完成 kmeans++ 算法的聚类过程。`initialize_centroids` 方法用于初始化聚类中心点,首先随机选择一个数据点作为第一个聚类中心,然后根据概率选择下一个聚类中心点,直到选择完所有的聚类中心点。具体实现过程可以参考 kmeans++ 算法的原理。
`assign_clusters` 方法用于将每个数据点分配到最近的聚类中心。我们计算每个数据点到所有聚类中心的距离,并将其分配到距离最近的聚类中心。
`update_centroids` 方法用于更新聚类中心点。我们将每个聚类中所有数据点的坐标取平均值,得到新的聚类中心点。
最后,我们定义 `fit` 和 `predict` 方法来训练模型和预测新的数据点的聚类结果。在 `fit` 方法中,我们先初始化聚类中心点,然后进行多次迭代,每次迭代都将数据点分配到最近的聚类中心,并更新聚类中心点。如果聚类中心点不再变化,停止迭代。在 `predict` 方法中,我们计算新数据点到所有聚类中心的距离,并将其分配到距离最近的聚类中心。
这是一个简单的 kmeans++ 算法实现,你可以根据自己的需要进行调整和改进。