13 聚类分析入门教程

13 聚类分析入门教程

聚类分析是一种无监督的学习方法,旨在将数据集中的对象分组,使得同一组内的对象彼此相似,而不同组之间的对象差异较大。本文将介绍聚类分析的基本概念、常用算法和应用案例,帮助小白理解聚类分析的核心思想及其实际应用。

1. 聚类分析的基本概念

在开始之前,了解几个基本的术语是很重要的:

  • 聚类:将数据点分组的过程。
  • 相似性:通常使用距离度量(如欧氏距离)来衡量数据点之间的相似性。
  • :聚类的结果,表示相似数据点的集合。

2. 常用聚类算法

聚类分析有多种算法,目前较为常用的包括:

(1) K-means算法

K-means是一种基于划分的聚类方法,适用于大规模数据。其基本思路为:根据用户指定的簇数K,通过迭代更新簇心和重新分配数据点来达到最终聚类结果。

K-means算法步骤

  1. 初始化K个簇心。
  2. 将每个数据点分配到最近的簇心。
  3. 更新每个簇的簇心为该簇所有数据点的均值。
  4. 重复步骤2和3,直到簇心不再变化或达到最大迭代次数。

案例:K-means聚类示例

以下是一个使用Python及sklearn库进行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

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

# 使用K-means算法进行聚类
kmeans = KMeans(n_clusters=3)
kmeans.fit(X)

# 获取簇心和每个点的簇标签
centroids = kmeans.cluster_centers_
labels = kmeans.labels_

# 可视化聚类结果
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis')
plt.scatter(centroids[:, 0], centroids[:, 1], s=300, c='red', label='Centroids')
plt.title('K-means Clustering')
plt.legend()
plt.show()

(2) DBSCAN算法

DBSCAN是一种基于密度的聚类算法,不需要预先指定簇的数量。它通过定义一个半径和最小点数的方式来识别密集区域。

DBSCAN算法步骤

  1. 对于每个数据点P,计算其ε邻域内的点。
  2. 如果邻域内的点数不小于MinPts,则P为核心点,形成新簇。
  3. 通过扩展核心点周围的点,形成一个簇。
  4. 重复上述步骤,直到所有点都被访问。

案例:DBSCAN聚类示例

可以使用以下代码实现DBSCAN聚类:

1
2
3
4
5
6
7
8
9
10
11
12
13
from sklearn.cluster import DBSCAN

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

# 使用DBSCAN算法进行聚类
dbscan = DBSCAN(eps=0.1, min_samples=5)
labels = dbscan.fit_predict(X)

# 可视化聚类结果
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis')
plt.title('DBSCAN Clustering')
plt.show()

3. 聚类分析的应用案例

聚类分析在多个领域都有广泛的应用,以下是一些典型案例:

(1) 客户细分

在市场营销中,企业可以利用聚类分析将客户按照购买行为进行细分,识别出不同的客户群体,从而制定有针对性的营销策略。

(2) 图像处理

在图像处理中,聚类可以用于将类似颜色的像素聚合在一起,支持图像分割和图像压缩等任务。例如,K-means可以用于图像的色彩量化。

(3) 社交网络分析

社交网络中,聚类分析可以帮助分析用户群体,识别出不同社交圈层,发现潜在的社区结构。

4. 结论

聚类分析是一种重要的无监督学习技术,通过将相似的数据点归为同一簇,帮助我们理解数据的结构和特征。掌握K-means和DBSCAN等基本聚类算法,可以在多种实际应用中发挥重要作用。在实践中,选择合适的聚类算法和参数,并结合数据特性,将会取得更好的分析效果。

从入门到实践

从入门到实践

概述

关联规则挖掘是一种发现数据中有趣关系的技术,常用于市场篮子分析。目标是找到在某些条件下发生的事件之间的关联性,比如在购物篮中一起出现的商品。

关键概念

  • 支持度 (Support): 一个规则的支持度是指在所有事务中,该规则的先导和结论同时出现的比例。
    公式:
    [ Support(A \rightarrow B) = \frac{Count(A \cap B)}{Total\ Count} ]

  • 置信度 (Confidence): 置信度是规则的强度,表示在包含A的交易中,有多少也包含B。
    公式:
    [ Confidence(A \rightarrow B) = \frac{Support(A \cap B)}{Support(A)} ]

  • 提升度 (Lift): 提升度衡量的是A与B之间的独立性。
    公式:
    [ Lift(A \rightarrow B) = \frac{Confidence(A \rightarrow B)}{Support(B)} ]

案例研究:超市购物篮分析

假设我们有一个超市的购物篮数据,如下:

交易ID 商品
1 牛奶, 面包
2 面包, 尿布, 啤酒
3 牛奶, 尿布, 啤酒, 鸡蛋
4 面包, 牛奶, 鸡蛋
5 面包, 鸡蛋

数据准备

首先,我们需要将数据转换为适合分析的格式。可以用 Python 的 pandas 库来处理。

1
2
3
4
5
6
7
8
9
10
import pandas as pd

# 创建购物篮数据
data = {'TransactionID': [1, 2, 3, 4, 5],
'Items': [['牛奶', '面包'],
['面包', '尿布', '啤酒'],
['牛奶', '尿布', '啤酒', '鸡蛋'],
['面包', '牛奶', '鸡蛋'],
['面包', '鸡蛋']]}
df = pd.DataFrame(data)

计算支持度

接下来,我们需要计算每种商品的支持度。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from itertools import combinations

