数字普惠金融2026 Courseware

第四章

聚类算法与金融应用

无监督学习、客户画像与隐含结构发现

本章围绕无监督学习的金融价值,介绍相似性度量、KMeans、KMeans++、肘部法则、轮廓系数、高斯混合模型 GMM 和 EM 算法。重点不是记住算法名称,而是理解“硬分群”和“软分群”在数字普惠金融客户画像中的不同含义。

01

无监督学习的本质与价值

聚类不依赖预先标注的违约、欺诈或流失标签,而是从数据内在结构中发现相似群体。

给一班学生分组

如果老师不了解学生,最开始可能不会直接判断谁成绩好,而是先观察:谁擅长数学,谁表达能力强,谁动手能力强,谁需要更多基础训练。分组的目的不是贴标签,而是更有针对性地教学。

聚类在金融中也是这样。我们先不急着判断谁违约,而是先看客户结构:稳定经营型、季节波动型、快速成长型、低活跃型,之后再设计不同产品和风控策略。

无标签

暂时不知道真实风险结果

找相似

根据行为和特征形成群体

差异化

不同群体采用不同服务和监控方式

  • 在普惠金融中,许多客户缺少完整征信记录。聚类可以从交易行为、经营周期和资金流特征中形成客户画像。
  • 聚类结果不是最终决策,而是分析入口。每个簇都需要结合业务解释、风险指标和后续表现进行验证。
  • 无监督学习尤其适合探索性分析、特征构造、策略分层和异常样本识别。
怎么理解

聚类不是为了直接决定谁能贷款,而是帮助我们先看清客户结构。它是“画像工具”,不是“审批按钮”。

普惠金融例子

同样是小微商户,有人流水稳定但规模小,有人规模大但波动强。聚类可以把这两类客户分开,再设计不同授信策略。

课堂追问

聚类结果出来后,为什么还要用后续违约率或经营表现验证?

02

相似性度量方法

不同距离度量对应不同的“相似”定义。度量选择错误会直接导致聚类结果失真。

dE(xi,xj)=∑k=1p(xik−xjk)2d_{E}(x_i,x_j)=\sqrt{\sum_{k=1}^{p}(x_{ik}-x_{jk})^2}
  • 欧式距离适合量纲一致、变量已标准化且簇形状接近球形的数据。
  • 余弦相似度 cos⁡(x,y)=x⊤y∥x∥∥y∥\cos(x,y)=\frac{x^{\top}y}{\|x\|\|y\|} 更关注方向而非规模,适合消费结构、资产配置比例和文本向量。
  • 动态时间规整 DTW 适合比较时间序列形状,例如两家企业现金流节奏相似但时间上存在滞后。
  • 马氏距离 dM(x,μ)=(x−μ)⊤Σ−1(x−μ)d_M(x,\mu)=\sqrt{(x-\mu)^{\top}\Sigma^{-1}(x-\mu)} 能考虑变量相关性,适合金融多指标联合异常识别。
怎么理解

距离度量决定了模型眼中的“像不像”。选择距离前,先问业务上到底比较规模、结构,还是时间节奏。

普惠金融例子

两个农户收入总额不同,但一年中的收支季节性非常相似。欧式距离可能认为他们差异大,DTW 或结构比例可能更合适。

课堂追问

如果变量单位不同,例如收入金额和交易次数,为什么必须先标准化?

03

K-means 算法

K-means 通过最小化簇内平方和寻找簇中心,是最经典的聚类方法。

min⁡C1,…,CK∑k=1K∑xi∈Ck∥xi−μk∥2\min_{C_1,\ldots,C_K}\sum_{k=1}^{K}\sum_{x_i\in C_k}\|x_i-\mu_k\|^2
  • 算法交替执行两步:把样本分配到最近簇中心;根据簇内样本重新计算中心。
  • 簇中心更新为 μk=1∣Ck∣∑xi∈Ckxi\mu_k=\frac{1}{|C_k|}\sum_{x_i\in C_k}x_i。这个更新有明确均值解释,但对异常值敏感。
  • K-means++ 通过更稳健的初始化降低陷入较差局部解的概率。
