DBSCAN聚类

DBSCAN(Density-Based Spatial Clustering of Applications with Noise) 是一种基于密度的聚类算法,广泛应用于数据挖掘和机器学习领域。与传统的聚类方法(如K-Means)不同,DBSCAN能够有效地识别任意形状的簇,并自动处理噪声点,因此在处理具有复杂结构和噪声的数据集时表现尤为出色。

本文将涵盖以下内容:

  1. DBSCAN简介
  2. DBSCAN的工作原理
  3. 主要参数解释
  4. DBSCAN与其他聚类算法的比较
  5. Python中实现DBSCAN
  6. DBSCAN在金融风控中的应用
  7. 实际示例
  8. 注意事项与最佳实践
  9. 总结

1. DBSCAN简介

DBSCAN(Density-Based Spatial Clustering of Applications with Noise) 由Martin Ester、Hans-Peter Kriegel、Jörg Sander和Xiaowei Xu于1996年提出,是一种基于密度的聚类算法。其核心思想是通过评估数据点周围的密度来定义簇,从而能够自动识别簇的数量,并有效地处理噪声和异常值。

主要特点

  • 无需预先指定簇的数量:与K-Means不同,DBSCAN不需要用户事先指定簇的数量 K K K
  • 识别任意形状的簇:能够发现非凸形状的簇,如环形、螺旋形等。
  • 处理噪声和异常值:能够自动将密度较低的点归类为噪声,不属于任何簇。
  • 基于密度:通过密度阈值和邻域大小来定义簇,适用于不同密度的数据分布。

2. DBSCAN的工作原理

DBSCAN通过以下步骤对数据进行聚类:

2.1 核心概念

  • ε(eps):邻域半径,定义了一个数据点的邻域范围。
  • MinPts:最小样本数,定义了在ε邻域内形成核心点所需的最小数据点数量(包括自身)。
  • 核心点(Core Point):在ε邻域内至少包含MinPts个数据点(包括自身)的点。
  • 边界点(Border Point):在ε邻域内数据点数少于MinPts,但在其邻域内至少包含一个核心点的点。
  • 噪声点(Noise Point):既不是核心点也不是边界点的点。

2.2 算法步骤

  1. 初始化:标记所有数据点为未访问。
  2. 遍历数据点
    • 对于每个未访问的点,标记为已访问。
    • 找出其ε邻域内的所有点。
    • 如果邻域内的点数 ≥ \geq MinPts,则将该点标记为核心点,并开始扩展簇。
    • 否则,将该点标记为噪声点。
  3. 扩展簇
    • 将核心点的邻域内所有点加入当前簇。
    • 对于新加入簇的每个核心点,重复上述过程,直到无法再扩展。
  4. 继续遍历:重复步骤2和3,直到所有点都被访问。

3. 主要参数解释

DBSCAN的性能和聚类结果高度依赖于其主要参数:ε(eps)和MinPts。理解和合理选择这些参数对于获得良好的聚类效果至关重要。

3.1 ε(eps)

  • 定义:邻域半径,决定了数据点周围的邻域范围。
  • 选择方法
    • k-距离图(k-distance graph)
      1. 选择 k = MinPts − 1 k = \text{MinPts} - 1 k=MinPts1
      2. 计算每个点到其第 k k k 个最近邻的距离。
      3. 将这些距离按升序排列,绘制k-距离图。
      4. 寻找图中的“拐点”作为ε的估计值。
    • 经验法则:ε应根据数据的特性进行调整,通常与数据的密度相关。

3.2 MinPts

  • 定义:在ε邻域内形成核心点所需的最小数据点数量。
  • 选择方法
    • 经验法则:对于任意数据集, MinPts ≥ 维度 + 1 \text{MinPts} \geq \text{维度} + 1 MinPts维度+1
    • 具体建议
      • 对于低维数据(如2D),可以选择较小的MinPts(如4)。
      • 对于高维数据,可以适当增加MinPts,以保证核心点的稳定性。

