分享

K均值聚类算法

 geoallan 2018-12-22

基本概述:

k -means算法的目标是在数据中找到组,组的数量由变量k表示。该算法迭代工作,根据所提供的特征,将数据集中的每个数据点分配给k组中的一个。这意味着数据点围绕各自的质心聚集在一起。根据定义,聚类的每个质心是定义结果组的特征值的集合。检查质心特征权重可用于定性地解释每个聚类代表什么类型的组。用外行人的话来说,这意味着质心可以用来标记新数据,从而证明了对事先不明显的新组进行分类或发现的能力。K-means算法的工作原理与其他机器学习算法不同,因为与其他算法不同,它是一种无监督机器学习学习算法。

无监督机器学习学习算法从未经标记,分类的测试数据中学习。无监督学习不是响应反馈,而是基于数据集内是否存在这种共性来识别数据中的共性并作出反应。K均值聚类允许我们查找和分析从数据集中有机形成的组。由于大多数数据未被标记,因此该算法非常适合于识别共性并为数据科学家提供可视化的分类。

k均值聚类的优点和缺点:

  • k均值聚类的一些优点包括:它是一种广泛使用的聚类分析方法; 这很容易理解; 它很容易训练。
  • k均值聚类的一些缺点包括:欧几里得距离在许多应用中并不理想; 性能与最佳聚类方法相比无竞争力; 数据的微小变化可能导致完全不同的聚类(高方差); 聚类被假设为球形并且尺寸均匀。

k-means聚类算法如何工作?

k均值聚类算法通过迭代细化来产生最终结果。首先,数据科学家必须为k选择最优值以获得最佳分类。如果选择了错误的k值,那么分类将是错误的。寻找k的最优值有不同的方法,我们将在后面讨论。在选择k的值之后,我们需要在图中任意位置绘制k个质心的个数。让我们将下一步称为数据分配步骤。在数据分配步骤中,每个数据点都被分配到最近的质心,基于平方欧几里得距离。下面的dist(c [i],x)²表示从质心到C[i]阵列中每个点的欧几里得平方距离X ,它包含数据集中各点的所有值。我们测试了图中每个点到每个质心的欧几里得距离。但是我们只想要数组中最小距离的位置,这就是为什么它前面有argmin。

K均值聚类算法

由dist表示的平方欧几里德距离公式

在数据分配步骤之后,我们转换到Centroid更新步骤。在质心更新步骤期间,通过获取分配给该质心的所有数据点的平均值来重新计算质心。然后我们将这些平均值作为它们质心的新位置。

K均值聚类算法

聚类中所有点的平均值被分配给该聚类的质心

我们继续遍历数据分配步骤和质心更新步骤,直到聚类没有变化,距离总和最小化,或达到一些最大迭代次数。该算法保证收敛到一个结果,即使结果不一定是最好的可能结果。这可能是非最优数据集的结果,也可能是因为我们选择了错误的k值。

K均值聚类算法

通过每次迭代演示k均值聚类

选择k的最佳值和“肘点”

如前所述,作为数据科学家,我们需要能够确定最佳值k。增加k(质心的数量)总是会减少到数据点的距离,但是如果k的值太高,那么对于特定的数据集,我们就有可能拥有太多的聚类。例如,我们可以在数据集中有3个明显的聚类(其中每个聚类代表一个特征),但是如果k = 5,那么对于实际上只有3个聚类的数据集,我们将有5个聚类。这将破坏分类,并给我们的数据一个错误的结论。如果我们的值为k与数据点的数量相同,我们也可以走到极端,平均距离等于零。绘制到质心的平均距离作为K的函数,而“肘点”,当下降速率急剧变化时,可以用来粗略地确定K。

K均值聚类算法

肘部法(聚类)和“肘点”

elbow方法是在聚类分析中解释和验证一致性的方法,旨在帮助在数据集中找到适当数量的聚类。请参阅上图。y轴是从质心数k到它们各自的聚类中的每个点的平均距离误差的平方和。x轴是聚类的数量k。如果我们绘制每个k值的平均距离误差的平方和,我们将得到如上图所示的图。

我们的目标是选择一个很小的k值,它的平方误差很小,正好在k值开始递减之前。这种情况通常发生在图形的“肘点”,角度的变化会导致误差平方和发生相当大的变化。换句话说,如果我们把k的值从3增加,误差的平方和会大得多。如果k从3减少,平方误差的总和就会减少但代价是收益递减。这是因为我们可以令k = 10且误差平方和最小。但是它的计算效率很低,因为我们需要做10次迭代才能在误差上有一个小的改进。

肘部方法并不总是有效;特别是当数据不是很集中的时候。不要担心,因为还有许多其他验证技术k,包括交叉验证,information criteria, the information theoretic jump method, the silhouette method, 和G-means算法。

如何在Python中编写k-means算法?

为了可视化散点图,我们需要使用Jupyter笔记本。我们还将使用NumPy,Pandas和MatPlotLib库来编写此代码。

设置库并从.csv文件中读取数据

我们要做的第一件事就是导入我们将要使用的库。我们导入了NumPy库,它允许我们支持数学函数来操作多维数组和矩阵。然后我们导入Pandas库,进行数据处理和分析。最后但并非最不重要的是,我们导入matplotlib.pyplot用于交互式绘图和程序化绘图生成。%matplotlib inline是IPython中的一个神奇函数,它将matplotlib的后端设置为'内联'后端。这个神奇的函数只适用于IPython,这就是我们使用Jupyter笔记本的原因。

