数据分析必看:聚类分析法-K-means聚类

737 阅读5分钟

初学者聚类数据科学机器学习python

了解数据科学初学者的KMeans聚类法

harikabonthu96 ,2021年8月8日

文章视频书

本文是作为数据科学博客马拉松的一部分发表的

image | Kmeans clustering

简介:聚类是一种非监督性的方法。

聚类是一种无监督的学习方法,其工作是将群体或数据点分成若干组,使一组中的数据点与其他组的数据点更为相似,而不是相差无几。它只不过是基于对象之间的相似性和不相似性的集合。

K-Means聚类是一种无监督的机器学习算法,用于完成聚类任务。在这种方法中,"n "个观察值根据距离被分组为 "K "个集群。该算法试图最小化群组内的差异(以便类似的观测值落在同一个群组中)。

K-Means聚类要求所有的变量都是连续的,因为它使用距离度量和事先指定的聚类数量(K)。

在这篇博客中,我们将学习。

  • KMeans算法是如何工作的?
  • 距离度量
  • 我们如何选择正确的K值?
  • 聚类的属性
  • 使用sklearn库在Python中实现KMeans聚类

该算法是如何工作的?

在分层聚类方法中,不需要指定K,但对于KMeans,我们需要预先指定K。

  1. 对于一个给定的K值,随机初始化K个中心点,数据点被划分为K个聚类
  2. 计算每个输入点与K个中心点之间的距离,并将其重新分配到距离最小的簇中。
  3. 重新分配后,通过计算集群中数据点的平均值来更新每个集群的中心点
  4. 重复步骤2-3,直到不需要重新分配。

Kmeans clustering

算法工作的视觉表现(来源)

距离度量

KMeans是一种基于中心点/距离的算法,计算每个点之间的距离,然后将其分配到一个聚类。这个距离可以用以下方法计算

  • 欧几里得距离
  • 城市街区/曼哈顿距离

distance measures

欧氏距离和曼哈顿距离测量的公式

聚类的属性

  • 一个聚类中的所有数据点应该是相互相似的(同质性)。_聚类内_平方和(WCSS)是一个聚类内所有点到其中心点的平均距离的平方总和。越小越好。
  • 来自不同聚类的数据点应该是异质性的。聚类_间_平方和(BCSS)是所有中心点之间的平均距离的平方总和。数值越大,说明聚类越分散,数值越小,说明聚类之间越接近。

我们如何选择正确的K值?

如果我们有二维数据,我们可以用散点图将数据可视化并决定集群的数量。但是,如果我们有多维数据,确实很难可视化。错误的k值可能会导致错误或不稳定的集群。

因此,我们使用一种叫做 "肘部方法 "的技术来获得一个最佳的K值。

在这个方法中,我们绘制出K值范围内的WCSS值。

假设K=3,我们将有三个集群,其集群内平方和分别为WCSS1、WCSS2、WCSS3。总的WCSS是WCSS1、WCSS2、WCSS3之和。

WCSS = WCSS1 + WCSS2 + WCSS3

在计算了WCSS后,将其与不同的K值作对比。在图中寻找一个肘形,以找到最佳的K值。

elbow method | Kmeans clustering

弯头曲线图解

在上图中,我们可以看到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 | Kmeans clustering

检查是否有任何空值

data.isnull().any()

finding null values

丢弃分类特征,将剩余的数据复制到另一个数据框中

mydata = data.iloc[:, data.columns!=’Unnamed: 0']
mydata.head()

top rows

缩放数据(使用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()

normalized data

用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')

elbow curve

肘部曲线(图片由作者提供

从上图中,我们发现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

finding centroides

聚类的视觉化样本

让我们只取其中任何两个特征并绘制,看看观察结果是如何聚类的。

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')

visualization of clusters | Kmeans clustering

聚类的可视化

结束语

在这篇博客中,我们已经了解了KMeans算法的工作原理,使用的不同距离度量,以及寻找正确K值的肘部曲线法。我希望你喜欢阅读这篇文章,欢迎与你的学习伙伴们分享。

请查看我以前关于KModes聚类的文章。

参考资料

sklearn.cluster.KMeans

寻找K值的_肘部方法_

使用sklearn MinMaxScaler进行扩展

我的其他博客文章

欢迎阅读我在Analytics Vidhya简介中的其他博文。

你可以在LinkedInTwitter上找到我,如果你想联系的话。我很高兴能与你联系。

如需立即交流思想,请写信给我[email protected]

学习愉快!

本文所展示的媒体不属于Analytics Vidhya所有,由作者自行决定使用。

你也可以在我们的手机APP上阅读这篇文章 Get it on Google Play

标签 :博客马拉松, 聚类, 均值, 机器学习

[

下一篇文章

如何用Python构建一个价格推荐的应用程序

](www.analyticsvidhya.com/blog/2021/0…

上一篇

使用OpenCV实现卷积作为一个图像过滤器

](www.analyticsvidhya.com/blog/2021/0…)

harikabonthu96