13 聚类分析入门

13 聚类分析入门

聚类分析是一种常见的无监督学习方法,用于将数据集中的样本分组,目标是使得同一组中的样本尽可能相似,而不同组之间的样本尽可能不同。下面将详细介绍聚类分析的概念、常用算法、案例以及代码实现。

聚类分析概述

聚类分析的主要目标是对数据进行“分组”,以便在组内的样本特征更为相似。常见的应用场景包括:市场细分、图像处理、社交网络分析等。

关键概念

  • 无监督学习:与监督学习相对,无监督学习不依赖于标签数据。聚类分析即属于无监督学习的方法之一。
  • 相似度度量:聚类通常依赖某种“距离度量”来评估样本之间的相似性。常用的距离度量包括欧氏距离、曼哈顿距离等。

常用聚类算法

K-means 聚类

K-means 是最常用的聚类算法之一,其基本思想是将数据分成 K 个簇,使得簇内数据点到簇中心的距离最小。

K-means 算法步骤:

  1. 随机选择 K 个初始聚类中心。
  2. 将每个样本分配到离它最近的聚类中心。
  3. 更新每个簇的聚类中心,即计算该簇所有样本的均值。
  4. 重复步骤 2 和 3,直到聚类中心不再变化或达到迭代次数的上限。

案例:使用 K-means 进行客户细分

假设我们有一个关于客户消费的二维数据:年消费金额访问频率。我们希望通过 K-means 将这些客户分成不同的细分市场。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

# 生成示例数据
np.random.seed(0)
X = np.random.rand(100, 2) * 100

# 进行 K-means 聚类
kmeans = KMeans(n_clusters=3)
y_kmeans = kmeans.fit_predict(X)

# 可视化结果
plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=50, cmap='viridis')
centers = kmeans.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.75, label='Centroids')
plt.title('K-means Clustering')
plt.xlabel('Annual Spending ($)')
plt.ylabel('Visit Frequency')
plt.legend()
plt.show()

层次聚类

层次聚类 不同于 K-means,这是一种“自底向上”或“自顶向下”的聚类方法。它通过构建一个树状结构来表示数据的聚类过程。

层次聚类步骤:

  1. 计算所有样本间的距离,构建距离矩阵。
  2. 将每个样本视为一个单独的簇。
  3. 反复找到最近的两个簇,将其合并为一个新簇。
  4. 重复步骤3,直至所有样本合并为一个簇。

案例:使用层次聚类分析物种

假设我们有一组生物特征数据,想通过层次聚类分析不同物种之间的相似性。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import seaborn as sns
from scipy.cluster.hierarchy import dendrogram, linkage

# 生成示例数据
data = np.random.rand(10, 3) # 10个样本,3个特征

# 计算层次聚类
linked = linkage(data, 'single')

# 可视化层次聚类
plt.figure(figsize=(10, 7))
dendrogram(linked)
plt.title('Hierarchical Clustering Dendrogram')
plt.xlabel('Sample index')
plt.ylabel('Distance')
plt.show()

聚类分析的评价

聚类的效果往往难以直接评估。但可以通过一些指标进行定量分析,例如:

  • 轮廓系数(Silhouette Score):衡量样本与自身簇的紧密程度以及与最近邻簇的分离程度。
  • Davies-Bouldin Index:聚类内部和外部的比值,值越小,表示聚类效果越好。

总结

聚类分析是探索性数据分析的重要工具,能够帮助我们发现数据中的潜在结构。以上介绍了K-means层次聚类两种常见算法,并通过简单示例代码进行了演示。在实践中,选择合适的聚类算法和参数是非常关键的,需要结合具体数据集的特点进行调整。

14 降维技术简介

14 降维技术简介

降维技术在机器学习中是非常重要的一环,尤其在处理高维数据时。通过降维,既可以简化数据的表示,增强模型的性能,还能帮助我们更好地可视化数据。本文将介绍几种常见的降维技术,包括主成分分析(PCA)、线性判别分析(LDA)和t-SNE,并通过案例和代码展示其应用。

什么是降维?

降维是指将高维数据转化为低维数据的过程,同时尽可能保留原数据的重要信息。降维的主要优点包括:

  • 去噪声:去除冗余的特征,降低数据复杂度。
  • 提高可视化:通过将数据投影到2D或3D空间,帮助人们理解数据分布。
  • 加快计算效率:减少数据的存储空间和计算资源消耗。

主成分分析(PCA)

概述

主成分分析(PCA)是一种常用的降维方法,它通过正交变换将数据从高维空间投影到低维空间,选择解释数据方差最大的成分。PCA的核心思想是尽量保留数据中的重要信息。

举例

假设我们有一个包含多种花卉特征(如花瓣长度、花瓣宽度、花萼长度、花萼宽度)的数据集,我们希望通过PCA将其降维到两个维度。

示例代码

使用Python的sklearn库实现PCA:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.decomposition import PCA

# 加载Iris数据集
data = load_iris()
X = data.data

# 进行PCA降维
pca = PCA(n_components=2)
X_reduced = pca.fit_transform(X)

# 可视化
plt.scatter(X_reduced[:, 0], X_reduced[:, 1], c=data.target)
plt.xlabel('主成分 1')
plt.ylabel('主成分 2')
plt.title('PCA降维结果')
plt.show()

结果分析

运行上述代码后,你将看到一个散点图,展示了降维后的数据。通过这两条主成分,我们可以看到不同种类的花卉在新空间中的分布。

线性判别分析(LDA)

概述