3.3 其他参数

  • metric:距离度量方式,默认是欧氏距离(‘euclidean’),可以选择其他度量,如曼哈顿距离(‘manhattan’)、闵可夫斯基距离(‘minkowski’)等。
  • algorithm:用于近邻搜索的算法,常见的有’auto’、‘ball_tree’、‘kd_tree’、'brute’等。'auto’会根据数据自动选择最优算法。
  • leaf_size:树结构的叶节点大小,对Ball Tree和KD Tree算法的性能有影响。

4. DBSCAN与其他聚类算法的比较

理解DBSCAN与其他聚类算法的异同,有助于在实际应用中选择最合适的算法。

4.1 DBSCAN vs K-Means

  • 簇形状

    • K-Means:适用于凸形、球状簇。
    • DBSCAN:能够识别任意形状的簇,如环形、螺旋形等。
  • 噪声处理

    • K-Means:不直接处理噪声点,所有点必须分配到某个簇。
    • DBSCAN:能够自动将低密度区域的点标记为噪声。
  • 预设参数

    • K-Means:需要预先指定簇的数量 K K K
    • DBSCAN:不需要预先指定簇的数量,但需要选择ε和MinPts。
  • 对异常值的敏感性

    • K-Means:对异常值较为敏感,异常点可能会影响簇中心的位置。
    • DBSCAN:能够识别并隔离噪声点,减少对聚类结果的影响。

4.2 DBSCAN vs Hierarchical Clustering

  • 算法类型

    • DBSCAN:基于密度的聚类算法。
    • Hierarchical Clustering:基于距离的层次聚类算法。
  • 簇数量

    • DBSCAN:无需预先指定簇的数量。
    • Hierarchical Clustering:需要选择剪枝的层级来决定簇的数量。
  • 簇形状

    • DBSCAN:能够识别任意形状的簇。
    • Hierarchical Clustering:较难识别非凸形状的簇,尤其是单链接和全链接方法。

4.3 DBSCAN vs Mean Shift

  • 算法类型

    • DBSCAN:基于密度的聚类算法。
    • Mean Shift:基于密度梯度上升的聚类算法。
  • 参数选择

    • DBSCAN:需要选择ε和MinPts。
    • Mean Shift:需要选择带宽参数(bandwidth),决定核函数的范围。
  • 簇数量

    • DBSCAN:无需预先指定簇的数量。
    • Mean Shift:簇数量由带宽参数决定。

5. Python中实现DBSCAN

在Python中,scikit-learn库提供了方便的DBSCAN实现。下面将介绍如何使用DBSCAN进行聚类分析,包括数据准备、模型训练、结果评估与可视化。

5.1 安装scikit-learn

如果尚未安装scikit-learn,可以通过以下命令进行安装:

pip install scikit-learn

5.2 基本用法示例

以下是一个使用DBSCAN进行聚类分析的基本示例:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import DBSCAN
from sklearn.datasets import make_blobs

# 1. 生成示例数据
X, y_true = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)

# 2. 初始化DBSCAN模型
dbscan = DBSCAN(eps=0.5, min_samples=5)

# 3. 训练模型
dbscan.fit(X)

# 4. 获取聚类标签
labels = dbscan.labels_

# 5. 可视化聚类结果
unique_labels = set(labels)
colors = [plt.cm.Spectral(each) for each in np.linspace(0, 1, len(unique_labels))]

for k, col in zip(unique_labels, colors):
    if k == -1:
        # 噪声点
        col = [0, 0, 0, 1]
    
    class_member_mask = (labels == k)
    
    xy = X[class_member_mask & True]
    plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=tuple(col),
             markeredgecolor='k', markersize=6)
    
    xy = X[class_member_mask & False]
    plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=tuple(col),
             markeredgecolor='k', markersize=6)

plt.title('DBSCAN Clustering')
plt.show()

解释

  1. 数据生成:使用make_blobs生成具有明显簇结构的示例数据。
  2. 模型初始化:设置ε=0.5和MinPts=5,这是常用的默认参数。
  3. 模型训练:使用fit方法训练DBSCAN模型。
  4. 获取聚类标签labels_属性包含每个样本的聚类标签,-1表示噪声点。
  5. 结果可视化:使用不同颜色表示不同簇,黑色表示噪声点。