怎么理解

K-means 找的是几个“代表性中心”。它适合快速分群,但不擅长处理形状复杂或异常值很多的数据。

普惠金融例子

银行可以用 K-means 把小微客户分成稳定经营型、快速成长型、季节波动型和低活跃型,再给出不同服务策略。

课堂追问

如果某个簇只有极少数客户,是新机会,还是异常噪声?如何判断?

04

肘部法则与聚类评估

聚类没有真实标签时,不能只凭视觉效果判断。需要结合内部指标、稳定性和业务可解释性。

Silhouette(i)=b(i)−a(i)max⁡{a(i),b(i)}Silhouette(i)=\frac{b(i)-a(i)}{\max\{a(i),b(i)\}}
  • 肘部法则观察簇内平方和随簇数增加的下降速度。当下降幅度明显变缓时,可作为候选簇数。
  • 轮廓系数同时考虑簇内紧密度和簇间分离度,值越高通常表示聚类结构越清晰。
  • 金融场景还需要看簇的业务稳定性:不同时间窗口、不同抽样下,同一类客户画像是否仍然存在。
怎么理解

选簇数不是数学题的唯一答案,而是数学指标和业务可解释性的折中。

普惠金融例子

模型可能建议分成 8 类,但客户经理只能清楚解释 4 类。实际落地时,4 类方案可能更适合培训和执行。

课堂追问

一个聚类方案统计指标很好,但业务人员完全解释不了,是否应该采用?

05

高斯混合模型 GMM

GMM 把数据视为多个高斯分布的混合,允许样本以概率形式属于多个簇,因此属于软聚类。

p(x)=∑k=1KπkN(x∣μk,Σk),∑k=1Kπk=1p(x)=\sum_{k=1}^{K}\pi_k\mathcal N(x\mid\mu_k,\Sigma_k),\quad \sum_{k=1}^{K}\pi_k=1
  • GMM 输出责任度 γik=p(zi=k∣xi)\gamma_{ik}=p(z_i=k\mid x_i),可以解释为客户属于第 kk 类的概率。
  • 与 K-means 相比,GMM 能表达椭圆形簇和不同方差结构,更适合风险边界不清晰的客户群体。
  • GMM 对分布假设更强,且需要注意协方差矩阵估计稳定性。
怎么理解

GMM 的“软分配”很适合金融客户,因为很多客户并不完全属于某一类,而是处在两类之间。

普惠金融例子

一个商户既有稳定社区零售特征,又开始出现线上销售增长。GMM 可以给出它属于两类的概率,而不是强行归入一类。

课堂追问

软分类结果如何帮助银行设计过渡型客户服务?

06

EM 算法的统一框架

EM 用于含有隐变量的最大似然估计。聚类中的簇标签就是典型隐变量。

Q(θ∣θold)=EZ∣X,θold[log⁡p(X,Z∣θ)]Q(\theta\mid\theta^{old})=\mathbb E_{Z\mid X,\theta^{old}}[\log p(X,Z\mid\theta)]
  • E 步估计隐变量的后验分布,例如每个样本属于每个簇的概率。
  • M 步在当前隐变量分布下更新模型参数,例如混合权重、均值和协方差。
  • K-means 可被视为硬分配版本的 EM 思想;GMM 则保留了概率责任度。
怎么理解

EM 可以理解为“先猜隐藏标签,再根据猜测更新参数”,如此反复。它适合标签看不见但结构存在的问题。

普惠金融例子

客户真实经营类型可能无法直接观察,但交易数据中隐含了类型差异。EM 就是在这些隐藏类型和模型参数之间交替更新。

课堂追问

如果初始猜测很差,EM 会不会得到错误结果?如何缓解?

07

KMeans:从“小微信贷客户分群”一步一步理解