线性判别分析(LDA)是一种监督学习的降维方法,旨在找到可以最大化类别间距离和最小化类别内距离的投影。与PCA不同,LDA考虑了类别标签,以便更好地区分不同类别的样本。

举例

假设我们使用与PCA类似的花卉数据集,但这次需要通过LDA对数据降维。

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA

# 进行LDA降维
lda = LDA(n_components=2)
X_lda = lda.fit_transform(X, data.target)

# 可视化
plt.scatter(X_lda[:, 0], X_lda[:, 1], c=data.target)
plt.xlabel('LDA成分 1')
plt.ylabel('LDA成分 2')
plt.title('LDA降维结果')
plt.show()

结果分析

LDA的降维效果通常更好,因为它考虑了数据的类别结构。在可视化中,你将看到不同种类的样本更有效地区分。

t-SNE

概述

t-SNE(t-distributed Stochastic Neighbor Embedding)是一种非线性降维技术,特别适合于数据可视化。它通过最小化高维空间中样本对之间的条件概率分布和低维空间中样本对之间的条件概率分布之间的差异,从而实现降维。

举例

假设要对手写数字数据集进行降维并可视化。

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from sklearn.datasets import fetch_openml
from sklearn.manifold import TSNE

# 加载手写数字数据集
digits = fetch_openml('mnist_784')
X_digits = digits.data

# 进行t-SNE降维
tsne = TSNE(n_components=2, random_state=42)
X_tsne = tsne.fit_transform(X_digits[:1000]) # 只取前1000个样本

# 可视化
plt.scatter(X_tsne[:, 0], X_tsne[:, 1], c=digits.target[:1000], cmap='viridis')
plt.xlabel('t-SNE成分 1')
plt.ylabel('t-SNE成分 2')
plt.title('t-SNE降维结果')
plt.show()

结果分析

运行上述代码后,您将看到手写数字在2D空间中的分布。t-SNE能够很好地展示出不同数字之间的距离关系,体现其强大的可视化能力。

总结

降维技术是处理高维数据时的重要工具,它能够降低计算复杂性、增强可视化效果并改善模型性能。在实践中,根据不同的数据特性和应用需求选择合适的降维方法是非常重要的。通过上述示例,相信你对PCALDAt-SNE有了初步的认识和理解。继续探索降维技术,你将会在机器学习的旅程中收获更多!

15 关联规则学习

15 关联规则学习

关联规则学习是一种重要的挖掘方法,主要用于发现数据集中事物之间的有趣关系。它在市场篮子分析、推荐系统等领域应用广泛。本文将介绍关联规则的基本概念、常用算法及其Python实现。

基本概念

关联规则通常表示为一种形式:

1
{A, B} -> {C}

这意味着在包含项目 AB 的购物篮中,C 也很可能被购买。理解关联规则的两个重要指标是:

  • **支持度 (Support)**:表示包含项目集的交易占总交易数的比例。公式如下:

    1
    Support(A → B) = P(A ∪ B)
  • **置信度 (Confidence)**:表示在包含项目集 A 的交易中,项目集 B 也被购买的比例。公式如下:

    1
    Confidence(A → B) = P(B | A)

Apriori算法

Apriori 算法是最经典的关联规则学习算法之一。其核心思想是通过逐步生成候选项集,筛选出频繁项集,从而生成关联规则。

算法步骤

  1. 生成频繁项集
    • 找到所有频繁项集,支持度大于设定的最小支持度。
  2. 生成关联规则
    • 根据频繁项集计算置信度,筛选出置信度高于设定的最小置信度的规则。

示例

考虑一个简单的交易数据集,其中每一项代表顾客购买的商品。假设我们有以下交易记录:

1
2
3
4
5
交易1: {牛奶, 面包}
交易2: {牛奶, 尿布, 啤酒}
交易3: {面包, 尿布}
交易4: {牛奶, 面包, 尿布, 啤酒}
交易5: {面包, 啤酒}

计算支持度和置信度

  • 支持度计算:

    • {牛奶, 面包} 的支持度:
    1
    Support(牛奶, 面包) = 3/5 = 0.6
  • 置信度计算:

    • {牛奶} -> {面包} 的置信度:
    1
    2
    Confidence(牛奶 -> 面包) = Support(牛奶, 面包) / Support(牛奶)
    = 3/4 = 0.75

Python实现

使用 mlxtend 库可以方便地实现 Apriori 算法和生成关联规则。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import pandas as pd
from mlxtend.frequent_patterns import apriori, association_rules

# 示例交易数据
data = [['牛奶', '面包'],
['牛奶', '尿布', '啤酒'],
['面包', '尿布'],
['牛奶', '面包', '尿布', '啤酒'],
['面包', '啤酒']]

# 将数据转换为DataFrame
df = pd.DataFrame(data, columns=['Products'])

# 使用one-hot编码
basket = df['Products'].str.join(',').str.get_dummies(sep=',')

# 计算频繁项集
frequent_itemsets = apriori(basket, min_support=0.4, use_colnames=True)

# 生成关联规则
rules = association_rules(frequent_itemsets, metric="confidence", min_threshold=0.7)

# 输出规则
print(rules)

结果分析

运行上面的代码会输出符合条件的关联规则,包括支持度、置信度等指标。用户可以根据这些指标深入了解产品之间的购买关系,以优化营销策略或推荐系统。

结论

关联规则学习是数据挖掘中的一种强大工具,可以帮助我们发现数据中的有趣模式和关系,通过支持度和置信度的计算,用户能够有效地理解和利用这些模式。希望本节内容能够帮助小白更好地理解关联规则及其在机器学习中的应用。