means聚类是一种基于距离的聚类算法,它通过反复计算每个样本与各个聚类中心的距离,并将样本分配到距离最近的聚类中心所属的类别中。本文将详细介绍如何使用Python实现means聚类算法。
一、数据预处理
在进行聚类之前,我们需要对数据进行预处理。首先,导入所需要的库:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
接下来,我们可以使用sklearn库中的数据集来生成一些测试数据:
iris = datasets.load_iris()
X = iris.data
数据预处理的一项重要任务是对数据进行标准化,以确保所有特征具有相同的重要性。可以使用sklearn库的StandardScaler类来实现:
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
二、计算距离
在means聚类算法中,需要用到距离的计算。常用的距离计算方法有欧式距离、曼哈顿距离等。这里我们以欧式距离为例:
def euclidean_distance(a, b):
return np.sqrt(np.sum((a - b) ** 2))
# 示例
point1 = np.array([0, 0])
point2 = np.array([3, 4])
distance = euclidean_distance(point1, point2)
print(distance)
三、初始化聚类中心
在算法初始阶段,需要随机选择一些样本作为聚类中心。以下是一个简单的示例:
def init_centers(X, k):
np.random.seed(42)
indices = np.random.choice(range(len(X)), k, replace=False)
centers = X[indices]
return centers
# 示例
centers = init_centers(X_scaled, 3)
print(centers)
四、分配样本到最近的聚类中心
在means聚类算法的每一次迭代中,需要将每个样本分配到距离最近的聚类中心所属的类别中。以下是一个简单的实现:
def assign_samples(X, centers):
n_samples = len(X)
labels = np.zeros(n_samples)
for i in range(n_samples):
distances = [euclidean_distance(X[i], center) for center in centers]
cluster_index = np.argmin(distances)
labels[i] = cluster_index
return labels
# 示例
labels = assign_samples(X_scaled, centers)
print(labels)
五、更新聚类中心
在means聚类算法的每一次迭代中,需要更新聚类中心。以下是一个简单的实现:
def update_centers(X, labels, k):
centers = np.zeros((k, X.shape[1]))
for i in range(k):
cluster_samples = X[labels == i]
centers[i] = np.mean(cluster_samples, axis=0)
return centers
# 示例
centers = update_centers(X_scaled, labels, 3)
print(centers)
六、迭代直到收敛
最后,我们需要将上述的步骤迭代执行,直到聚类中心不再变化为止:
def kmeans(X, k, max_iters):
centers = init_centers(X, k)
for _ in range(max_iters):
labels = assign_samples(X, centers)
new_centers = update_centers(X, labels, k)
if np.all(centers == new_centers):
break
centers = new_centers
return labels, centers
# 示例
labels, centers = kmeans(X_scaled, 3, max_iters=100)
print(labels)
七、结果可视化
最后,我们可以使用matplotlib库将聚类结果可视化:
def plot_clusters(X, labels, centers):
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis')
plt.scatter(centers[:, 0], centers[:, 1], marker='X', s=200, c='red')
plt.show()
plot_clusters(X_scaled, labels, centers)
以上就是使用Python实现means聚类算法的完整代码示例。通过对数据预处理、距离计算、初始化聚类中心、分配样本到最近的聚类中心、更新聚类中心以及迭代直到收敛等步骤的实现,我们可以得到一组聚类结果,并通过结果可视化进行观察和分析。
原创文章,作者:ZYQT,如若转载,请注明出处:https://www.beidandianzhu.com/g/5746.html