KMeans 的核心非常朴素:先放几个中心点,让每个客户找离自己最近的中心;再把中心移动到本组客户的平均位置;不断重复,直到中心不再明显移动。

KMeans 从初始化、分配样本、更新中心到收敛的四步示意图
这张图是根据 scikit-learn 官方 KMeans 文档中的算法思想自制的本地示意图。横轴可以理解为经营活跃度,纵轴可以理解为资金流稳定性;每个点代表一个小微商户。

先用一个很小的样本理解算法。假设平台收集了 12 家小微商户的两个标准化特征:经营活跃度和资金流稳定性。数值越接近 1,表示该特征越强。真实业务中当然会有更多变量,例如月流水、交易频率、退款率、线上订单占比、历史逾期次数、行业季节性等;这里先用两个变量,是为了让几何图像足够清楚。

示例数据:12 家小微商户的两个画像指标

这不是为了训练一个真实模型,而是为了看懂 KMeans 每一步到底在做什么。

商户经营活跃度资金流稳定性直观理解
A01-A040.22-0.300.76-0.86规模不大,但资金流稳定,类似社区稳定经营型商户。
B01-B040.68-0.790.52-0.64经营较活跃,稳定性中等,可能处于扩张或线上化阶段。
C01-C040.62-0.830.18-0.30活跃度不低,但资金流波动较大,需要更谨慎地评估还款节奏。
J=∑k=1K∑i∈Ck∥xi−μk∥2

这个目标函数可以翻译成一句话:让每个客户尽量靠近自己所属簇的中心。其中 xᵢ 是第 i 个客户的特征向量,μₖ 是第 k 个簇的中心,Cₖ 是第 k 个簇中所有客户的集合。KMeans 不是直接最大化利润,也不是直接预测违约,而是在做一件更基础的事:把特征相近的客户放到一起。

手算逻辑:每一轮只做两件事

  1. 指定 K。例如先假设客户可以分成 3 类:稳定经营型、成长扩张型、高波动型。这个 K 不是算法自动决定的,需要用指标和业务解释共同判断。
  2. 初始化中心。可以随机选,也可以用 KMeans++。KMeans++ 会让初始中心尽量分散,减少一开始选到很差中心的概率。
  3. 分配样本。对每个客户,计算它到 3 个中心的距离,归给最近的中心。这一步叫 hard assignment,因为客户只能属于一个簇。
  4. 更新中心。对每个簇,把簇内客户的特征取平均,得到新的中心。
  5. 重复。如果新中心和旧中心差别很小,或者样本归属不再改变,就停止。
Python 示例:用 scikit-learn 完成 KMeans
import pandas as pd
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler

df = pd.DataFrame({
    "merchant": ["A01","A02","A03","A04","B01","B02","B03","B04","C01","C02","C03","C04"],
    "activity": [0.22,0.25,0.30,0.28,0.68,0.74,0.79,0.70,0.62,0.70,0.78,0.83],
    "cashflow_stability": [0.86,0.80,0.84,0.76,0.64,0.58,0.62,0.52,0.22,0.25,0.18,0.30],
})

X = df[["activity", "cashflow_stability"]]
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

kmeans = KMeans(n_clusters=3, init="k-means++", n_init="auto", random_state=42)
df["cluster"] = kmeans.fit_predict(X_scaled)

print(df[["merchant", "activity", "cashflow_stability", "cluster"]])
print("inertia =", round(kmeans.inertia_, 4))
输出示例
   merchant  activity  cashflow_stability  cluster
0       A01      0.22                0.86        1
1       A02      0.25                0.80        1
2       A03      0.30                0.84        1
3       A04      0.28                0.76        1
4       B01      0.68                0.64        0
5       B02      0.74                0.58        0
6       B03      0.79                0.62        0
7       B04      0.70                0.52        0
8       C01      0.62                0.22        2
9       C02      0.70                0.25        2
10      C03      0.78                0.18        2
11      C04      0.83                0.30        2

inertia = 0.8997

