Ⅰ 多元统计学-聚类分析
1. 应用统计学与R语言实现学习笔记(十)——聚类分析 )
2. 厦门大学-多元统计分析
3. DBSCAN 密度聚类法
4. 四大聚类算法(KNN、Kmeans、密度聚类、层次聚类)
俗话说,物以类聚,人以群分。聚类在日常生活中,非常常见.
就是将相似的物体,放在一起.
聚类的目的 ——根据已知数据( 一批观察个体的许多观测指标) , 按照一定的数学公式计算各观察个体或变量(指标)之间亲疏关系的统计量(距离或相关系数等)。 根据某种准则( 最短距离法、最长距离法、中间距离法、重心法等),使同一类内的差别较小,而类与类之间的差别较大,最终将观察个体或变量分为若干类。
根据分类的对象可将聚类分析分为:
样品间亲疏程度的测度
研究样品或变量的亲疏程度的数量指标有两种,一种叫相似系数,性质越接近的变量或样品,它们的相似系数越接近于1,而彼此无关的变量或样品它们的相似系数则越接近于0,相似的为一类,不相似的为不同类;另一种叫距离,它是将每一个样品看作p维空间的一个点,并用某种度量测量点与点之间的距离,距离较近的归为一类,距离较远的点属于不同的类。
变量之间的聚类即R型聚类分析,常用相似系数来测度变量之间的亲疏程度。
而样品之间的聚类即Q型聚类分析,则常用距离来测度样品之间的亲疏程度。
距离
假使每个样品有p个变量,则每个样品都可以看成p维空间中的一个点, n个样品就是p维空间中的n个点,则第i样品与第j样品之间的距离可以进行计算。
几种常用方式度量:
欧式距离 L2(Euclidean distance)--- 常用
马氏距离(Mahalanobis distance)---协方差矩阵
Minkowski测度( Minkowski metric)
Canberra测度(Canberra metric)
有了距离衡量度量,我们可以计算两两的距离,就得到距离矩阵~
比如:下面用dist 计算距离的方法
定义了距离之后,怎样找到"合理"的规则,使相似的/距离小的个体聚成一个族群?
考虑所有的群组组合显然在计算上很难实现,所以一种常用的聚类方法为层次聚类/系统聚类(hierarchical
clustering)
从系统树图中可以看出,我们需要度量族群与族群之间的距离,不同的定义方法决定了不同的聚类结果:
计算族群距离的三种方法的比较:
(可以看到都是小小的族群合并在一起,因为让方差增加最小,倾向与合并小群体)
一般情况,我们得到系统树,需要对树进行切割. 如下图一条条竖线.
层次聚类族群数的选择:
1、建立n个初始族群,每个族群中只有一个个体
2、计算n个族群间的距离矩阵
3、合并距离最小的两个族群
4、计算新族群间的距离矩阵。如果组别数为1,转步骤5;否则转步骤3
5、绘制系统树图
6、选择族群个数
在层次聚类中,一旦个体被分入一个族群,它将不可再被归入另一个族群,故现在介绍一个“非层次”的聚类方法——分割法(Partition)。最常用的分割法是k-均值(k-Means)法
k-均值法试图寻找 个族群 的划分方式,使得划分后的族群内方差和(within-group sum of squares,WGSS)最小.
思路也是将相近的样本,聚在一起,使得组内方差小,组间方差大.
① 选定 个“种子”(Cluster seeds)作为初始族群代表
② 每个个体归入距离其最近的种子所在的族群
③ 归类完成后,将新产生的族群的质心定为新的种子
④ 重复步骤2和3,直到不再需要移动
⑤ 选择不同的k 值,计算WGSS,找到拐点确定最合适的K.
有多种初始种子的选取方法可供选择:
1、在相互间隔超过某指定最小距离的前提下,随机选择k个个体
2、选择数据集前k个相互间隔超过某指定最小距离的个体
3、选择k个相互距离最远的个体
4、选择k个等距网格点(Grid points),这些点可能不是数据集的点
可以想到,左侧的点收敛更快得到全局最优;左侧可能聚类效果一般,或者收敛非常慢,得到局部最优.
我们的目标是使得WGSS足够小,是否应该选取k使得WGSS最小?
我们需要选择一个使得WGSS足够小(但不是最小)的k值.(PS: 族群内方差和最小时候,k=n,此时WGSS为0,此时是过拟合问题~)
当我们分部计算k=1,2,3,4,5... 时候,WGSS值,就可以绘制下面碎石图。及WGSS 随着k 变化过程。k 越大,WGSS越小.
Ⅱ 建议收藏!10 种 python 聚类算法完整操作示例
聚类或聚类分析是无监督学习问题。它通常被用作数据分析技术,用于发现数据中的有趣模式,例如基于其行为的客户群。有许多聚类算法可供选择,对于所有情况,没有单一的最佳聚类算法。相反,最好探索一系列聚类算法以及每种算法的不同配置。在本教程中,你将发现如何在 python 中安装和使用顶级聚类算法。完成本教程后,你将知道:
聚类分析,即聚类,是一项无监督的机器学习任务。它包括自动发现数据中的自然分组。与监督学习(类似预测建模)不同,聚类算法只解释输入数据,并在特征空间中找到自然组或群集。
群集通常是特征空间中的密度区域,其中来自域的示例(观测或数据行)比其他群集更接近群集。群集可以具有作为样本或点特征空间的中心(质心),并且可以具有边界或范围。
聚类可以作为数据分析活动提供帮助,以便了解更多关于问题域的信息,即所谓的模式发现或知识发现。例如:
聚类还可用作特征工程的类型,其中现有的和新的示例可被映射并标记为属于数据中所标识的群集之一。虽然确实存在许多特定于群集的定量措施,但是对所识别的群集的评估是主观的,并且可能需要领域专家。通常,聚类算法在人工合成数据集上与预先定义的群集进行学术比较,预计算法会发现这些群集。
有许多类型的聚类算法。许多算法在特征空间中的示例之间使用相似度或距离度量,以发现密集的观测区域。因此,在使用聚类算法之前,扩展数据通常是良好的实践。
一些聚类算法要求您指定或猜测数据中要发现的群集的数量,而另一些算法要求指定观测之间的最小距离,其中示例可以被视为“关闭”或“连接”。因此,聚类分析是一个迭代过程,在该过程中,对所识别的群集的主观评估被反馈回算法配置的改变中,直到达到期望的或适当的结果。scikit-learn 库提供了一套不同的聚类算法供选择。下面列出了10种比较流行的算法:
每个算法都提供了一种不同的方法来应对数据中发现自然组的挑战。没有最好的聚类算法,也没有简单的方法来找到最好的算法为您的数据没有使用控制实验。在本教程中,我们将回顾如何使用来自 scikit-learn 库的这10个流行的聚类算法中的每一个。这些示例将为您复制粘贴示例并在自己的数据上测试方法提供基础。我们不会深入研究算法如何工作的理论,也不会直接比较它们。让我们深入研究一下。
在本节中,我们将回顾如何在 scikit-learn 中使用10个流行的聚类算法。这包括一个拟合模型的例子和可视化结果的例子。这些示例用于将粘贴复制到您自己的项目中,并将方法应用于您自己的数据。
1.库安装
首先,让我们安装库。不要跳过此步骤,因为你需要确保安装了最新版本。你可以使用 pip Python 安装程序安装 scikit-learn 存储库,如下所示:
接下来,让我们确认已经安装了库,并且您正在使用一个现代版本。运行以下脚本以输出库版本号。
运行该示例时,您应该看到以下版本号或更高版本。
2.聚类数据集
我们将使用 make _ classification ()函数创建一个测试二分类数据集。数据集将有1000个示例,每个类有两个输入要素和一个群集。这些群集在两个维度上是可见的,因此我们可以用散点图绘制数据,并通过指定的群集对图中的点进行颜色绘制。这将有助于了解,至少在测试问题上,群集的识别能力如何。该测试问题中的群集基于多变量高斯,并非所有聚类算法都能有效地识别这些类型的群集。因此,本教程中的结果不应用作比较一般方法的基础。下面列出了创建和汇总合成聚类数据集的示例。
运行该示例将创建合成的聚类数据集,然后创建输入数据的散点图,其中点由类标签(理想化的群集)着色。我们可以清楚地看到两个不同的数据组在两个维度,并希望一个自动的聚类算法可以检测这些分组。
已知聚类着色点的合成聚类数据集的散点图接下来,我们可以开始查看应用于此数据集的聚类算法的示例。我已经做了一些最小的尝试来调整每个方法到数据集。3.亲和力传播亲和力传播包括找到一组最能概括数据的范例。
它是通过 AffinityPropagation 类实现的,要调整的主要配置是将“ 阻尼 ”设置为0.5到1,甚至可能是“首选项”。下面列出了完整的示例。
运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,我无法取得良好的结果。
数据集的散点图,具有使用亲和力传播识别的聚类
4.聚合聚类
聚合聚类涉及合并示例,直到达到所需的群集数量为止。它是层次聚类方法的更广泛类的一部分,通过 AgglomerationClustering 类实现的,主要配置是“ n _ clusters ”集,这是对数据中的群集数量的估计,例如2。下面列出了完整的示例。
运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,可以找到一个合理的分组。
使用聚集聚类识别出具有聚类的数据集的散点图
5.BIRCHBIRCH
聚类( BIRCH 是平衡迭代减少的缩写,聚类使用层次结构)包括构造一个树状结构,从中提取聚类质心。
它是通过 Birch 类实现的,主要配置是“ threshold ”和“ n _ clusters ”超参数,后者提供了群集数量的估计。下面列出了完整的示例。
运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,可以找到一个很好的分组。
使用BIRCH聚类确定具有聚类的数据集的散点图
6.DBSCANDBSCAN
聚类(其中 DBSCAN 是基于密度的空间聚类的噪声应用程序)涉及在域中寻找高密度区域,并将其周围的特征空间区域扩展为群集。
它是通过 DBSCAN 类实现的,主要配置是“ eps ”和“ min _ samples ”超参数。下面列出了完整的示例。
运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,尽管需要更多的调整,但是找到了合理的分组。
使用DBSCAN集群识别出具有集群的数据集的散点图
7.K均值
K-均值聚类可以是最常见的聚类算法,并涉及向群集分配示例,以尽量减少每个群集内的方差。
它是通过 K-均值类实现的,要优化的主要配置是“ n _ clusters ”超参数设置为数据中估计的群集数量。下面列出了完整的示例。
运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,可以找到一个合理的分组,尽管每个维度中的不等等方差使得该方法不太适合该数据集。
使用K均值聚类识别出具有聚类的数据集的散点图
8.Mini-Batch
K-均值Mini-Batch K-均值是 K-均值的修改版本,它使用小批量的样本而不是整个数据集对群集质心进行更新,这可以使大数据集的更新速度更快,并且可能对统计噪声更健壮。
它是通过 MiniBatchKMeans 类实现的,要优化的主配置是“ n _ clusters ”超参数,设置为数据中估计的群集数量。下面列出了完整的示例。
运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,会找到与标准 K-均值算法相当的结果。
带有最小批次K均值聚类的聚类数据集的散点图
9.均值漂移聚类
均值漂移聚类涉及到根据特征空间中的实例密度来寻找和调整质心。
它是通过 MeanShift 类实现的,主要配置是“带宽”超参数。下面列出了完整的示例。
运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,可以在数据中找到一组合理的群集。
具有均值漂移聚类的聚类数据集散点图
10.OPTICSOPTICS
聚类( OPTICS 短于订购点数以标识聚类结构)是上述 DBSCAN 的修改版本。
它是通过 OPTICS 类实现的,主要配置是“ eps ”和“ min _ samples ”超参数。下面列出了完整的示例。
运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,我无法在此数据集上获得合理的结果。
使用OPTICS聚类确定具有聚类的数据集的散点图
11.光谱聚类
光谱聚类是一类通用的聚类方法,取自线性线性代数。
它是通过 Spectral 聚类类实现的,而主要的 Spectral 聚类是一个由聚类方法组成的通用类,取自线性线性代数。要优化的是“ n _ clusters ”超参数,用于指定数据中的估计群集数量。下面列出了完整的示例。
运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,找到了合理的集群。
使用光谱聚类聚类识别出具有聚类的数据集的散点图
12.高斯混合模型
高斯混合模型总结了一个多变量概率密度函数,顾名思义就是混合了高斯概率分布。它是通过 Gaussian Mixture 类实现的,要优化的主要配置是“ n _ clusters ”超参数,用于指定数据中估计的群集数量。下面列出了完整的示例。
运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,我们可以看到群集被完美地识别。这并不奇怪,因为数据集是作为 Gaussian 的混合生成的。
使用高斯混合聚类识别出具有聚类的数据集的散点图
在本文中,你发现了如何在 python 中安装和使用顶级聚类算法。具体来说,你学到了:
Ⅲ 学会用聚类算法进行数据挖掘需要怎样的数学基础
会用聚类算法进行数据挖掘需要线性代数, 变分演算,距离度量,距离矩阵等的数学知识基础。
在数据科学中,我们可以通过聚类分析观察使用聚类算法后获得一些有价值的信息,其中会涉及许多数学理论与实际计算。
主要有以下几类算法:
K-Means(k-平均或k-均值)是普遍知名度最高的一种聚类算法,在许多有关数据科学和机器学习的课程中经常出现。
Mean shift算法,又称均值漂移算法,这是一种基于核密度估计的爬山算法,适用于聚类、图像分割、跟踪等
DBSCAN是一种基于密度的聚类算法,它不需要输入要划分的聚类个数,对聚类的形状没有偏倚。
层次聚类会将每个数据点视为单个聚类,然后连续合并成对的聚类,直到所有聚类合并成包含所有数据点的单个聚类。
关于数据挖掘的相关学习,推荐CDA数据师的相关课程,课程内容兼顾培养解决数据挖掘流程问题的横向能力以及解决数据挖掘算法问题的纵向能力。要求学生具备从数据治理根源出发的思维,通过数字化工作方法来探查业务问题,通过近因分析、宏观根因分析等手段,再选择业务流程优化工具还是算法工具,而非“遇到问题调算法包”。点击预约免费试听课。
Ⅳ PhenoGraph聚类算法
PhenoGraph算法的输入是一个N X D的矩阵, 把这个矩阵中的行划分到类别中,使得类别间的差异大于类别内的差异。
我们的假设是,这些类别代表具有生物学意义表型的细胞群。我们的前提假设是细胞群聚集在D维空间的密集区域,由紧密Marker表达组合定义。因此,我们的目标是在D维空间中辨别这些密集的细胞区域。然而,我们不知道数据中类别的数量,大小或高维形状(例如,椭球,凸)。 单细胞域(domain)特别具有挑战性,因为不同类别之间,类别大小可能会有数量级上的差异(例如,造血干细胞与T细胞),并且我们希望识别罕见子集(类别)而不是将它们作为离群点而丢弃。此外,虽然大多数聚类算法都假设类别内样本分布近似椭球形,但我们已经证明许多细胞亚类具有复杂的形状并且不一定是凸形的(viSNE enables visualization of high dimensional single-cell data and reveals phenotypic heterogeneity of leukemia. Nat Biotechnol. 2013)。 用于密度检测的参数方法需要关于细胞群体(例如,椭球,凸)的形状的强依赖性假设,而单细胞数据中通常不符合这样的假设。
为了克服这些障碍,我们构建了一个图形结构来表示单细胞数据中细胞状态的高维几何结构。每个细胞作为节点并且通过边连接到其邻居细胞(与其最相似的细胞),该边的权重由细胞之间的相似性设置。细胞在高维空间中的密集区域将在该图中表现为高度互连的模块,通过该模块内具有高密度的边的特征来识别。一旦构建完毕,该图可以被划分成这些紧密互连的模块的子集,称为群体(communities),代表不同的表型亚群(类别)。这些图中的群体(communities)的检测(Community structure in social and biological networks. Proc. Natl. Acad. Sci. 2002)为识别亚群提供了一种高效方法。与混合模型等参数化方法不同,该方法不假设子群(某一类别)的大小、分布或数量。该方法成功的关键是构造一个图形结构,这个图形结构真实的表示D维空间中存在的几何结构。PhenoGraph分两步建立单细胞数据的图结构。
第一步,使用欧式距离为每个细胞识别k个最近邻居,其中k是该方法的唯一参数;如果k值太大,较小的群体(communities)会受到其他节点的影响,难以被识别出来。而如果,k值太小会导致我们想要找的细胞群体内紧密度较差。
因此,在第二步中,我们改进了第一步中定义的k邻居。对所有细胞的k近邻搜索的结果是一组集合:N组k邻居。我们对这些集合进行操作以建立一个加权图。在这个图中,每对节点(细胞)之间的权重是基于它们共享的邻居的数量。
节点i和j之间的权重由以下公式给出:
其中v(i)是节点i的k邻居;v(j)是节点j的k邻居。
以这种方式由真实数据构造的图具有明显的模块化结构。
群体(communities)检测是指将节点划分成不同的群体(communities),从而捕获这个模块化结构。对于一组群体(communities)的确定C={c_(1,) c_(2,),…,c_k},模块系数Q的定义由下面公式确定:
其中Wij是节点i,j的边权重,si是节点i与其他所有节点的边权重加和,sj同上,ci是节点i所在的群体(communities),如果u=v,Kronecker delta 函数δ(u,v)=1;否则为0,m=1/2 ∑▒W_ij 是一个标准化常数。
模块系数Q介于-1到1之间,对于任意一个确定了群体(communities)图结构都可以计算这么一个指标。所以该指标可以作为客观衡量把图结构区分成子集的质量。这样,该问题就转化成一个组合优化问题,即NP完全问题。
接下来用Louvain方法(Fast unfolding of communities in large networks. J. Stat. Mech. 2008)来解决上述问题。Louvain方法具体步骤是,在第一次迭代时,每一个节点(细胞)被单独作为一类(一个群体),在每一次迭代时,若两个节点的合并能使得模块系数Q有最大的增长,那么将这两个节点合并成一类。直到模块系数Q不再增加为止。
REF: Data-Driven Phenotypic Dissection of AML Reveals Progenitor-like Cells that Correlate with Prognosis. 2015 Cell.
检测群体(communities)结构对于发现复杂网络中结构与功能之间的联系以及生物学和社会学等许多学科的实际应用至关重要。现在广泛使用的一种流行方法依赖于对模块的数量的优化,这是将网络划分为群体(communities)的质量指标。我们发现,即使在模块定义明确的情况下,模块化优化也可能无法识别小于一定规模的模块,该模块的规模取决于网络的总大小和模块的互连程度。Newman和Girvan(Finding and evaluating community structure in networks. Physical review E, 2004.)在群体(communities)检测方面取得了决定性的进展,他们引入了一种定量方法来衡量将网络划分为群体(communities)的质量,即模块化。该度量实质上将给定模块内的连接数与相同大小和相同度数序列的随机图的期望值进行比较。如果选择模块化作为相关质量函数,则群体(communities)检测的问题就等同于模块化优化。后者非常重要,因为将网络划分为群体(communities)的可能性至少随着网络的大小呈指数增长,即使对于较小的图,穷举式优化在计算上也不可行。我们表明模块化优化确实不能解决大数量的模块。因此,有必要对通过模块化优化获得的模块进行检查。我们表明,模块化存在一个固有规模,该规模取决于网络中边的总数。小于此规模的模块可能无法解析,即使在极端情况下,它们是通过单桥连接的完整图形。模块化分辨率的极限实际上取决于群体(communities)对之间的互连程度,并且可以达到整个网络大小的数量级。因此,事先无法确定通过模块化优化检测到的模块(大还是小)确实是单个模块还是多个较小模块的集合。然而,最大模块性因网络的不同而不同,并且取决于网络的连接数。我们证明了任何网络的模块性值的上限都是1,并且我们看到模块性是与网络尺度相关的。
REF: Resolution limit in community detection. 2007 PNAS.
函数FindClusters
FindClusters(object, molarity.fxn = 1, initial.membership = NULL, weights = NULL, node.sizes = NULL, resolution = 0.8, algorithm = 1, n.start = 10, n.iter = 10, random.seed = 0, group.singletons = TRUE, temp.file.location = NULL, edge.file.name = NULL, verbose = TRUE, ...)
参数
#object: Seurat Object
#molarity.fxn: 计算模块系数函数,1为标准函数;2为备选函数,这里没有具体说明是什么函数,我认为1是上面提到的Kronecker delta函数。
# resolution: 分辨率参数,如果大于1,则会得到较多数目的群体(communities);如果小于1,则会得到较少数目的群体(communities)。
#algorithm: 模块系数优化算法,1使用原始Louvain算法;2使用Louvain algorithm with multilevel refinement;3使用SLM算法;4使用Leiden算法(注:4需要额外安装插件)
#n.start: 随机开始的数量
#n.iter: 最大迭代次数
#random.seed: 随机数种子
#graph.name: 图的名字
#group.singletons: (TRUE/FALSE)是否把比较特异的细胞分配到最近的类别中,若FALSE,则可能会出现某个类只有一个细胞的情况
#verbose: 是否在控制台输出结果
Ⅳ 常用聚类(K-means,DBSCAN)以及聚类的度量指标:
一年前需要用聚类算法时,自己从一些sklearn文档和博客粗略整理了一些相关的知识,记录在电子笔记里备忘,现在发到网上,当时就整理的就很乱,以后有空慢慢把内容整理、完善,用作备忘。之前把电影标签信息的聚类结果作为隐式反馈放进SVD++中去训练,里面有两个小例子
利用条件熵定义的同质性度量:
sklearn.metrics.homogeneity_score:每一个聚出的类仅包含一个类别的程度度量。
sklearn.metrics.completeness:每一个类别被指向相同聚出的类的程度度量。
sklearn.metrics.v_measure_score:上面两者的一种折衷:
v = 2 * (homogeneity * completeness) / (homogeneity + completeness)
可以作为聚类结果的一种度量。
sklearn.metrics.adjusted_rand_score:调整的兰德系数。
ARI取值范围为[-1,1],从广义的角度来讲,ARI衡量的是两个数据分布的吻合程度
sklearn.metrics.adjusted_mutual_info_score:调整的互信息。
利用基于互信息的方法来衡量聚类效果需要实际类别信息,MI与NMI取值范围为[0,1],AMI取值范围为[-1,1]。
在scikit-learn中, Calinski-Harabasz Index对应的方法是metrics.calinski_harabaz_score.
CH指标通过计算类中各点与类中心的距离平方和来度量类内的紧密度,通过计算各类中心点与数据集中心点距离平方和来度量数据集的分离度,CH指标由分离度与紧密度的比值得到。从而,CH越大代表着类自身越紧密,类与类之间越分散,即更优的聚类结果。
silhouette_sample
对于一个样本点(b - a)/max(a, b)
a平均类内距离,b样本点到与其最近的非此类的距离。
silihouette_score返回的是所有样本的该值,取值范围为[-1,1]。
这些度量均是越大越好
K-means算法应该算是最常见的聚类算法,该算法的目的是选择出质心,使得各个聚类内部的inertia值最小化,计算方法如下:
inertia可以被认为是类内聚合度的一种度量方式,这种度量方式的主要缺点是:
(1)inertia假设数据内的聚类都是凸的并且各向同性( convex and isotropic),
各项同性是指在数据的属性在不同方向上是相同的。数据并不是总能够满足这些前提假设的,
所以当数据事细长簇的聚类,或者不规则形状的流形时,K-means算法的效果不理想。
(2)inertia不是一种归一化度量方式。一般来说,inertia值越小,说明聚类效果越好。
但是在高维空间中,欧式距离的值可能会呈现迅速增长的趋势,所以在进行K-means之前首先进行降维操作,如PCA等,可以解决高维空间中inertia快速增长的问题,也有主意提高计算速度。
K-means算法可以在足够长的时间内收敛,但有可能收敛到一个局部最小值。
聚类的结果高度依赖质心的初始化,因此在计算过程中,采取的措施是进行不止一次的聚类,每次都初始化不同的质心。
sklearn中可以通过设置参数init='kmeans++'来采取k-means++初始化方案,
即初始化的质心相互之间距离很远,这种方式相比于随机初始质心,能够取得更好的效果。
另外,sklearn中可以通过参数n_job,使得K-means采用并行计算的方式。
##sklearn 中K-means的主要参数:
1) n_clusters: 设定的k值
2)max_iter: 最大的迭代次数,一般如果是凸数据集的话可以不管这个值,如果数据集不是凸的,可能很难收敛,此时可以指定最大的迭代次数让算法可以及时退出循环。
3)n_init:用不同的初始化质心运行算法的次数。由于K-Means是结果受初始值影响的局部最优的迭代算法,因此需要多跑几次以选择一个较好的聚类效果,默认是10。如果你的k值较大,则可以适当增大这个值。
4)init: 即初始值选择的方式,可以为完全随机选择'random',优化过的'k-means++'或者自己指定初始化的k个质心。一般建议使用默认的'k-means++'。
5)algorithm:有“auto”, “full” or “elkan”三种选择。"full"就是我们传统的K-Means算法, “elkan”elkan K-Means算法。默认的"auto"则会根据数据值是否是稀疏的,来决定如何选择"full"和“elkan”。一般来说建议直接用默认的"auto"
聚类的中心
print clf.cluster_centers_
每个样本所属的簇
print clf.labels_
用来评估簇的个数是否合适,距离越小说明簇分的越好,选取临界点的簇个数
print clf.inertia_
Sum of distances of samples to their closest cluster center.
两个小例子(很久以前弄的,写得比较简略比较乱,有空再改,数据是movielen中的电影标签信息):
例1:
例2,在区间[2,200]上遍历k,并生成两个聚类内部评价指标CH分、轮廓系数以及kmeans自带inertia分和对应的k值的图片来选择k:
其中两点相似度s(i, j)的度量默认采用负欧氏距离。
sklearn.cluster.AffinityPropagation
有参数preference(设定每一个点的偏好,将偏好于跟其他节点的相似性进行比较,选择
高的作为exmplar,未设定则使用所有相似性的中位数)、damping (阻尼系数,
利用阻尼系数与1-阻尼系数对r 及 a进行有关迭代步数的凸组合,使得算法收敛
default 0.5 可以取值与[0.5, 1])
cluster_centers_indices_:中心样本的指标。
AP算法的主要思想是通过数据点两两之间传递的信息进行聚类。
该算法的主要优点是能够自主计算聚类的数目,而不用人为制定类的数目。
其缺点是计算复杂度较大 ,计算时间长同时空间复杂度大,
因此该算法适合对数据量不大的问题进行聚类分析。
数据点之间传递的信息包括两个,吸引度(responsibility)r(i,k)和归属度(availability)a(i,k)。
吸引度r(i,k)度量的是质心k应当作为点i的质心的程度,
归属度a(i,k)度量的是点i应当选择质心k作为其质心的程度。
其中t是迭代的次数,λ是阻尼因子,其值介于[0,1],在sklearn.cluster.AffinityPropagation中通过参数damping进行设置。
每次更新完矩阵后,就可以为每个数据点分配质心,分配方式?是针对数据点i,遍历所有数据点k(包括其自身),
找到一个k使得r(i,k)+a(i,k)的值最大,则点k就是点i所属的质心,迭代这个过程直至收敛。
所谓收敛就是所有点所属的质心不再变化
首先说明不引入核函数时的情况。
算法大致流程为:随机选取一个点作为球心,以一定半径画一个高维球(数据可能是高维的),
在这个球范围内的点都是这个球心的邻居。这些邻居相对于球心都存在一个偏移向量,
将这些向量相加求和再平均,就得到一个mean shift,起点在原球心,重点在球内的其他位置。
以mean shift的重点作为新的球心,重复上述过程直至收敛。
这个计算过程中,高维球内的点,无论其距离球心距离多远,对于mean shift的计算权重是一样的。
为了改善这种情况,在迭代计算mean shift的过程中引入了核函数
sklearn中相关实现是sklearn.cluster.MeanShift。
sklearn中实现的是自底向上的层次聚类,实现方法是sklearn.cluster.AgglomerativeClustering。
初始时,所有点各自单独成为一类,然后采取某种度量方法将相近的类进行合并,并且度量方法有多种选择。
合并的过程可以构成一个树结构,其根节点就是所有数据的集合,叶子节点就是各条单一数据。
sklearn.cluster.AgglomerativeClustering中可以通过参数linkage选择不同的度量方法,用来度量两个类之间的距离,
可选参数有ward,complete,average三个。
ward:选择这样的两个类进行合并,合并后的类的离差平方和最小。
complete:两个类的聚类被定义为类内数据的最大距离,即分属两个类的距离最远的两个点的距离。
选择两个类进行合并时,从现有的类中找到两个类使得这个值最小,就合并这两个类。
average:两个类内数据两两之间距离的平均值作为两个类的距离。
同样的,从现有的类中找到两个类使得这个值最小,就合并这两个类。
Agglomerative cluster有一个缺点,就是rich get richer现象,
这可能导致聚类结果得到的类的大小不均衡。
从这个角度考虑,complete策略效果最差,ward得到的类的大小最为均衡。
但是在ward策略下,affinity参数只能是“euclidean”,即欧式距离。
如果在欧氏距离不适用的环境中,average is a good alternative。
另外还应该注意参数affinity,这个参数设置的是计算两个点之间距离时采用的策略,
注意和参数linkage区分,linkage设置的是衡量两个类之间距离时采用的策略,
而点之间的距离衡量是类之间距离衡量的基础。
affinity的可选数值包括 “euclidean”, “l1”, “l2”, “manhattan”, “cosine”,
‘precomputed’. If linkage is “ward”, only “euclidean” is accepted.
DBSCAN算法的主要思想是,认为密度稠密的区域是一个聚类,各个聚类是被密度稀疏的区域划分开来的。
也就是说,密度稀疏的区域构成了各个聚类之间的划分界限。与K-means等算法相比,该算法的主要优点包括:可以自主计算聚类的数目,不需要认为指定;不要求类的形状是凸的,可以是任意形状的。
DBSCAN中包含的几个关键概念包括core sample,non-core sample,min_sample,eps。
core samle是指,在该数据点周围eps范围内,至少包含min_sample个其他数据点,则该点是core sample,
这些数据点称为core sample的邻居。与之对应的,non-sample是该点周围eps范围内,所包含的数据点个数少于min_sample个。从定义可知,core sample是位于密度稠密区域的点。
一个聚类就是一个core sample的集合,这个集合的构建过程是一个递归的构成。
首先,找到任意个core sample,然后从它的邻居中找到core sample,
接着递归的从这些邻居中的core sample的邻居中继续找core sample。
要注意core sample的邻居中不仅有其他core sample,也有一些non-core smaple,
也正是因为这个原因,聚类集合中也包含少量的non-core sample,它们是聚类中core sample的邻居,
但自己不是core sample。这些non-core sample构成了边界。
在确定了如何通过单一core sample找到了一个聚类后,下面描述DBSCAN算法的整个流程。
首先,扫描数据集找到任意一个core sample,以此core sample为起点,按照上一段描述的方法进行扩充,确定一个聚类。然后,再次扫描数据集,找到任意一个不属于以确定类别的core sample,重复扩充过程,再次确定一个聚类。
迭代这个过程,直至数据集中不再包含有core sample。
这也是为什么DBSCAN不用认为指定聚类数目的原因。
DBSCAN算法包含一定的非确定性。数据中的core sample总是会被分配到相同的聚类中的,哪怕在统一数据集上多次运行DBSCAN。其不确定性主要体现在non-core sample的分配上。
一个non-core sample可能同时是两个core sample的邻居,而这两个core sample隶属于不同的聚类。
DBSCAN中,这个non-core sample会被分配给首先生成的那个聚类,而哪个聚类先生成是随机的。
sklearn中DBSCAN的实现中,邻居的确定使用的ball tree和kd-tree思想,这就避免了计算距离矩阵。
Ⅵ kmeans聚类算法优缺点
优缺点如下:
1、优点
k-平均算法是解决聚类问题的一种经典算法,算法简单、快速。
对处理大数据集,该算法是相对可伸缩的和高效率的,因为它的复杂度大约是O(nkt) O(nkt)O(nkt),其中n是所有对象的数目,k是簇的数目,t是迭代的次数。通常k<<n。这个算法经常以局部最优结束。
算法尝试找出使平方误差函数值最小的k个划分。当簇是密集的、球状或团状的,而簇与簇之间区别明显时,它的聚类效果很好。
2、缺点
对K值敏感。也就是说,K的选择会较大程度上影响分类效果。在聚类之前,我们需要预先设定K的大小,但是我们很难确定分成几类是最佳的,比如上面的数据集中,显然分为2类,即K = 2最好,但是当数据量很大时,我们预先无法判断。
对离群点和噪声点敏感。如果在上述数据集中添加一个噪音点,这个噪音点独立成一个类。很显然,如果K=2,其余点是一类,噪音点自成一类,原本可以区分出来的点被噪音点影响,成为了一类了。如果K=3,噪音点也是自成一类,剩下的数据分成两类。这说明噪音点会极大的影响其他点的分类。
聚类分析特点
聚类分析的实质:是建立一种分类方法,它能够将一批样本数据按照他们在性质上的亲密程度在没有先验知识的情况下自动进行分类。这里所说的类就是一个具有相似性的个体的集合,不同类之间具有明显的区别。
层次聚类分析是根据观察值或变量之间的亲疏程度,将最相似的对象结合在 一起,以逐次聚合的方式(Agglomerative Clustering),它将观察值分类,直到最后所有样本都聚成一类。
层次聚类分析有两种形式,一种是对样本(个案)进行分类,称为Q型聚类;另一种是对研究对象的观察变量进行分类,称为R型聚类。
Ⅶ 用于数据挖掘的聚类算法有哪些,各有何优势
聚类方法的分类,主要分为层次化聚类算法,划分式聚类算法,基于密度的聚类算法,基于网格的聚类算法,基于模型的聚类算法等。
而衡量聚类算法优劣的标准主要是这几个方面:处理大的数据集的能力;处理任意形状,包括有间隙的嵌套的数据的能力;算法处理的结果与数据输入的顺序是否相关,也就是说算法是否独立于数据输入顺序;处理数据噪声的能力;是否需要预先知道聚类个数,是否需要用户给出领域知识;算法处理有很多属性数据的能力,也就是对数据维数是否敏感。
.聚类算法主要有两种算法,一种是自下而上法(bottom-up),一种是自上而下法(top-down)。这两种路径本质上各有优势,主要看实际应用的时候要根据数据适用于哪一种,Hierarchical methods中比较新的算法有BIRCH主要是在数据体量很大的时候使用;ROCK优势在于异常数据抗干扰性强……
关于数据挖掘的相关学习,推荐CDA数据师的相关课程,课程以项目调动学员数据挖掘实用能力的场景式教学为主,在讲师设计的业务场景下由讲师不断提出业务问题,再由学员循序渐进思考并操作解决问题的过程中,帮助学员掌握真正过硬的解决业务问题的数据挖掘能力。这种教学方式能够引发学员的独立思考及主观能动性,学员掌握的技能知识可以快速转化为自身能够灵活应用的技能,在面对不同场景时能够自由发挥。点击预约免费试听课。
Ⅷ 16种常用的数据分析方法-聚类分析
聚类(Clustering)就是一种寻找数据之间内在结构的技术。聚类把全体数据实例组织成一些相似组,而这些相似组被称作簇。处于相同簇中的数据实例彼此相同,处于不同簇中的实例彼此不同。
聚类分析定义
聚类分析是根据在数据中发现的描述对象及其关系的信息,将数据对象分组。目的是,组内的对象相互之间是相似的(相关的),而不同组中的对象是不同的(不相关的)。组内相似性越大,组间差距越大,说明聚类效果越好。
聚类效果的好坏依赖于两个因素:1.衡量距离的方法(distance measurement) 2.聚类算法(algorithm)
聚类分析常见算法
K-均值聚类也称为快速聚类法,在最小化误差函数的基础上将数据划分为预定的类数K。该算法原理简单并便于处理大量数据。
K-均值算法对孤立点的敏感性,K-中心点算法不采用簇中对象的平均值作为簇中心,而选用簇中离平均值最近的对象作为簇中心。
也称为层次聚类,分类的单位由高到低呈树形结构,且所处的位置越低,其所包含的对象就越少,但这些对象间的共同特征越多。该聚类方法只适合在小数据量的时候使用,数据量大的时候速度会非常慢。
案例
有20种12盎司啤酒成分和价格的数据,变量包括啤酒名称、热量、钠含量、酒精含量、价格。
问题一:选择那些变量进行聚类?——采用“R 型聚类”
现在我们有4个变量用来对啤酒分类,是否有必要将4个变量都纳入作为分类变量呢?热量、钠含量、酒精含量这3个指标是要通过化验员的辛苦努力来测定,而且还有花费不少成本。
所以,有必要对4个变量进行降维处理,这里采用spss R型聚类(变量聚类),对4个变量进行降维处理。输出“相似性矩阵”有助于我们理解降维的过程。
4个分类变量各自不同,这一次我们先用相似性来测度,度量标准选用pearson系数,聚类方法选最远元素,此时,涉及到相关,4个变量可不用标准化处理,将来的相似性矩阵里的数字为相关系数。若果有某两个变量的相关系数接近1或-1,说明两个变量可互相替代。
只输出“树状图”就可以了,从proximity matrix表中可以看出热量和酒精含量两个变量相关系数0.903,最大,二者选其一即可,没有必要都作为聚类变量,导致成本增加。
至于热量和酒精含量选择哪一个作为典型指标来代替原来的两个变量,可以根据专业知识或测定的难易程度决定。(与因子分析不同,是完全踢掉其中一个变量以达到降维的目的。)这里选用酒精含量,至此,确定出用于聚类的变量为:酒精含量,钠含量,价格。
问题二:20 中啤酒能分为几类?—— 采用“Q 型聚类”
现在开始对20中啤酒进行聚类。开始不确定应该分为几类,暂时用一个3-5类范围来试探。Q型聚类要求量纲相同,所以我们需要对数据标准化,这一回用欧式距离平方进行测度。
主要通过树状图和冰柱图来理解类别。最终是分为4类还是3类,这是个复杂的过程,需要专业知识和最初的目的来识别。
这里试着确定分为4类。选择“保存”,则在数据区域内会自动生成聚类结果。
问题三:用于聚类的变量对聚类过程、结果又贡献么,有用么?——采用“单因素方差分析”
聚类分析除了对类别的确定需讨论外,还有一个比较关键的问题就是分类变量到底对聚类有没有作用有没有贡献,如果有个别变量对分类没有作用的话,应该剔除。
这个过程一般用单因素方差分析来判断。注意此时,因子变量选择聚为4类的结果,而将三个聚类变量作为因变量处理。方差分析结果显示,三个聚类变量sig值均极显着,我们用于分类的3个变量对分类有作用,可以使用,作为聚类变量是比较合理的。
问题四:聚类结果的解释?——采用”均值比较描述统计“
聚类分析最后一步,也是最为困难的就是对分出的各类进行定义解释,描述各类的特征,即各类别特征描述。这需要专业知识作为基础并结合分析目的才能得出。
我们可以采用spss的means均值比较过程,或者excel的透视表功能对各类的各个指标进行描述。其中,report报表用于描述聚类结果。对各类指标的比较来初步定义类别,主要根据专业知识来判定。这里到此为止。
以上过程涉及到spss层次聚类中的Q型聚类和R型聚类,单因素方差分析,means过程等,是一个很不错的多种分析方法联合使用的案例。
聚类分析的应用
聚类分析是细分市场的有效工具,被用来发现不同的客户群,并且它通过对不同的客户群的特征的刻画,被用于研究消费者行为,寻找新的潜在市场。
聚类分析被用来对动植物和基因进行分类,以获取对种群固有结构的认识。
聚类分析可以通过平均消费来鉴定汽车保险单持有者的分组,同时可以根据住宅类型、价值、地理位置来鉴定城市的房产分组。
聚类分析被用来在网上进行文档归类。
聚类分析通过分组聚类出具有相似浏览行为的客户,并分析客户的共同特征,从而帮助电子商务企业了解自己的客户,向客户提供更合适的服务。
Ⅸ 常用的聚类方法有哪几种
聚类分析的算法可以分为划分法、层次法、基于密度的方法、基于网格的方法、基于模型的方法。
1、划分法,给定一个有N个元组或者纪录的数据集,分裂法将构造K个分组,每一个分组就代表一个聚类,K<N。
2、层次法,这种方法对给定的数据集进行层次似的分解,直到某种条件满足为止。
3、基于密度的方法,基于密度的方法与其它方法的一个根本区别是:它不是基于各种各样的距离的,而是基于密度的。这样就能克服基于距离的算法只能发现“类圆形”的聚类的缺点。
4、图论聚类方法解决的第一步是建立与问题相适应的图,图的节点对应于被分析数据的最小单元,图的边(或弧)对应于最小处理单元数据之间的相似性度量。
5、基于网格的方法,这种方法首先将数据空间划分成为有限个单元的网格结构,所有的处理都是以单个的单元为对象的。
6、基于模型的方法,基于模型的方法给每一个聚类假定一个模型,然后去寻找能够很好的满足这个模型的数据集。
(9)聚类算法车位识别扩展阅读:
在商业上,聚类可以帮助市场分析人员从消费者数据库中区分出不同的消费群体来,并且概括出每一类消费者的消费模式或者说习惯。
它作为数据挖掘中的一个模块,可以作为一个单独的工具以发现数据库中分布的一些深层的信息,并且概括出每一类的特点,或者把注意力放在某一个特定的类上以作进一步的分析;并且,聚类分析也可以作为数据挖掘算法中其他分析算法的一个预处理步骤。
许多聚类算法在小于 200 个数据对象的小数据集合上工作得很好;但是,一个大规模数据库可能包含几百万个对象,在这样的大数据集合样本上进行聚类可能会导致有偏的结果。
许多聚类算法在聚类分析中要求用户输入一定的参数,例如希望产生的簇的数目。聚类结果对于输入参数十分敏感。参数通常很难确定,特别是对于包含高维对象的数据集来说。这样不仅加重了用户的负担,也使得聚类的质量难以控制。