无监督学习是机器学习的一种类型,它处理没有显式标签的数据。与监督学习不同,无监督学习的目标是探索数据的内在结构和模式,而不是从标注数据中学习一个特定的映射到预定标签的函数。这使得无监督学习特别适用于探索性数据分析、找寻隐藏模式、数据压缩以及真实世界数据中的复杂结构。
无监督学习主要包括以下几种方法:
-
聚类:将数据集中的实例分组,使得同一组(或簇)内的实例彼此相似,而不同组的实例尽可能不相似。常见的聚类算法包括K-means、层次聚类、DBSCAN等。
-
关联规则学习:寻找大数据集中各项之间的有趣关系,如频繁项集、关联规则或因果结构。例如,在市场篮子分析中,可以用来找出顾客经常一起购买的商品组合。
-
降维:减少数据中的变量数量,以便更简洁地表达数据,同时尽量保留原始数据的信息。常用的降维技术包括主成分分析(PCA)、t-分布随机邻域嵌入(t-SNE)和自编码器。
-
异常检测:识别数据中的异常或离群点,这些点与大多数数据的行为显著不同。这在诸如欺诈检测、网络安全和故障检测等应用中非常重要。
一、K-means 与 K-mean++ 算法
K-means 是一种常用的聚类算法,用于将数据点划分为预先指定数量的簇,使得每个簇内的数据点尽可能相似,簇间的数据点尽可能不同。它主要适用于数据量大且簇形状接近高维球体时的场景。
- 初始化:随机选择 K 个数据点作为初始中心(质心)。
- 分配:将每个数据点分配给最近的质心,形成 K 个簇。
- 更新:重新计算每个簇的质心(即簇中所有点的均值)。
- 迭代:重复步骤2和3,直到质心的变化小于某个阈值或达到预设的迭代次数,此时算法收敛。
K-means++ 的优化
K-means 的一个主要问题是初始质心的选择可能导致结果的局部最优而非全局最优,以及算法的收敛速度。K-means++ 是一种优化的初始化方法,旨在改善这些问题,从而提高聚类结果的质量和算法的稳定性。
- 选择第一个质心:随机从数据集中选择一个点作为第一个质心。
- 计算距离:对于数据集中的每一个点 xxx,计算其与最近质心的距离 D(x)D(x)D(x)。
- 选择下一个质心:选择一个新的数据点作为质心,选取概率与 D(x)2D(x)^2D(x)2 成正比。
- 重复步骤2和3:直到选择了 K 个质心。
优点
- 减少依赖于初始点的选择:通过更加智能的初始点选择,减少算法对随机性的依赖,避免了一些较差的局部最优解。
- 提高聚类质量:簇内误差平方和通常比标准 K-means 更小。
- 增强稳定性:不同运行之间的结果更加稳定。
K-means 和 K-means++ 广泛应用于市场细分、社交网络分析、组织计算群体、图像分割、天文数据分析等多种领域。这种方法的关键在于选择合适的 K 值和适当的特征,这些选择对聚类的效果有很大影响。
总的来说,K-means++ 提供了对 K-means 初始条件敏感性的一个有效改进,使得聚类过程更加稳定和可靠。
实战
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
# 生成模拟数据
X, _ = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)
# 创建KMeans模型,指定使用K-means++初始化
kmeans = KMeans(n_clusters=4, init='k-means++', random_state=42)
# 拟合模型
kmeans.fit(X)
# 预测类别
labels = kmeans.predict(X)
# 可视化结果
plt.scatter(X[:, 0], X[:, 1], c=labels, s=50, cmap='viridis')
centers = kmeans.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.75)
plt.title('K-means++ Clustering')
plt.show()
二、降维
降维是一种减少数据集中特征数量的技术,目的是简化数据处理和分析过程,同时尽量保留数据的重要信息。降维常用于处理高维数据集,可以帮助改善算法的性能和结果的可视化。
1)主成分分析(PCA):
主成分分析通过以下步骤来简化数据集:
标准化数据:
首先对每个属性(特征)进行标准化处理,通常是使每个特征的平均值为0,标准差为1。这是为了消除不同尺度对计算的影响。
计算协方差矩阵:
然后计算特征之间的协方差矩阵。协方差矩阵描述了数据中各个变量之间的相关性。
求解特征值和特征向量:
对协方差矩阵进行特征分解,求解其特征值和对应的特征向量。特征向量代表了主成分的方向,而特征值代表了每个主成分的方差量,即该方向的重要性。
选择主成分:
选择最大的几个特征值及其对应的特征向量。这些特征向量是数据在新空间中的基,被称为主成分。通常选择的主成分数量取决于累计贡献率,即前几个主成分的方差之和占总方差的比例。
构造新的特征空间:
使用选定的主成分重新构造一个降维后的数据集。这是通过将原始数据投影到这些主成分上完成的。
- PCA 通过正交变换将可能相关的高维变量转换成线性不相关的低维变量,称为主成分。
- 主成分按照方差递减的顺序排列,第一个主成分具有最大的方差(信息量最大)。
- PCA 常用于数据压缩、特征抽取和数据可视化。
from sklearn.decomposition import PCA from sklearn.datasets import load_iris import matplotlib.pyplot as plt # 加载数据集 data = load_iris() X = data.data y = data.target # 创建 PCA 模型,将数据降至 2 维 pca = PCA(n_components=2) # 对数据进行降维处理 X_pca = pca.fit_transform(X) # 可视化结果 plt.figure(figsize=(8, 6)) scatter = plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y, cmap='viridis') plt.xlabel('Principal Component 1') plt.ylabel('Principal Component 2') plt.colorbar(scatter) plt.title('PCA Result') plt.show()
2)线性判别分析(LDA):
- LDA 是一种监督学习的降维技术,用于最大化类间距离和最小化类内距离。
- 主要用于模式识别和机器学习领域,如人脸识别和信号分类。
3)t-分布随机邻域嵌入(t-SNE):
- t-SNE 通过概率分布转换和优化技巧有效处理非线性降维问题,特别适合于高维数据的可视化。
- 主要应用于数据可视化领域,如生物信息学和社交网络分析中的高维数据集。
三、关联规则学习
关联规则学习是一种在大数据集中寻找变量间有趣关系的方法。这些关系通常体现为“如果…那么…”的形式,广泛应用于购物篮分析、库存管理、生物数据分析等。
基本概念
- 支持度:一个项集在所有交易中出现的频率。
- 置信度:一条规则从条件部分推导出结论部分的可靠度。
- 提升度:一个规则的条件部分和结论部分的独立性的度量。
-
Apriori 算法:
- 逐层迭代地发现频繁项集,每一层基于前一层的频繁项集生成候选项集。
- 利用先验知识,即频繁项集的所有非空子集也必须是频繁的,以减少需要检查的项集数量。
-
FP-Growth 算法:
- 使用FP树(频繁模式树)结构来存储数据集的压缩表示,然后通过递归方式来挖掘频繁项集。
- 比Apriori更高效,因为它不需要产生候选项集。
降维和关联规则学习在许多领域都有广泛应用:
- 降维技术通常用于数据预处理,以减轻计算负担,改善其他机器学习算法的性能或数据可视化。
- 关联规则用于零售和市场分析(如确定不同产品间的关联,优化产品布局和营销策略),生物信息学(如基因表达分析),以及推荐系统(如根据用户行为推荐产品)。
import pandas as pd from mlxtend.preprocessing import TransactionEncoder from mlxtend.frequent_patterns import apriori, association_rules # 示例数据集 dataset = [['Milk', 'Onion', 'Nutmeg', 'Kidney Beans', 'Eggs', 'Yogurt'], ['Dill', 'Onion', 'Nutmeg', 'Kidney Beans', 'Eggs', 'Yogurt'], ['Milk', 'Apple', 'Kidney Beans', 'Eggs'], ['Milk', 'Unicorn', 'Corn', 'Kidney Beans', 'Yogurt'], ['Corn', 'Onion', 'Onion', 'Kidney Beans', 'Ice cream', 'Eggs']] # 使用TransactionEncoder转换数据 te = TransactionEncoder() te_ary = te.fit(dataset).transform(dataset) df = pd.DataFrame(te_ary, columns=te.columns_) # 使用apriori找出频繁项集 frequent_itemsets = apriori(df, min_support=0.6, use_colnames=True) # 生成关联规则 rules = association_rules(frequent_itemsets, metric="confidence", min_threshold=0.7) print(rules[['antecedents', 'consequents', 'support', 'confidence']])
这两种技术虽然应用场景不同,但都是理解和挖掘数据中模式的重要工具。