5.3 参数调整与优化

选择合适的ε和MinPts对于DBSCAN的聚类效果至关重要。以下是一些参数调整的方法和技巧。

5.3.1 k-距离图法选择ε

绘制k-距离图,寻找拐点作为ε的估计值。

from sklearn.neighbors import NearestNeighbors

# 选择k = MinPts - 1
k = 4  # 假设MinPts=5
neighbors = NearestNeighbors(n_neighbors=k)
neighbors_fit = neighbors.fit(X)
distances, indices = neighbors_fit.kneighbors(X)

# 取k距离
distances = np.sort(distances[:, k-1])
plt.plot(distances)
plt.xlabel('Data Points sorted by distance')
plt.ylabel(f'{k}-NN Distance')
plt.title('k-distance Graph to Determine ε')
plt.show()

解释

  1. 邻近搜索:使用NearestNeighbors找到每个点的k最近邻。
  2. k-距离提取:提取每个点到其第k个最近邻的距离。
  3. 排序与绘图:将距离排序并绘制k-距离图,寻找“拐点”作为ε的估计值。
5.3.2 使用Grid Search进行参数调优

可以使用交叉验证和网格搜索来选择最佳的ε和MinPts参数组合,虽然DBSCAN本身不直接支持这种方法。

from sklearn.metrics import silhouette_score
from sklearn.cluster import DBSCAN

# 定义参数范围
eps_values = np.linspace(0.1, 2.0, 20)
min_samples_values = range(3, 10)

best_score = -1
best_params = {'eps': None, 'min_samples': None}

for eps in eps_values:
    for min_samples in min_samples_values:
        dbscan = DBSCAN(eps=eps, min_samples=min_samples)
        labels = dbscan.fit_predict(X)
        
        # 计算轮廓系数,仅在有2个以上簇时计算
        if len(set(labels)) > 1 and len(set(labels)) < len(X):
            score = silhouette_score(X, labels)
            if score > best_score:
                best_score = score
                best_params['eps'] = eps
                best_params['min_samples'] = min_samples

print(f"Best Silhouette Score: {best_score:.4f}")
print(f"Best Parameters: eps={best_params['eps']}, min_samples={best_params['min_samples']}")

注意:轮廓系数(Silhouette Score)仅在存在两个或更多簇时有效,对于含噪声点的DBSCAN,需谨慎解释结果。

5.4 高维数据中的DBSCAN

在高维空间中,数据点之间的距离往往变得稀疏,这可能导致DBSCAN性能下降(即“维度灾难”)。以下是一些处理高维数据的方法:

  1. 降维:使用PCA、t-SNE、UMAP等降维技术将数据降至较低维度。
  2. 特征选择:选择最具区分力的特征,减少噪声和冗余特征。
  3. 距离度量:选择适合高维数据的距离度量方式,如余弦相似度等。

6. DBSCAN在金融风控中的应用

在金融风控领域,DBSCAN可以用于多种任务,特别是那些涉及异常检测、客户分群和行为模式识别的场景。以下是一些具体的应用案例:

6.1 欺诈检测

  • 背景:金融交易数据通常包含大量正常交易和少量欺诈交易。DBSCAN能够识别密集的正常交易簇,并将密度较低的异常交易点标记为潜在欺诈行为。
  • 优势
    • 自动识别欺诈模式:无需预先定义欺诈的特征模式。
    • 处理高维数据:结合降维技术,可以有效处理多维交易特征。

6.2 客户分群

  • 背景:金融机构需要根据客户的行为、信用记录和交易模式将客户分为不同的群体,以便实施差异化的营销策略和风险管理。
  • 优势
    • 发现复杂群体:DBSCAN能够识别形状复杂且密度不同的客户群体。
    • 识别离群客户:能够自动检测并隔离异常客户,如高风险客户。

