我很喜欢研究无监督学习问题。它们为监督学习问题提供了一个彻底不一样的挑战,用我拥有的数据进行实验的发挥空间要比监督学习大得多。毫无疑问,机器学习领域的大多数发展和突破都发生在无监督学习领域。python
无监督学习中最流行的技术之一就是聚类。这是一个咱们一般在机器学习的早期学习的概念,它很容易理解。我相信你曾经遇到过,甚至参与过顾客细分、购物篮分析等项目。算法
但问题是聚类有不少方面。它并不局限于咱们以前学过的基本算法。它是一种强大的无监督学习技术,咱们能够在现实世界中准确地使用它。机器学习
> 高斯混合模型就是我想在本文中讨论的一种聚类算法。函数
想预测一下你最喜欢的产品的销售状况吗?或许你想经过不一样客户群体的视角来理解客户流失。不管用什么方法,你都会发现高斯混合模型很是有用。学习
在本文中,咱们将采用自下而上的方法。所以,咱们首先来看一下聚类的基础知识,包括快速回顾一下k-means算法。而后,咱们将深刻讨论高斯混合模型的概念,并在Python中实现它们。3d
在咱们开始讨论高斯混合模型的实质内容以前,让咱们快速更新一些基本概念。code
注意:若是你已经熟悉了聚类背后的思想以及k-means聚类算法的工做原理,那么你能够直接跳到第4部分“高斯混合模型介绍”。component
那么,让咱们从正式定义核心思想开始:blog
> 聚类是指根据类似数据点的属性或特征将它们分组在一块儿。教程
例如,若是咱们有一组人的收入和支出,咱们能够把他们分红如下几组:
这些组中的每个都拥有一个类似的特征,在某些状况下特别有用。例如信用卡、汽车/房产贷款等等。用简单的话说:
> 聚类背后的思想是将数据点分组在一块儿,这样每一个单独的簇拥有最类似的点。 > 有各类各样的聚类算法。最流行的聚类算法之一是k-means。让咱们了解一下k-means算法是如何工做的,以及在哪些状况下该算法可能达不到预期效果。
k-means聚类是一种基于距离的算法。这意味着它试图将最近的点分组造成一个聚类。
让咱们仔细看看这个算法是如何工做的。这将创建基础知识,以帮助你了解高斯混合模型将在本文后面的地方发挥做用。
所以,咱们首先定义咱们想要将种群划分红的组的数量——这是k的值。基于咱们想要的聚类或组的数量,而后咱们随机初始化k个中心体。
而后将这些数据点分配给到离它最近的簇。而后更新中心,从新分配数据点。这个过程不断重复,直到簇的中心的位置再也不改变。
注意:这是k-means聚类的简要概述,对于本文来讲已经足够了。
k-means聚类概念听起来很不错,不是吗?它易于理解,相对容易实现,而且能够应用于至关多的用例中。但也有一些咱们须要注意的缺陷和限制。
让咱们以上面看到的收入-支出的例子为例。k-means算法彷佛运行得很好,对吧?等等——若是你仔细观察,你会发现全部的聚类都是圆形的。这是由于聚类的中心体是使用平均值迭代更新的。
如今,考虑下面这个点的分布不是圆形的例子。若是咱们对这些数据使用k-means聚类,你认为会发生什么?它仍然试图以循环方式对数据点进行分组。这不是很好。
所以,咱们须要一种不一样的方法来为数据点分配聚类。所以,咱们将再也不使用基于距离的模型,而是使用基于分布的模型。高斯混合模型介绍基于分布的模型!
> 高斯混合模型(GMMs)假设存在必定数量的高斯分布,每一个分布表明一个簇。所以,高斯混合模型倾向于将属于单一分布的数据点聚在一块儿。
假设咱们有三个高斯分布(下一节会详细介绍)——GD一、GD2和GD3。均值为(μ一、μ二、μ3)和方差分别(σ一、σ二、σ3)值。对于给定的一组数据点,咱们的GMM将识别属于这些分布的每一个数据点的几率。
等一下,几率?
你没看错!混合高斯模型是几率模型,采用软聚类方法将点分布在不一样的聚类中。我再举一个例子,这样更容易理解。
这里,咱们有三个用三种颜色表示的聚类——蓝色、绿色和青色。让咱们以红色突出显示的数据点为例。这个点是蓝的一部分的几率是1,而它是绿色或青色的一部分的几率是0。
如今,考虑另外一个点,在蓝色和青色之间的某个地方(在下面的图中突出显示)。这个点是绿色的几率是0。这个点属于蓝色和青色的几率分别是0.2和0.8。
高斯混合模型使用软聚类技术将数据点分配给高斯分布。
我相信大家对高斯分布(或正态分布)很熟悉。它有一个钟形曲线,数据点对称分布在平均值周围。 如下图片有几个高斯分布的不一样均值(μ)和不一样方差(σ2)的正态分布图像。记住,σ值越低图像越尖:
在一维空间中,高斯分布的几率密度函数为:
其中μ是均值和σ2是方差。
但这只对一维状况下成立。在二维的状况下,咱们再也不使用2D钟形曲线,而是使用3D钟形曲线,以下图所示:
几率密度函数为:
其中x是输入向量,μ是2维的均值向量,Σ是2×2的协方差矩阵。协方差定义了曲线的形状。咱们能够推广d维的状况。
> 所以,这个多元高斯模型x和μ向量长度都是d,Σ是dxd的协方差矩阵。
所以,对于一个具备d个特征的数据集,咱们将有k个高斯分布的混合(其中k等于簇的数量),每一个都有一个特定的均值向量和协方差矩阵。可是等一下,如何分配每一个高斯分布的均值和方差值?
这些值是使用一种称为指望最大化(EM)的技术肯定的。在深刻研究高斯混合模型以前,咱们须要了解这种技术。
> 指望最大化(EM)是一种寻找正确模型参数的统计算法。咱们一般在数据缺乏值时使用EM,或者换句话说,在数据不完整时会使用EM算法。
这些缺失的变量被称为隐变量。在处理无监督学习问题时,咱们认为目标(或簇数量)是未知的。
因为缺乏这些变量,很难肯定正确的模型参数。能够这样想——若是你知道哪一个数据点属于哪一个簇,那么就能够轻松地肯定均值向量和协方差矩阵。
因为咱们没有隐变量的值,指望最大化尝试使用现有的数据来肯定这些变量的最佳值,而后找到模型参数。根据这些模型参数,咱们返回并更新隐变量的值,等等。
广义上,指望最大化算法有两个步骤:
指望最大化是许多算法的基础,包括高斯混合模型。那么,GMM如何使用EM的概念呢?咱们如何将其应用于给定的点集呢?让咱们来看看!
让咱们用另外一个例子来理解它。我想让你在阅读的过程当中把这个思路具体化。这将帮助你更好地理解咱们在谈论什么。
假设咱们须要分配k个簇。高斯分布,这意味着有k个均值μ1,μ2,. .μk和协方差矩阵Σ1,Σ2,. .Σk。此外,还有一个用于分布的参数,用于定义各个分布的权重,权重表明每一个簇的点的数量,用Πi表示。
如今,咱们须要找到这些参数的值来定义高斯分布。咱们已经肯定了簇的数量,并随机分配平均值、协方差和权重。接下来,咱们将执行E步和M步!
E步:
对于每一个点xi,计算它属于分布c1, c2,…ck的几率。这是使用如下公式:
当将该点分配给正确的簇时,此值将比较高,不然将比较低。
M步:
E步后,咱们回去更新Π,μ和Σ值。这些资料的更新方式以下:
基于此步骤生成的更新值,咱们计算每一个数据点的新几率,并迭代更新这些值。重复这个过程是为了使对数似然函数最大化。实际上咱们能够说
> k-means只考虑更新簇中心的均值,而GMM则考虑数据的均值和方差。
是时候深刻研究代码了!这是任何文章中我最喜欢的部分之一,因此让咱们开始吧。
咱们将从加载数据开始。这是我建立的一个临时文件-你能够从这个连接下载数据:https://s3-ap-south-1.amazonaws.com/av-blog-media/wp-content/uploads/2019/10/Clustering_gmm.csv。
import pandas as pd data = pd.read_csv('Clustering_gmm.csv') plt.figure(figsize=(7,7)) plt.scatter(data["Weight"],data["Height"]) plt.xlabel('Weight') plt.ylabel('Height') plt.title('Data Distribution') plt.show()
这就是咱们的数据。咱们先在这个数据上创建一个k-means模型:
#训练k-means模型 from sklearn.cluster import KMeans kmeans = KMeans(n_clusters=4) kmeans.fit(data) #kmeans预测 pred = kmeans.predict(data) frame = pd.DataFrame(data) frame['cluster'] = pred frame.columns = ['Weight', 'Height', 'cluster'] #输出结果 color=['blue','green','cyan', 'black'] for k in range(0,4): data = frame[frame["cluster"]==k] plt.scatter(data["Weight"],data["Height"],c=color[k]) plt.show()
结果不大准确。k-means模型未能识别正确的簇。咱们仔细观察位于中心的簇,尽管数据分布是椭圆形的,但k-means已经尝试构建一个圆形簇(还记得咱们前面讨论的缺点吗?)
如今让咱们在相同的数据上创建一个高斯混合模型,看看咱们是否能够改进k-means:
import pandas as pd data = pd.read_csv('Clustering_gmm.csv') # 训练高斯混合模型 from sklearn.mixture import GaussianMixture gmm = GaussianMixture(n_components=4) gmm.fit(data) #GMM预测 labels = gmm.predict(data) frame = pd.DataFrame(data) frame['cluster'] = labels frame.columns = ['Weight', 'Height', 'cluster'] color=['blue','green','cyan', 'black'] for k in range(0,4): data = frame[frame["cluster"]==k] plt.scatter(data["Weight"],data["Height"],c=color[k]) plt.show()
这正是咱们所但愿的结果。在这个数据集中高斯混合模型把k-means模型战胜了
这是高斯混合模型的入门教程。我在这里的目的是向你介绍这种强大的聚类技术,并展现它与传统算法相比是多么有效和高效。
我鼓励你着手一个聚类项目,并在那里尝试GMMs。这是学习和强化一个概念的最好方法,相信我,你会充分认识到这个算法有多么有用。