然后我们只需使用以下函数从csv文件中读取数据(http://www./data/xclara.csv),pd.read_csv('xclara.csv')然后将读取的数据分配给变量data。后来我们可以操纵的data变量,并创建数组V1和V2数据点。

K均值聚类算法

为我们的数据创建列表数组并绘制点

接下来,我们所要做的就是将所有V1和V2 值分别移动到我们的变量f1和f2变量中。f1 = data['V1'].values返回该DataFrame中所有值的numpy表示,忽略标签V1 。然后我们将这些f1和f2特征压缩在一起,并创建一个numpy列表(即2D数组)。稍后我们将使用这个列表数组来计算从每个质心到每个点的欧几里得距离。我们print(X)让我们了解我们的点如何存储在数组中。

K均值聚类算法

该matplotlib.scatter函数将获取x值的数组和y值的数组,并创建包含所有值点的散点图。我们也可以分配color和size我们想要的点。下面是该语句的结果,该语句plt.scatter(f1, f2, color = 'black', s = 7)绘制了数据集中的所有点,大小为7,颜色为黑色。

K均值聚类算法

欧几里得距离函数和初始化质心

从上面的散点图可以看出,我们有3个有机的数据点集群。我们将k设为k = 3。但情况并非总是如此,因为我们的数据并不总是这样组织的,而且我们可能会将多个可以变形为一个聚类的特性进行分类。但为了简单起见,我们把它赋值为3。

我们还定义了距离函数def dist(a, b, ax = 1): 。此函数接受两个向量作为参数,并使用另一个函数计算欧几里得距离np.linalg.norm(a — b, axis = ax) 。此函数是numpy的线性代数模块的一部分,此模块中的范数函数将矢量作为输入并返回标量值(例如欧几里得距离),可以将其解释为“大小”,“长度”或该向量的“量级”。在我们的例子中,我们使用两个向量之间的差值a-b作为参数来找到两点之间的欧几里德距离。这也被称为L²范数,但是范数函数也可以用于找到最大范数,曼哈顿范数等。但是对于我们的目的,我们只需要知道如何将它用于L²范数(欧几里得距离) 。

K均值聚类算法

在我们定义了距离函数之后,我们使用np.random.randint(0, np.max(X)-20, size = k)函数分别为质心x和y值创建一个随机数。这个函数的原型是numpy.random.randint(low, high, size, dtype)。这意味着我们代码中的函数创建了一个随机数,从0到np.max(X) - 20(列表的X数组中的最大值- 20)。大小size = k意味着该函数将创建k多个随机数并将它们作为数组返回。所以C_x和C_y都是3个随机整数的数组。大小为size = k,这意味着函数将创建k个随机数,并将它们作为数组返回。C_x和C_y都是3个随机整数的数组。在下一个步骤中,我们将两个数组压缩到一起,并将它们以列表数组(即2D数组)的形式存储在C中。然后我们再把数据集中的点重新画出来,再把随机生成的质心(绿星)也画出来。

K均值聚类算法

数据分配步骤,质心更新步骤和最终确定算法

代码的最后一部分是构建数据分配步骤和质心更新步骤以最终完成算法的地方。首先,我们创建C_old数组,它是一个填满0的数组,形状与C相同。然后,我们初始化了另一个数组,该数组中填充0个,长度与X的长度相同,这是我们数据集中的点数量。然后,我们通过找到从C_old到C的距离来计算该误差。

我们进入while循环,它将一直运行,直到我们先前计算的error值等于0.然后我们进入for i in range(len(X))贯穿X数组长度的for循环。在for循环中,我们计算从点X[i]到C数组中每个质心的距离,并将其存储为长度为3的数组distance。例如,distance[0]包含X[i]到质心C[0]的距离 。下一行min_distance = np.argmin(distance)返回distance数组中最小距离的位置。然后我们将该值存储到cluster [i]中,以便稍后我们知道X数组中的哪些值需要计算平均值。

然后我们将C中当前聚类的值复制到C_old数组中,然后重新计算质心的新值,以便将它们存储到C中。我们必须创建另一个for循环for i in range(k)来计算质心的新位置。我们使用list comprehension返回分配给每个聚类的值列表(即返回聚类中所有值的列表)。这是通过以下代码行完成的points = [X[j] for j in range(len(X)) if (clusters[j] == i)] 。然后我们使用np.mean(points, axis = 0)函数计算这些点的平均值,并在该特定迭代中将该标量值赋给质心C[i]。在计算所有新质心的值之后,我们再次计算C_old和C之间的误差。如果仍然存在误差,我们将继续执行while循环,直到error= 0(即质心停止移动)。

K均值聚类算法

在我们找到了质心和质心的最佳位置之后error = 0 。我们只是绘制每个质心及其指定点的图形。我们还对聚类进行颜色编码,以便我们可以更好地查看结果。以下是k-means聚类算法的最终结果的屏幕截图。

K均值聚类算法

特征工程

特征工程是机器学习应用的基础。特性是所有独立单元共享的属性,在这些独立单元上进行分析或预测。任何属性都可以是一个特性,只要对模型有用。特征工程的过程是利用领域知识选择要作为特征输入到机器学习算法中的数据指标。

特征工程在k-means聚类中起着关键作用,因为使用有意义的特征来捕捉数据的可变性对于算法在数据集中找到所有有机组是必不可少的。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多