KMeans聚类算法详解

KMeans聚类是一种无监督学习方法,其任务是将数据点分成多个组,使得同一组内的数据点彼此相似,而与其他组的数据点不同。这种算法基于相似性和差异性将对象集合在一起。

KMeans聚类算法的工作机制

KMeans聚类算法需要预先指定聚类的数量K。对于给定的K值,随机初始化K个质心,并将数据点分配到K个聚类中。算法计算每个输入点到K个质心的距离,并将其重新分配到距离最小的聚类中。重新分配后,通过计算聚类中数据点的平均值来更新每个聚类的质心。重复步骤2-3,直到没有重新分配为止。

距离度量

KMeans是一种基于质心/距离的算法,它计算每个点之间的距离,然后将它们分配到聚类中。距离可以使用欧几里得距离或曼哈顿距离来计算。

# 欧几里得距离和曼哈顿距离的公式 def euclidean_distance(point1, point2): return np.sqrt(np.sum((point1 - point2) ** 2)) def manhattan_distance(point1, point2): return np.sum(np.abs(point1 - point2))

聚类的性质

聚类中的所有数据点应该彼此相似(同质性)。聚类内平方和(WCSS)是聚类中所有点到其质心的平均距离的平方和。值越小越好。不同聚类中的数据点应该是异质的。聚类间平方和(BCSS)是所有质心之间的平均距离的平方和。值越大表示聚类分散,值越小表示聚类靠近。

如何选择正确的K值

如果有二维数据,可以使用散点图来可视化数据并决定聚类的数量。但如果有多维数据,可视化就变得困难。错误的K值可能导致错误的或不稳定的聚类。因此,使用肘部法则来获得最优的K值。

# 肘部法则计算WCSS wcss = [] for i in range(1, 11): kmeans = KMeans(n_clusters=i, init='k-means++', random_state=42) kmeans.fit(norm_mydata) wcss.append(kmeans.inertia_)

通过计算不同K值的WCSS并绘制肘部曲线,可以找到最优的K值。

将使用crime_data.csv数据集进行实现。该数据集包含五个特征:州、谋杀率、攻击率、城市人口和强奸率。首先,需要导入必要的库。

import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.cluster import KMeans from sklearn.preprocessing import MinMaxScaler data = pd.read_csv("crime_data.csv") mydata = data.drop('Unnamed: 0', axis=1) scaler = MinMaxScaler() norm_mydata = scaler.fit_transform(mydata) kmeans4 = KMeans(n_clusters=4, random_state=42) kmeans4.fit(norm_mydata) y_pred = kmeans4.predict(norm_mydata) data['Cluster'] = y_pred + 1 import seaborn as sns plt.figure(figsize=(12, 6)) sns.scatterplot(x=data['Murder'], y=data['Assault'], hue=data['Cluster'], palette='bright') plt.show()
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485