# 获取所有商品的列表
all_items = set(item for sublist in df['Items'] for item in sublist)

# 计算支持度
item_count = {item: 0 for item in all_items}
for items in df['Items']:
for item in items:
item_count[item] += 1

# 计算支持度比例
total_transactions = len(df)
support = {item: count / total_transactions for item, count in item_count.items()}
print(support)

找到关联规则

我们可以使用 mlxtend 库中的 aprioriassociation_rules 函数来生成关联规则。

1
2
3
4
5
6
7
8
9
from mlxtend.frequent_patterns import apriori, association_rules

# 使用 one-hot 编码将数据转换为适合分析的格式
basket = df['Items'].str.join('|').str.get_dummies()
frequent_itemsets = apriori(basket, min_support=0.3, use_colnames=True)

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

在这个例子中,我们可能会发现这样的关联规则:

  • 如果一个顾客购买了“面包”,那么他们很有可能也会购买“牛奶”。

分析结果

通过 支持度置信度提升度 衡量的规则,我们可以筛选出那些具有商业价值的关联规则。例如,提升度大于1的规则表示这两个商品之间存在正相关。

结论

关联规则挖掘可以帮助商家发现顾客的购买模式,从而制定更有效的营销策略。通过分析超市购物篮的数据,我们不仅可以理解商品之间的关系,还可以针对性地进行促销活动。同时,Python 的数据处理库使得实现关联规则挖掘变得相对简单。

在实践中,多尝试不同的参数和数据集,将有助于您更好地掌握关联规则挖掘的技巧与方法。

15 模型评估指标

15 模型评估指标

在数据挖掘中,模型评估指标是至关重要的,它帮助我们判断模型的性能和有效性。在这里,我们将介绍一些常见的评估指标,并通过实际案例进行解释和展示代码示例。

1. 分类模型评估指标

1.1 准确率 (Accuracy)

准确率是最常用的评估指标之一,表示模型预测正确的样本占总样本的比例。公式如下:

$$
\text{Accuracy} = \frac{TP + TN}{TP + TN + FP + FN}
$$

其中:

  • TP:真正例(True Positives)
  • TN:真负例(True Negatives)
  • FP:假正例(False Positives)
  • FN:假负例(False Negatives)

案例:

假设我们有一个二分类问题,模型预测了100个样本,其中有70个预测正确。

1
2
3
4
5
6
7
TP = 50  # 真正例
TN = 20 # 真负例
FP = 20 # 假正例
FN = 10 # 假负例

accuracy = (TP + TN) / (TP + TN + FP + FN)
print("准确率:", accuracy) # 输出准确率

1.2 精确率 (Precision)

精确率是指模型预测为正的样本中,实际为正的比例。公式如下:

$$
\text{Precision} = \frac{TP}{TP + FP}
$$

案例:

在上述案例中,如果我们有50个真正例和20个假正例,则精确率为:

1
2
precision = TP / (TP + FP)
print("精确率:", precision) # 输出精确率

1.3 召回率 (Recall)

召回率是指实际为正的样本中,被模型正确预测为正的比例。公式如下:

$$
\text{Recall} = \frac{TP}{TP + FN}
$$

案例:

如果我们有50个真正例和10个假负例,则召回率为:

1
2
recall = TP / (TP + FN)
print("召回率:", recall) # 输出召回率

1.4 F1 值

F1 值是精确率和召回率的调和平均值,用于综合评估模型的性能。公式如下:

$$
F1 = 2 \cdot \frac{\text{Precision} \cdot \text{Recall}}{\text{Precision} + \text{Recall}}
$$

案例:

使用之前计算的精确率和召回率来计算 F1 值:

1
2
f1_score = 2 * (precision * recall) / (precision + recall)
print("F1 值:", f1_score) # 输出 F1 值

2. 回归模型评估指标

2.1 均方误差 (MSE)

均方误差用于衡量回归模型预测值与实际值之间的差异,公式如下:

$$
MSE = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y_i})^2
$$

案例:

假设我们有一组实际值和预测值:

1
2
3
4
5
6
7
import numpy as np

y_true = np.array([3, -0.5, 2, 7])
y_pred = np.array([2.5, 0.0, 2, 8])

mse = np.mean((y_true - y_pred) ** 2)
print("均方误差(MSE):", mse)

2.2 均方根误差 (RMSE)

均方根误差是均方误差的平方根,提供了误差的标准差。公式如下:

$$
RMSE = \sqrt{MSE}
$$

案例:

计算 RMSE:

1
2
rmse = np.sqrt(mse)
print("均方根误差(RMSE):", rmse)

2.3 决定系数 (R²)

决定系数用于衡量回归模型对实际数据的拟合程度,取值范围在0到1之间,越接近1表示模型越优秀。公式如下:

$$
R^2 = 1 - \frac{SS_{res}}{SS_{tot}}
$$

其中:

  • $SS_{res}$:残差平方和
  • $SS_{tot}$:总平方和

案例:

计算 $R^2$:

1
2
3
4
SS_res = np.sum((y_true - y_pred) ** 2)
SS_tot = np.sum((y_true - np.mean(y_true)) ** 2)
r_squared = 1 - (SS_res / SS_tot)
print("决定系数(R²):", r_squared)

总结

通过本节内容,我们了解了多种模型评估指标,包括分类模型和回归模型的评估方法。在实际应用中,根据数据和场景的不同,选择合适的指标将帮助我们更好地评估和优化模型性能。