MapReduce之使用马尔可夫模型的智能邮件营销(一)
背景
你是否经常网购,然后在某个特定的时间里(想要逛街/购物)收到商家/电子商务网站发来的优惠或新品商品的信息?你有是否经常充各种会员,也同样在特定的时间收到商家/网站发来的信息?
这便是马尔可夫模型的一种应用,在给定一组随机变量(如顾客的最近交易日期),马尔可夫模型只根据前一个状态(前一个最近交易日期)的分布只是该变量(最近交易日期)的分布。
马尔可夫链基本原理
令 S= { S 1 , S 2 , S 3 , . . . S_1,S_2,S_3,... S1,S2,S3,...} 是一个有限状态集合,希望获得以下概率:
P( S n ∣ S n − 1 , S n − 2 , . . . , S 1 S_n|S_{n-1},S_{n-2},...,S_1 Sn∣Sn−1,Sn−2,...,S1)
一阶马尔可夫假设如下:
P( S n ∣ S n − 1 , S n − 2 , . . . , S 1 ) ≈ P ( S n ∣ S n − 1 ) S_n|S_{n-1},S_{n-2},...,S_1) \approx P(S_n|S_{n-1}) Sn∣Sn−1,Sn−2,...,S1)≈P(Sn∣Sn−1)
这个近似公式描述了马尔可夫性质,系统在时间t+1的状态只基于系统在时间t的状态
二阶马尔可夫假设如下:
P(
S
n
∣
S
n
−
1
,
S
n
−
2
,
.
.
.
,
S
1
)
≈
P
(
S
n
∣
S
n
−
1
,
S
n
−
2
)
S_n|S_{n-1},S_{n-2},...,S_1) \approx P(S_n|S_{n-1},S_{n-2})
Sn∣Sn−1,Sn−2,...,S1)≈P(Sn∣Sn−1,Sn−2)
下面使用马尔可夫假设描述联合概率:
P( S 1 , S 2 , . . . , S n ) = ∏ i = 1 n P ( S i , S i − 1 ) S_1,S_2, . . . ,S_n)= \prod_{i=1}^n P(S_i,S_{i-1}) S1,S2,...,Sn)=∏i=1nP(Si,Si−1)
马尔可夫随机过程可以总结如下:
- 如果一个随机序列的分布仅由其当前状态确定,则具有马尔可夫性质,具有这个性质的随即过程则为马尔可夫随即过程
- 对于可观察的状态序列,可以得到一个马尔可夫链模型,使用这个模型预测下一个有效日期
- 对于不可观察状态,会得到一个隐式马尔可夫模型
在接下来的过程中,使用如下的马尔可夫链的形式化表示,马尔可夫链包括3个部分:
状态空间
有限状态集S={
S
1
,
S
2
,
S
3
,
.
.
.
,
S_1,S_2,S_3 , . . . ,
S1,S2,S3,...,}
转移概率
函数
f
f
f:S
×
\times
× S
→
\rightarrow
→ R:
- 0 ≤ f ( a , b ) ≤ \leq f(a,b)\leq ≤f(a,b)≤ 1 (对于所有的 a , b ∈ S a,b\in S a,b∈S)
- ∑ b ∈ S f ( a , b ) = 1 \sum_{b\in S} f(a,b)=1 ∑b∈Sf(a,b)=1 (对于各个 a ∈ S a\in S a∈S
初始分布
函数
g
:
S
×
R
:
g: S\times R:
g:S×R:
- 0 ≤ g ( a ) ≤ 1 0\leq g(a) \leq 1 0≤g(a)≤1 (对于各个 a ∈ S a \in S a∈S)
- ∑ a ∈ S g ( a ) = 1 \sum_{a\in S} g(a)=1 ∑a∈Sg(a)=1
则马尔可夫链是S中的一个随即过程:
- 时间0时,这个链的状态用分布函数 g g g 描述
- 如果时间 t 时的马尔可夫链状态为 a ,则时间 t+1 时,对于各个 b ∈ S b\in S b∈S,其状态为b的概率为 f ( a , b ) f(a,b) f(a,b)
来看下面的一个例子,假设一个城市的天气变化包括4中状态——晴天,雨天,多云,有雾, 进一步假设一天中天气状态不会改变,如下图
城市天气变化表
今天天气 | 明天天气 | 晴天 | 雨天 | 多云 | 有雾 |
---|---|---|---|---|---|
晴天 | 0.6 | 0.1 | 0.2 | 0.1 | |
雨天 | 0.5 | 0.2 | 0.2 | 0.1 | |
多云 | 0.1 | 0.7 | 0.1 | 0.1 | |
有雾 | 0.0 | 0.3 | 0.4 | 0.3 |
其中,每行概率之和为1.00
现在有以下问题:
-
如果今天的天气状态是晴天,那么明天多云而且后天有雾的概论是多大?
P ( S 2 = c l o u d y , S 3 = f o g g y ∣ S 1 = s u n n y ) P(S_2=cloudy,S_3=foggy|S_1=sunny) P(S2=cloudy,S3=foggy∣S1=sunny)
= P ( S 3 = f o g g y ∣ S 2 = c l o u d y , S 1 = s u n n y ) × P ( S 2 = c l o u d y ∣ S 1 = s u n n y ) P(S_3=foggy|S_2=cloudy,S_1=sunny) \times P(S_2=cloudy|S_1=sunny) P(S3=foggy∣S2=cloudy,S1=sunny)×P(S2=cloudy∣S1=sunny)
= P ( S 3 = f o g g y ∣ S 2 = c l o u d y ) × P ( S 2 = c l o u d y ∣ S 1 = s u n n y ) P(S_3=foggy|S_2=cloudy) \times P(S_2=cloudy|S_1=sunny) P(S3=foggy∣S2=cloudy)×P(S2=cloudy∣S1=sunny)
=0.1*0.2
=0.02 -
如果今天有雾,那么两天后有雨的概率是多大?
P ( S 3 = f o g g y ∣ S 1 = f o g g y ) P(S_3=foggy|S_1=foggy) P(S3=foggy∣S1=foggy)
= P ( S 3 = f o g g y , S 2 = s u n n y ∣ S 1 = f o g g y ) + P ( S 3 = f o g g y , S 2 = c l o u d y , ∣ S 1 = f o g g y ) + P ( S 3 = f o g g y , S 2 = r a i n y ∣ S 1 = f o g g y ) + P ( S 3 = f o g g y , S 1 = f o g g y ∣ S 1 = f o g g y ) P(S_3=foggy,S_2=sunny|S_1=foggy)+ P(S_3=foggy,S_2=cloudy,|S_1=foggy)+ P(S_3=foggy,S_2=rainy|S_1=foggy)+ P(S_3=foggy,S_1=foggy|S_1=foggy) P(S3=foggy,S2=sunny∣S1=foggy)+P(S3=foggy,S2=cloudy,∣S1=foggy)+P(S3=foggy,S2=rainy∣S1=foggy)+P(S3=foggy,S1=foggy∣S1=foggy)
= P ( S 3 = f o g g y ∣ S 2 = s u n n y ) × P ( S 2 = s u n n y ) ∣ S 1 = f o g g y ) + P ( S 3 = f o g g y ∣ S 2 = c l o u d y ) × P ( S 2 = c l o u d y ) ∣ S 1 = f o g g y ) + P ( S 3 = f o g g y ∣ S 2 = r a i n y ) × P ( S 2 = r a i n y ) ∣ S 1 = f o g g y ) + P ( S 3 = f o g g y ∣ S 2 = f o g g y ) × P ( S 2 = f o g g y ) ∣ S 1 = f o g g y ) P(S_3=foggy|S_2=sunny) \times P(S_2=sunny)|S_1=foggy)+ P(S_3=foggy|S_2=cloudy) \times P(S_2=cloudy)|S_1=foggy)+ P(S_3=foggy|S_2=rainy) \times P(S_2=rainy)|S_1=foggy)+ P(S_3=foggy|S_2=foggy) \times P(S_2=foggy)|S_1=foggy) P(S3=foggy∣S2=sunny)×P(S2=sunny)∣S1=foggy)+P(S3=foggy∣S2=cloudy)×P(S2=cloudy)∣S1=foggy)+P(S3=foggy∣S2=rainy)×P(S2=rainy)∣S1=foggy)+P(S3=foggy∣S2=foggy)×P(S2=foggy)∣S1=foggy)
= 0.1 × 0.0 + 0.1 × 0.4 + 0.1 × 0.3 + 0.3 × 0.3 0.1 \times 0.0 + 0.1 \times 0.4 + 0.1 \times 0.3 + 0.3 \times 0.3 0.1×0.0+0.1×0.4+0.1×0.3+0.3×0.3
= 0.00 + 0.04 + 0.03 + 0.09 0.00+0.04+0.03+0.09 0.00+0.04+0.03+0.09
= 0.16 0.16 0.16
在接下来的过程中,主要使用Mapreduce计算框架建立一个这样的模型(即转移概率表),可以定义所有的 a ∈ S a\in S a∈S的 f ( a , b ) f(a,b) f(a,b),一旦成功创建这个模型,其余任务就容易了
MapReduce解决方案如下
- 阶段1:使用历史训练数据建立一个模型
- 阶段2:使用阶段1建立的模型对新数据作出预测
使用Mapreduce的马尔可夫模型
假设有顾客交易的历史数据,包括交易ID,顾客ID,交易日期,金额,每个输入记录的格式如下:
< customerID>,< transactionID>,< ,>< purchaseDate>< ,>< amount>
整个解决方案包括三个Mapreduce作业和一个Java程序,解决方案的概要描述如下:
- 1.使用一个程序或脚本生成虚拟顾客数据
- 2.MapReduce投影接受顾客数据作为输入,生成有序序列,有序序列包括按升序排序的交易日期。
- 3 . 状态转换器接受这个有序数据,生成状态序列。
- 4.MapReduce马尔可夫状态转移模型接受这个状态序列作为输入,生成一个马尔可夫链模型,利用这个模型对下一个状态进行预测
- 5, 使用Java程序对顾客数据和马尔可夫链进行预测
在下一篇博客中,讲解如何利用Mapreduce生成时序交易序列