6.3 信用风险评估

  • 背景:通过聚类分析,识别具有相似信用特征的借款人群体,辅助信用评分模型的构建和优化。
  • 优势
    • 提高模型性能:聚类结果可作为额外的特征输入信用评分模型,提升预测准确性。
    • 风险管理:识别高风险群体,制定针对性的风险控制策略。

6.4 异常行为检测

  • 背景:监控金融系统中的账户活动,检测异常行为,如账户劫持、频繁小额交易等。
  • 优势
    • 实时监控:结合在线聚类方法,实时检测并响应异常行为。
    • 适应性强:能够适应数据分布的变化,减少误报和漏报。

7. 实际示例

以下将通过一个具体的示例,展示如何在Python中使用DBSCAN进行客户分群,适用于金融风控中的客户细分任务。

7.1 数据准备

假设我们有一个包含客户基本信息和行为特征的数据集,目标是根据这些特征将客户分为不同的群体。

import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA

# 1. 加载数据
# 假设数据集包含以下列:
# 'age'(年龄)、'income'(收入)、'credit_score'(信用评分)、'transaction_freq'(交易频率)、'avg_transaction_amount'(平均交易金额)
data = pd.read_csv('customer_data.csv')

# 2. 特征选择
features = ['age', 'income', 'credit_score', 'transaction_freq', 'avg_transaction_amount']
X = data[features]

# 3. 数据预处理
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 4. 降维(可选)
pca = PCA(n_components=2)  # 降至2维,便于可视化
X_pca = pca.fit_transform(X_scaled)

7.2 应用DBSCAN进行客户分群

from sklearn.cluster import DBSCAN
import matplotlib.pyplot as plt

# 1. 初始化DBSCAN模型
dbscan = DBSCAN(eps=0.5, min_samples=5)

# 2. 训练模型
dbscan.fit(X_pca)

# 3. 获取聚类标签
labels = dbscan.labels_

# 4. 统计簇的数量和噪声点
n_clusters = len(set(labels)) - (1 if -1 in labels else 0)
n_noise = list(labels).count(-1)
print(f"Estimated number of clusters: {n_clusters}")
print(f"Estimated number of noise points: {n_noise}")

# 5. 可视化聚类结果
unique_labels = set(labels)
colors = [plt.cm.Spectral(each)
          for each in np.linspace(0, 1, len(unique_labels))]

plt.figure(figsize=(10, 7))
for k, col in zip(unique_labels, colors):
    if k == -1:
        # 噪声点
        col = [0, 0, 0, 1]
    
    class_member_mask = (labels == k)
    
    xy = X_pca[class_member_mask & True]
    plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=tuple(col),
             markeredgecolor='k', markersize=6, label=f'Cluster {k}' if k != -1 else 'Noise')

plt.title('DBSCAN Clustering of Customers')
plt.xlabel('PCA Component 1')
plt.ylabel('PCA Component 2')
plt.legend()
plt.show()

解释

  1. 模型初始化:设置ε=0.5和MinPts=5(可以根据数据和k-距离图进行调整)。
  2. 模型训练:使用降维后的数据训练DBSCAN模型。
  3. 结果获取与统计:获取每个样本的聚类标签,并统计簇的数量和噪声点数量。
  4. 结果可视化:在2D空间中可视化聚类结果,不同颜色代表不同簇,黑色点表示噪声。

7.3 结果分析

假设输出结果如下:

Estimated number of clusters: 3
Estimated number of noise points: 50

说明

  • 簇数量:模型估计出3个主要的客户群体。
  • 噪声点:有50个客户被标记为噪声,可能是异常客户或数据异常点。
  • 客户分布:不同簇代表不同的客户群体,如高收入高交易频率客户、中等收入中等交易频率客户等。

7.4 聚类结果的后续应用

根据DBSCAN的聚类结果,金融机构可以:

  1. 制定差异化的营销策略:针对不同客户群体设计个性化的产品和服务。
  2. 风险管理:识别高风险群体,实施更严格的信用控制措施。
  3. 客户关系管理(CRM):优化客户服务,提升客户满意度和忠诚度。