注意:scikit-learn 的簇编号只是 0、1、2,并没有天然含义。不能写“0 类就是好客户、1 类就是坏客户”。正确做法是先看每一类的均值、违约率、收入增长、授信利用率、复贷率,再给它业务名称。例如:稳定经营型、成长扩张型、高波动经营型。

怎么理解

KMeans 像是在地图上找几个服务站,让每个客户去最近的服务站;然后服务站再搬到自己服务客户的平均位置。

普惠金融例子

如果某类商户资金流稳定但规模小,可以设计小额循环贷;如果另一类活跃但波动大,可以降低单笔额度、提高动态监测频率。

容易犯错

没有标准化变量时,金额类变量会压倒比例类变量,聚类结果可能只是按“规模大小”分组,而不是按真实经营模式分组。

08

GMM:对照 KMeans 理解“软分群”

KMeans 问的是“这个客户离哪个中心最近”;GMM 问的是“这个客户有多大概率来自每一种客户分布”。这就是硬分配与软分配的核心区别。

KMeans 硬分配和 GMM 软分配的对照图
左侧 KMeans 把客户直接切成几组;右侧 GMM 把每组看成一个高斯分布,客户可以对多个分布都有责任度。对于边界客户,GMM 的解释通常更细。

KMeans 的假设

每个簇围绕一个中心展开,形状接近圆形或球形;客户只归属一个簇。

GMM 的假设

总体数据由多个高斯分布混合而成;每个分布有自己的均值、协方差和权重。

金融解释

客户可能同时像“成长型”和“高波动型”,GMM 可以把这种不确定性保留下来。

p(xi)=∑k=1KπkN(xi|μk,Σk)

这条公式的含义是:一个客户的特征不是来自单一规则,而可能来自多个客户群体分布的混合。πₖ 是第 k 个群体在总体中的占比,μₖ 是群体中心,Σₖ 则刻画该群体的形状和变量之间的相关性。KMeans 只关心中心距离,GMM 还关心这个群体是胖是瘦、是圆是椭圆、变量是否一起变化。

γik=πkN(xi|μk,Σk)∑j=1KπjN(xi|μj,Σj)

γᵢₖ 通常被翻译为 responsibility,即责任度。它回答的是:第 k 个高斯成分对解释第 i 个客户负多大责任。一个边界客户可能不是 100% 属于成长型,也不是 100% 属于高波动型,而是 64% 像成长型、34% 像高波动型、2% 像稳定型。这种信息对金融很重要,因为边界客户往往正是风险管理和产品设计最需要关注的人群。

Python 示例:GMM 输出概率归属
import pandas as pd
from sklearn.mixture import GaussianMixture
from sklearn.preprocessing import StandardScaler

X = df[["activity", "cashflow_stability"]]
X_scaled = StandardScaler().fit_transform(X)

gmm = GaussianMixture(
    n_components=3,
    covariance_type="full",
    random_state=42
)
gmm.fit(X_scaled)

df["gmm_cluster"] = gmm.predict(X_scaled)
proba = gmm.predict_proba(X_scaled)

print(df[["merchant", "gmm_cluster"]])
print(pd.DataFrame(proba, columns=["component_0", "component_1", "component_2"]).round(3))
输出示例
   merchant  gmm_cluster
0       A01            1
1       A02            1
2       A03            1
3       A04            1
4       B01            0
5       B02            0
6       B03            0
7       B04            0
8       C01            2
9       C02            2
10      C03            2
11      C04            2

   component_0  component_1  component_2
0        0.000        1.000        0.000
4        0.996        0.004        0.000
8        0.031        0.000        0.969

KMeans 与 GMM 的关键区别

