了解数据科学初学者的KMeans聚类法
harikabonthu96 ,2021年8月8日
文章视频书
本文是作为数据科学博客马拉松的一部分发表的
简介:聚类是一种非监督性的方法。
聚类是一种无监督的学习方法,其工作是将群体或数据点分成若干组,使一组中的数据点与其他组的数据点更为相似,而不是相差无几。它只不过是基于对象之间的相似性和不相似性的集合。
K-Means聚类是一种无监督的机器学习算法,用于完成聚类任务。在这种方法中,"n "个观察值根据距离被分组为 "K "个集群。该算法试图最小化群组内的差异(以便类似的观测值落在同一个群组中)。
K-Means聚类要求所有的变量都是连续的,因为它使用距离度量和事先指定的聚类数量(K)。
在这篇博客中,我们将学习。
- KMeans算法是如何工作的?
- 距离度量
- 我们如何选择正确的K值?
- 聚类的属性
- 使用sklearn库在Python中实现KMeans聚类
该算法是如何工作的?
在分层聚类方法中,不需要指定K,但对于KMeans,我们需要预先指定K。
- 对于一个给定的K值,随机初始化K个中心点,数据点被划分为K个聚类
- 计算每个输入点与K个中心点之间的距离,并将其重新分配到距离最小的簇中。
- 重新分配后,通过计算集群中数据点的平均值来更新每个集群的中心点
- 重复步骤2-3,直到不需要重新分配。
算法工作的视觉表现(来源)
距离度量
KMeans是一种基于中心点/距离的算法,计算每个点之间的距离,然后将其分配到一个聚类。这个距离可以用以下方法计算
- 欧几里得距离
- 城市街区/曼哈顿距离
欧氏距离和曼哈顿距离测量的公式
聚类的属性
- 一个聚类中的所有数据点应该是相互相似的(同质性)。_聚类内_平方和(WCSS)是一个聚类内所有点到其中心点的平均距离的平方总和。越小越好。
- 来自不同聚类的数据点应该是异质性的。聚类_间_平方和(BCSS)是所有中心点之间的平均距离的平方总和。数值越大,说明聚类越分散,数值越小,说明聚类之间越接近。
我们如何选择正确的K值?
如果我们有二维数据,我们可以用散点图将数据可视化并决定集群的数量。但是,如果我们有多维数据,确实很难可视化。错误的k值可能会导致错误或不稳定的集群。
因此,我们使用一种叫做 "肘部方法 "的技术来获得一个最佳的K值。
在这个方法中,我们绘制出K值范围内的WCSS值。
假设K=3,我们将有三个集群,其集群内平方和分别为WCSS1、WCSS2、WCSS3。总的WCSS是WCSS1、WCSS2、WCSS3之和。
WCSS = WCSS1 + WCSS2 + WCSS3
在计算了WCSS后,将其与不同的K值作对比。在图中寻找一个肘形,以找到最佳的K值。
弯头曲线图解
在上图中,我们可以看到K=4时的弯曲,表明4是最佳的聚类数量。
使用sklearn库在Python中实现KMeans聚类法
我将采用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
从crime_data.csv创建pandas数据框架
data = pd.read_csv("crime_data.csv")
data.head()
检查是否有任何空值
data.isnull().any()
丢弃分类特征,将剩余的数据复制到另一个数据框中
mydata = data.iloc[:, data.columns!=’Unnamed: 0']
mydata.head()
缩放数据(使用MinMaxScaler
scaler = MinMaxScaler()
norm_mydata = mydata.copy()
def minmaxscaler(x):
for columnName, columnData in x.iteritems():
x[columnName] = scaler.fit_transform(np.array(columnData).reshape(-1, 1))
minmaxscaler(norm_mydata)
norm_mydata.head()
用Scree图或Elbow图来寻找K
k = list(range(2,11))
sum_of_squared_distances = []
for i in k:
kmeans = KMeans(n_clusters=i)
kmeans.fit(norm_mydata)
sum_of_squared_distances.append(kmeans.inertia_)
plt.figure(figsize=(10, 5))
plt.plot(k, sum_of_squared_distances, 'go--')
plt.xlabel('Number of Clusters')
plt.ylabel('Within Cluster Sum of squares')
plt.title('Elbow Curve to find optimum K')
肘部曲线(图片由作者提供
从上图中,我们发现K=4是最佳值。
用K=4建立KMeans模型(训练和预测
# Instantiating
kmeans4 = KMeans(n_clusters = 4)
# Training the model
kmeans4.fit(norm_mydata)
# predicting
y_pred = kmeans4.fit_predict(norm_mydata)
print(y_pred)
# Storing the y_pred values in a new column
data['Cluster'] = y_pred+1 #to start the cluster number from 1
将中心点存储到一个数据框中
centroids = kmeans4.cluster_centers_
centroids = pd.DataFrame(centroids, columns=['Murder', 'Assault', 'UrbanPop', 'Rape'])
centroids.index = np.arange(1, len(centroids)+1) # Start the index from 1
centroids
聚类的视觉化样本
让我们只取其中任何两个特征并绘制,看看观察结果是如何聚类的。
import seaborn as sns
plt.figure(figsize=(12,6))
sns.set_palette("pastel")
sns.scatterplot(x=data['Murder'], y = data['Assault'], hue=data['Cluster'], palette='bright')
聚类的可视化
结束语
在这篇博客中,我们已经了解了KMeans算法的工作原理,使用的不同距离度量,以及寻找正确K值的肘部曲线法。我希望你喜欢阅读这篇文章,欢迎与你的学习伙伴们分享。
请查看我以前关于KModes聚类的文章。
参考资料
我的其他博客文章
欢迎阅读我在Analytics Vidhya简介中的其他博文。
你可以在LinkedIn和Twitter上找到我,如果你想联系的话。我很高兴能与你联系。
如需立即交流思想,请写信给我[email protected]。
学习愉快!
本文所展示的媒体不属于Analytics Vidhya所有,由作者自行决定使用。
[
下一篇文章
如何用Python构建一个价格推荐的应用程序
](www.analyticsvidhya.com/blog/2021/0…
上一篇
使用OpenCV实现卷积作为一个图像过滤器
](www.analyticsvidhya.com/blog/2021/0…)