8. 注意事项与最佳实践

在使用DBSCAN进行聚类分析时,需要注意以下事项和最佳实践,以确保获得准确和有意义的聚类结果。

8.1 参数选择

  • ε(eps)MinPts是DBSCAN的关键参数,直接影响聚类结果。合理选择这些参数至关重要。
  • k-距离图是选择ε的常用方法,通过观察k-距离图中的“拐点”可以获得较好的ε值。
  • MinPts的选择通常基于数据的维度和预期簇的密度。对于低维数据,较小的MinPts(如4)通常效果较好;对于高维数据,适当增加MinPts以确保核心点的稳定性。

8.2 数据预处理

  • 标准化:DBSCAN基于距离度量,数据的尺度对结果有显著影响。通常需要对数据进行标准化或归一化处理。
  • 降维:对于高维数据,降维(如PCA、t-SNE、UMAP)不仅有助于可视化,还能提高DBSCAN的性能和效果。
  • 处理异常值:虽然DBSCAN能够识别噪声点,但过多的异常值可能影响聚类结果。预先处理异常值(如通过IQR法或Z-Score方法)可以提升聚类质量。

8.3 选择合适的距离度量

  • 欧氏距离(‘euclidean’):适用于大多数场景,尤其是数据经过标准化后。
  • 曼哈顿距离(‘manhattan’)、**闵可夫斯基距离(‘minkowski’)**等:根据数据的特性选择合适的距离度量方式。

8.4 评估聚类结果

由于聚类是一种无监督学习方法,评估聚类结果的准确性和有效性相对复杂。常用的评估指标包括:

  • 轮廓系数(Silhouette Score):衡量样本与其簇内和簇外的紧密程度。
  • Davies-Bouldin指数(DBI):衡量簇之间的相似度,值越小表示簇分离效果越好。
  • Calinski-Harabasz指数:评估簇的紧密度和分离度,值越大表示聚类效果越好。
from sklearn.metrics import silhouette_score, davies_bouldin_score, calinski_harabasz_score

# 计算评估指标
silhouette = silhouette_score(X_pca, labels)
dbi = davies_bouldin_score(X_pca, labels)
calinski = calinski_harabasz_score(X_pca, labels)

print(f"Silhouette Score: {silhouette:.4f}")
print(f"Davies-Bouldin Index: {dbi:.4f}")
print(f"Calinski-Harabasz Index: {calinski:.4f}")

8.5 处理不同密度的簇

DBSCAN对簇的密度具有敏感性,即相邻簇的密度差异较大时,可能难以准确识别所有簇。以下是一些应对策略:

  • 调整MinPts和ε:尝试不同的参数组合,以适应不同密度的簇。
  • 使用OPTICS:OPTICS(Ordering Points To Identify the Clustering Structure)是一种扩展的DBSCAN算法,能够更好地处理不同密度的簇。
from sklearn.cluster import OPTICS

optics = OPTICS(min_samples=5, xi=0.05, min_cluster_size=0.1)
optics.fit(X_pca)
labels_optics = optics.labels_

# 可视化
plt.figure(figsize=(10, 7))
unique_labels_optics = set(labels_optics)
colors_optics = [plt.cm.Spectral(each)
          for each in np.linspace(0, 1, len(unique_labels_optics))]

for k, col in zip(unique_labels_optics, colors_optics):
    if k == -1:
        # 噪声点
        col = [0, 0, 0, 1]
    
    class_member_mask = (labels_optics == k)
    
    xy = X_pca[class_member_mask & True]
    plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=tuple(col),
             markeredgecolor='k', markersize=6, label=f'Cluster {k}' if k != -1 else 'Noise')

plt.title('OPTICS Clustering of Customers')
plt.xlabel('PCA Component 1')
plt.ylabel('PCA Component 2')
plt.legend()
plt.show()

9. 总结

DBSCAN(Density-Based Spatial Clustering of Applications with Noise) 是一种基于密度的聚类算法,具有以下优点:

  • 无需预先指定簇的数量,自动识别簇的数量。
  • 能够识别任意形状的簇,适用于复杂的簇结构。
  • 能够有效处理噪声和异常值,将低密度区域的点标记为噪声。

