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值。
# 肘部法则计算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()