指从没有标签的数据中进行推断的学习。
无监督学习帮助我们识别数据集中的模式。
数据聚类是无监督学习技术之一,其中单个聚类中的元素具有相同的属性并被分配相同的标签。一些最著名的聚类算法包括:
除此之外还有关联规则挖掘,异常检测和降维。
最常听的主要是Kmeans,降维PCA。异常检测也是我经常听到的主题。
它是一种迭代算法,如何工作:
它是一种简单可以实现的算法,当然它也有很多缺点,就从第一步初始化开始就有很多漏洞,如何选到最好的质心关系到最后的结果。所有进化出一种K-Means++算法涉及初始化质心,使它们彼此远离。它比随机选择质心要好得多。
通常使用欧氏距离(Euclidean distance)作为数据点之间的距离度量。欧氏距离是指在几何空间中,两个点之间的直线距离。理论上可以使用余弦相似度来替代欧氏距离,但在实际应用中需要注意,余弦相似度适用于表示为向量的数据,因此在使用余弦相似度时,需要将数据点表示为向量形式。此外,余弦相似度不考虑向量的绝对大小,而是关注向量之间的方向,因此在某些情况下,余弦相似度可能更适合于描述数据的相似性。
欧氏距离是计算点之间的距离。余弦相似度关注向量的方向,它是(向量之间的dot运算/各个向量的欧几里得范数相乘)得到的。
余弦相似度的推导首先是从空间向量的点乘公式得到的,这就是点乘公式:A · B = | A | B | cos(θ) |
点乘公式描述了两个向量有多大的投影在对方的方向上,如果两向量完全重合,则它们的点乘结果就等于各自模长的乘积,即A·B = | A | B | 。 |
设有两个n维空间向量A和B: A = (a1, a2, …, an),B = (b1, b2, …, bn)
我们先将它们分别展开到n个基向量的线性组合:
A = a1e1 + a2e2 + ... + anen
B = b1e1 + b2e2 + ... + bnen
其中e1, e2, …, en是n维空间的基向量。
根据向量的线性运算法则,我们有:
A·B = (a1e1+a2e2+...+anen)·(b1e1+b2e2+...+bnen)
= a1b1(e1·e1) + a1b2(e1·e2) + ... + a1bn(e1·en)
+ a2b1(e2·e1) + a2b2(e2·e2) + ... + a2bn(e2·en)
...
+ anb1(en·e1) + anb2(en·e2) + ... + anbn(en·en)
根据基向量的正交性质: ei·ej = 0, (i≠j), ei·ei = 1
上式可以化简为: A·B = a1b1 + a2b2 + … + anbn = Σ(aibi) (i=1,2,…,n) 这就是空间向量的点乘公式。
基向量(Basis Vector)是构成某一向量空间的一组线性无关的向量。在n维空间中,有n个单位基向量e1,e2,…,en,可以构成该空间的一个基底。 对于2维空间,基向量通常设为: e1 = (1,0), e2 = (0,1),对于3维空间,基向量通常设为: e1 = (1,0,0), e2 = (0,1,0), e3 = (0,0,1)。可以看出它就是一个矩阵中,主对角线都为1。
基向量有以下几个基本性质:
模长为1:例如在3维空间, | e1 | = | e2 | = | e3 | = 1 |
所以基向量是构造和分析向量空间的基础,掌握它们的性质对于线性代数等数学理论至关重要!
层次聚类涉及创建聚类的层次结构。以层次结构的形式表示数据对象对于数据汇总和可视化很有用。
例如,假设我们想要将组织中的人员分为主要组,例如主管、经理和员工。我们可以将上面的这些进一步划分为更小的子组。这就是层次聚类的基本思想。
层次聚类设计两种,自下而上的凝聚层次聚类,和自上而下的分裂层次聚类。
凝聚层次聚类使用自下而上的策略。在此策略中,每个实例最初都被视为一个集群。在该聚类算法的每次连续迭代中,一个聚类与其他最相似的聚类合并,直到仅形成一个大聚类。
凝聚层次聚类的工作原理:
如何表达每个簇之间的关系,这里用的是联动标准Linkage criteria,和我们一般来说计算各种距离一样,这个关联标准也有几个种类。
至于使用哪种标准取决于你的具体问题,和聚类效果。
分裂式层次聚类与凝聚式层次聚类相反。它的工作原理是将所有点视为一个簇,然后在每次连续迭代中,最不相似的点从父簇中分离出来。最后,我们剩下K个簇,其中所需情况下的 K 可以是数据集中的点总数。
这似乎更适合我们解决问题的需求。
但是总的来说。层聚聚类算法的时间和空间复杂度很高,不适合大型数据集。根据需求使用。
这里的DB和数据库可没关系!它的意思是Density Based spatial clustering of Applications with Noise,翻译为基于密度的噪声应用空间聚类。
专业词汇一上来就开始脑袋转圈圈了,但是没关系不要被这次缩写吓到。
从翻译中就可以看到它时基于密度的聚类。K-means也是基于聚类的算法,但是K-means的密度簇时球型的。但是DBSCAN可以发现任意形状的簇,并可以有效处理噪声数据。
DBSCAN的核心思想是基于数据的密度关联,将高密度区域中的数据点分为同一个簇,而将低密度区域的数据点视为噪声。
算法的运行需要两个关键参数:
Eps(ϵ):邻域半径,定义了点的ϵ-邻域。即一个点的ϵ-邻域是以该点为中心,半径为ϵ的球形区域。
MinPts:设置了点在某个ϵ-邻域内的最少点数,用于定义密集区域。
算法步骤:
继续下一个未处理的核心点,重复步骤2
DBSCAN算法的优点:
缺点:
DBSCAN常用于发现空间聚类分布,如地理数据的聚类、基因数据分析、网络数据分析等。是无监督学习中比较实用和流行的一种聚类算法。
案例:Customer Segmentation在Github仓库project-drafts中的,同名文件夹可以找到。这个项目的可视化分析真的挺好看的。
在聚类中我们经常听到肘部法则,在这里解释意思:
肘部法则(Elbow Method)是用于确定最优聚类数量的一种 启发式 方法。它的原理如下:
1) 聚类的目标是将数据点分成若干个聚类,使得同一个聚类内部的数据点相似度高,不同聚类之间的数据点相似度低。
2) 聚类数量越多,簇内平方和(Within-Cluster Sum of Squares, WCSS)就越小。因为数据点会被分配到更多的聚类中,每个聚类内部的数据点就更加相似。
3) 但是,随着聚类数量的增加,每次增加一个新的聚类所能降低的WCSS值就会越来越小。这是因为剩余的数据点已经比较相近了,新增一个聚类的效果就不太明显。
4) 因此,当绘制聚类数量与WCSS值的关系线图时,这条线最初会是陡峭下降,但是当聚类数量增加到一定程度后,这条线的斜率就会变得很小。
5) 这条线的”肘部”(拐点处),就是一个合适的聚类数量。在这个点之前,增加聚类数可以大幅降低WCSS;但在这之后,增加聚类数只会略微降低WCSS。
6) 肘部法则认为,这个拐点处的聚类数量就是最优聚类数,因为它实现了WCSS值的大幅降低,而不会过多增加聚类数导致模型过于复杂。
总的来说,肘部法则利用了聚类数量与WCSS值之间的这种”肘形”关系,通过视觉上识别拐点来确定最优聚类数。这种方法简单、可解释,但也有一定的主观性,需要结合其他指标共同评估聚类效果。
关联规则挖掘(Association Rule Mining)是数据挖掘的一个重要分支,主要用于发现数据集中有趣、频繁、意义重大的关联关系或相关模式。它通常应用于购物篮数据分析、网页挖掘、产品聚类等场景。
关联规则的形式为:A->B,表示如果事务数据集中包含项集A,则也很可能包含项集B。常用的两个指标来描述规则的质量:
置信度(Confidence)=P(B | A)=P(A,B)/P(A),表示已知A发生时,B发生的概率 |
Apriori算法
Apriori算法是早期最有影响力的关联规则挖掘算法。它分两个步骤:
FP-Growth算法
FP-Growth(Frequent Pattern Growth)算法通过构建FP-树来高效发现频繁项集,不需要像Apriori那样产生大量候选集。算法分两步:
总的来说,关联规则挖掘算法的关键是高效发现频繁项集,并生成满足约束的有趣规则。企业可以基于这些挖掘结果进行产品购买相关性分析、销售促销策略制定等决策。
这一部分现在我不是很了解,学习资料也没有详细再讲下去,而是作为聚类的一个部分被提起。因此这里只做一个了解吧。
如同它的文字表述,它的目的是将高维度数据转换为低纬度数据。
换个表述方式就是将大量特征,变为较少的特征量。
因为维数过高会导致模型复杂和难以可视化。
降低维度的好处很多,有助于快速拟合模型,降低复杂度,可视化,消除多重共线性(一些特征彼此相关,提供了很多冗余的信息)问题。
降维技术中最重要的是主成分分析。简写为PCA。
PCA的步骤拆解:
Standardization
首先对每个特征进行正规化处理,将特征都转换为均值为0,方差为1的数据。这样做的好处是将所有特征进行统一。
计算公式为:x - 均值 / 标准差
具有较大范围值的特征,会比具有较小范围值的特征占据主导地位。
CovarianceMatrix
第二步是,根据上面的正规化后的特征,计算协方差矩阵。
协方差矩阵具有对称的性质,它的对角线上是方差,非对角线上是两两特征的协方差。
反应了变量之间的线性相关程度和方向。
EigenDecomposition
执行协方差矩阵的特征值分解。
它是将矩阵分解为一组特征值和特征向量的过程。
它在数学上,是将矩阵简化为对角线矩阵和另一个矩阵的乘积。
特征值反映了矩阵沿着哪些方向伸缩,特征值大小对应了伸缩的大小和程度。对应地,特征向量反映了,伸缩的方向。
特征值分解为我们研究矩阵的本质属性、发现隐含模式、降维和压缩提供了强有力的数学工具。
SortByEigenValues
主成分被构造为原始特征的线性组合。主成分的构造方式是将原始变量中的大部分信息(最大可能的方差)压缩到第一个成分中,然后挤压到其他成分中,依此类推。
假设总共构建了 n 个主成分其中 n 是数据集的维度总数。我们按照特征值的顺序对主成分进行排序,从最高到最低,也就是重要性进行了排序。
ChoosePrincipalComponents
决定保留的主成分数量 k 个,并选择最重要的 k 个主成分,并构建一个向量矩阵,称之为特征向量。
这些是我们最后得到的,在新的较低维度中的特征。
在Scikit-learn中的实现:
以鸢尾花数据集为例的PCA实现:
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"
df = pd.read_csv(url, names=['sepal length','sepal width','petal length','petal width','target'])
print("The Iris Dataset before applying PCA is")
print(df.head().to_string())
x = df[['sepal length', 'sepal width', 'petal length', 'petal width']].values
y = df[['target']].values
x = StandardScaler().fit_transform(x)
pca = PCA(n_components=2)
principalComponents = pca.fit_transform(x)
principalDf = pd.DataFrame(data = principalComponents, columns = ['principal component 1', 'principal component 2'])
finalDf = pd.concat([principalDf, df[['target']]], axis = 1)
print("\n")
print("The Iris Dataset after applying PCA is")
print(finalDf.head().to_string())
原始数据如下:
The Iris Dataset before applying PCA is
sepal length sepal width petal length petal width target
0 5.1 3.5 1.4 0.2 Iris-setosa
1 4.9 3.0 1.4 0.2 Iris-setosa
2 4.7 3.2 1.3 0.2 Iris-setosa
3 4.6 3.1 1.5 0.2 Iris-setosa
4 5.0 3.6 1.4 0.2 Iris-setosa
中间的进行正规化后的x输出前五行查看:
[[-0.90068117 1.03205722 -1.3412724 -1.31297673]
[-1.14301691 -0.1249576 -1.3412724 -1.31297673]
[-1.38535265 0.33784833 -1.39813811 -1.31297673]
[-1.50652052 0.10644536 -1.2844067 -1.31297673]
[-1.02184904 1.26346019 -1.3412724 -1.31297673]]
最终输出结果:
The Iris Dataset after applying PCA is
principal component 1 principal component 2 target
0 -2.264542 0.505704 Iris-setosa
1 -2.086426 -0.655405 Iris-setosa
2 -2.367950 -0.318477 Iris-setosa
3 -2.304197 -0.575368 Iris-setosa
4 -2.388777 0.674767 Iris-setosa