然而,DBSCAN也存在一些局限性:

  • 对参数敏感,尤其是ε和MinPts的选择。
  • 在高维数据中性能下降,容易受到“维度灾难”的影响。
  • 难以处理具有不同密度的簇,除非使用更先进的算法如OPTICS。

在金融风控中的应用

DBSCAN在金融风控领域具有广泛的应用,包括但不限于:

  • 欺诈检测:通过识别交易数据中的异常模式,及时发现潜在欺诈行为。
  • 客户分群:根据客户的行为和信用特征,将客户分为不同群体,制定差异化的风险管理和营销策略。
  • 信用风险评估:通过聚类分析,识别高风险客户群体,优化信用评分模型。

最佳实践

  1. 参数调优:使用k-距离图和交叉验证方法,选择合适的ε和MinPts参数。
  2. 数据预处理:对数据进行标准化、降维和异常值处理,以提升DBSCAN的性能和效果。
  3. 评估聚类结果:结合多种评估指标(如轮廓系数、Davies-Bouldin指数、Calinski-Harabasz指数)全面评估聚类质量。
  4. 结合业务知识:根据金融风控的具体需求和业务背景,解释和应用聚类结果,确保其在实际场景中的可用性和有效性。

进一步学习资源

### DBSCAN聚类算法概述 DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的空间聚类算法,能够有效地处理噪声数据并发现任意形状的簇。该算法不需要预先指定簇的数量,而是通过两个重要参数来控制:`Eps` 和 `MinPts`。 - **Eps (ε)** 表示半径距离,在给定范围内可以找到其他样本点的最大距离。 - **MinPts** 是指在某一点周围至少需要存在的最小样本数量才能定义为核心点[^1]。 核心概念包括: - **核心对象(Core Point)**:在其邻域内拥有超过一定数目(`MinPts`)的对象称为核心对象; - **边界对象(Border Point)**:不是核心对象但在某个核心对象的邻域内的点; - **噪音(Noise)**:既不属于任何簇也不位于其它簇边界的孤立点; ### MATLAB 实现 对于希望快速上手的人来说,MATLAB 提供了一个简单易用的方式来实现DBSCAN聚类。下面是一个简单的例子展示如何使用MATLAB内置函数执行DBSCAN操作: ```matlab % 加载数据集 load fisheriris; X = meas; % 设置DBSCAN 参数 epsilon = 0.3; % Epsilon 值 minpts = 5; % MinPts 数量 % 执行DBSCAN 聚类 [idx, ~] = dbscan(X', epsilon, minpts); % 可视化结果 gscatter(X(:,1), X(:,2), idx); title('DBSCAN Cluster Results'); xlabel('Feature 1'); ylabel('Feature 2'); ``` 这段代码加载了著名的鸢尾花(Iris) 数据集,并应用DBSCAN对其进行分类。最后绘制出不同颜色表示的不同类别散点。 ### Python 实现 除了MATLAB之外,Python也是实施DBSCAN的理想工具之一。Scikit-Learn库提供了方便快捷的方法来进行此类分析工作。以下是采用sklearn.cluster.DBSCAN模块的一个实例程序片段: ```python from sklearn.datasets import load_iris from sklearn.preprocessing import StandardScaler from sklearn.cluster import DBSCAN import matplotlib.pyplot as plt # 导入数据 data = load_iris() X = data.data[:, :2] # 标准化特征向量 scaler = StandardScaler().fit(X) X_scaled = scaler.transform(X) # 创建模型实例 dbscan_model = DBSCAN(eps=0.3, min_samples=5).fit(X_scaled) # 获取标签 labels = dbscan_model.labels_ # 绘制形 plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis') plt.title("DBSCAN Clusters") plt.show() ``` 此脚本同样选取了Iris数据集中前两维属性用于可视化目的,并调用了SciKit Learn中的DBSCAN方法完成实际计算过程[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彬彬侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值