问题KMeansGMM对金融业务的影响
客户归属硬分配,只能属于一个簇。软分配,可以报告属于各簇的概率。边界客户更适合用 GMM 观察,因为它保留不确定性。
簇的形状更适合圆形、球形、方差近似相同的簇。可以表达椭圆形簇和不同协方差结构。如果经营活跃度和现金流稳定性之间强相关,GMM 更灵活。
输出解释中心、标签、簇内平方和。均值、协方差、混合权重、责任度、对数似然。GMM 更容易解释“过渡型客户”和“混合型风险”。
风险对异常值和初始中心敏感。对分布假设、协方差估计和局部最优敏感。两者都不能脱离业务验证;聚类结果必须看后续违约率和经营表现。
09

EM 框架:为什么 GMM 要“猜—更新—再猜”

EM 的难点不在计算,而在理解“看不见的东西”。在聚类中,客户真实属于哪个潜在群体是看不见的,所以只能先估计归属概率,再用这些概率反过来更新模型。

GMM 中 EM 算法 E 步和 M 步循环示意图
EM 不是一个单独服务于 GMM 的技巧,而是一类处理隐变量问题的通用框架。GMM 中看不见的隐变量就是客户所属的潜在群体。

用医生看病来理解 EM

  1. 医生一开始不知道病人真实病因,只能根据症状猜测几种可能疾病。这相当于初始化模型参数。
  2. 医生根据体温、咳嗽、血检等信息,判断每种疾病的可能性。这相当于 E 步:估计隐变量的概率。
  3. 如果越来越多病人被观察到,医生会重新修正“某种症状对应某种疾病”的经验判断。这相当于 M 步:更新参数。
  4. 新的参数又会改变下一轮判断。不断循环,直到判断规则基本稳定。

放到数字普惠金融里,隐变量可以是“真实经营类型”“真实风险状态”或“真实资金需求模式”。这些东西不能直接从一张表中读出来,但它们会影响客户的流水、交易频率、还款行为和融资需求。EM 的作用就是在隐藏类型和可观察数据之间搭桥。

EM 在 GMM 中每一步到底更新什么

步骤固定什么计算什么直观理解
初始化没有固定值给出初始 μ、Σ、π先粗略认为有几类客户,每类大概在哪里、占比多少。
E 步固定当前 μ、Σ、π计算每个客户的责任度 γ看每个客户更像哪一类,以及像到什么程度。
M 步固定当前责任度 γ更新 μ、Σ、π把客户按概率加权后,重新估计每类客户的中心、形状和占比。
收敛检查比较新旧模型看对数似然提升是否足够小如果模型已经很难继续改进,就停止。
μknew=∑iγikxi∑iγik,πknew=1n∑iγik

这两个更新式要用很简单的话解释:如果一个客户对第 k 类的责任度很高,它对第 k 类中心的影响就大;如果责任度很低,它对该类中心的影响就小。也就是说,GMM 的更新不是“把客户硬塞进某一类再求平均”,而是“按像不像这一类来加权求平均”。

责任度小例子
边界客户 x = [经营活跃度 0.64, 资金流稳定性 0.48]

根据当前 GMM 参数计算:
稳定经营型责任度 ≈ 0.015
成长扩张型责任度 ≈ 0.641
高波动经营型责任度 ≈ 0.343

解释:
这个客户最像成长扩张型,但同时有明显高波动特征。
授信时不宜简单套用“成长型客户”的额度策略,最好加入现金流波动监测。
10

金融应用案例

  • 农户数字信贷:根据经营周期、收入季节性、交易频率和历史还款行为进行客户分群,形成差异化授信策略。
  • 交易反欺诈:使用聚类发现正常交易模式,再把远离主要簇或频繁跨簇迁移的账户列为风险线索。
  • 供应链金融:根据企业上下游关系、应收账款周期和现金流结构识别核心企业、稳定配套企业和高波动企业。
怎么理解

案例分析时,不要只说“可以聚类”。要说明分群后如何改变授信、定价、营销、复核或风险监控。

普惠金融例子

农户分群后,季节波动型客户可以采用还款周期更灵活的产品;稳定经营型客户可以降低审核频率;异常迁移客户进入预警名单。

课堂追问

同一个客户从一个簇迁移到另一个簇,可能意味着什么?