大家好,自己对因子分解机的一点小小的总结,会慢慢完善的。如果有什么写的不对的地方,欢迎指正,谢谢。
我认为了解因子分解机的前提要先知道矩阵分解。
矩阵分解就是将一个矩阵拆分成多个矩阵的乘积
矩阵分解的方法:SVD、FunkSVD、BaisSVD、SVD++
SVD就是矩阵的奇异值分解,分解成psq三个矩阵,p:左奇异值矩阵 s:特征值 q:右奇异值矩阵。这种矩阵分解的方式是无损的,就是可以完美的还原矩阵。
SVD矩阵分解
假设矩阵A的维度是m * n维的,首先可以将两个矩阵变成两个方阵
A
∗
A
T
=
p
∗
λ
1
p
T
A
T
A
=
q
∗
λ
2
q
T
然
后
在
去
求
解
特
征
值
这
里
的
λ
1
=
λ
2
A*A^T=p*\lambda_1 p^T\\ A^TA = q* \lambda_2 q^T\\ 然后在去求解特征值\quad 这里的\lambda_1=\lambda_2
A∗AT=p∗λ1pTATA=q∗λ2qT然后在去求解特征值这里的λ1=λ2
这里的特征值是从大到小排列的,取前n个就是实现了降维的操作
应用:降维,例如PCA(主成分分析)原理就是利用的矩阵的奇异值分解
FunkSVD
矩阵A的维度m * n ,用m * k 和 k * n的两个低维矩阵来近似。这里的k是一个超参数,是自己需要定义的。他的默认初始值是100
1、就是一个矩阵用两个矩阵的乘积来近似,两个低维稠密的矩阵可以将原来稀疏的矩阵进行补全
2、将补全的矩阵和原来的矩阵进行对比,不需要对所有的元素进行比较,并且加入了L2正则项,防止过拟合
注:这两个矩阵的初始值是满足高斯分布的,随机生成的。通过原来矩阵的数值进行修正这两个低维稠密矩阵
损失函数:
arg
min
p
i
,
q
j
=
∑
(
i
,
j
)
∈
k
n
(
m
i
,
j
−
q
j
T
p
i
)
2
+
λ
(
∣
∣
p
i
∣
∣
2
+
∣
∣
q
j
∣
∣
2
)
\arg \min_{p_i,q_j}=\sum_{(i,j)\in k}^{n}(m_{i,j}-q_j^Tp_i)^2+\lambda (||p_i||^2+||q_j||^2)
argpi,qjmin=(i,j)∈k∑n(mi,j−qjTpi)2+λ(∣∣pi∣∣2+∣∣qj∣∣2)
baisSVD
在FunkSVD的基础上考虑到了用户、商品的偏好带来的影响
损
失
函
数
arg
min
q
j
,
p
i
∑
(
i
,
j
)
∈
k
(
m
i
,
j
−
μ
−
b
i
−
b
j
−
q
j
t
p
i
)
2
+
λ
(
∣
∣
p
i
∣
∣
2
+
∣
∣
q
j
∣
∣
2
+
∣
∣
b
i
∣
∣
2
+
∣
∣
b
j
∣
∣
2
)
μ
所
有
记
录
的
平
均
数
b
i
用
户
偏
好
(
喜
欢
打
高
分
)
b
j
商
品
的
偏
好
(
质
量
好
分
高
)
b
i
=
b
i
+
α
(
m
i
,
j
−
μ
−
b
i
−
b
j
−
q
j
t
p
i
−
λ
b
i
)
b
j
=
b
j
+
α
(
m
i
,
j
−
μ
−
b
i
−
b
j
−
q
j
t
p
i
−
λ
b
j
)
b
i
,
b
j
初
始
值
都
设
为
0
零
向
量
然
后
进
行
迭
代
损失函数\quad \arg \min_{q_j,p_i}\sum_{(i,j)\in k}(m_{i,j}-\mu -b_i-b_j-q_j^tp_i)^2+\lambda(||p_i||^2+||q_j||^2+||b_i||^2+||b_j||^2)\\ \mu 所有记录的平均数 b_i用户偏好(喜欢打高分) b_j 商品的偏好(质量好 分高)\\ b_i = b_i +\alpha(m_{i,j}-\mu-b_i-b_j-q_j^tp_i-\lambda b_i)\\ b_j = b_j +\alpha(m_{i,j}-\mu-b_i-b_j-q_j^tp_i-\lambda b_j)\\ b_i,b_j初始值都设为0零向量然后进行迭代
损失函数argqj,pimin(i,j)∈k∑(mi,j−μ−bi−bj−qjtpi)2+λ(∣∣pi∣∣2+∣∣qj∣∣2+∣∣bi∣∣2+∣∣bj∣∣2)μ所有记录的平均数bi用户偏好(喜欢打高分)bj商品的偏好(质量好分高)bi=bi+α(mi,j−μ−bi−bj−qjtpi−λbi)bj=bj+α(mi,j−μ−bi−bj−qjtpi−λbj)bi,bj初始值都设为0零向量然后进行迭代
SVD++
在baisSVD的基础上考虑到用户的隐式反馈行为对评分的影响
用户所有的隐式反馈(点击、浏览等行为)
商品集合q_j 除以 用户的隐式反馈个数的平方根 消除不同个数引起的差异 之后再乘以 用户i对商品的所有修正值的和
工具surprise中的svd
surprise.svd
默认的是BaisSVD,需要设置baisSVD=False才是funkSVD
算法的简单流程
import surprise.svd
from sklearn.matrix import accuracy
algo = svd()
algo.fit(train_data)
#pred = algo.test(test_data)
求解方式:SGD(随机梯度下降)、ALS(交替最小二乘)
MF是FM的特例,MF只考虑了两个维度的特征 用户(user)和商品(item)
首先我们来说线性回归
y
=
∑
i
=
1
n
w
i
x
i
默
认
样
本
之
间
是
相
互
独
立
的
如
果
加
入
了
二
阶
特
征
y
=
∑
i
=
1
n
w
i
x
i
+
∑
i
=
1
n
∑
j
=
i
+
1
n
w
i
j
x
i
x
j
y = \sum_{i=1}^n w_ix_i \quad 默认样本之间是相互独立的\\ 如果加入了二阶特征\\ y = \sum_{i=1}^n w_ix_i+\sum_{i=1}^n\sum_{j=i+1}^nw_{ij}x_ix_j
y=i=1∑nwixi默认样本之间是相互独立的如果加入了二阶特征y=i=1∑nwixi+i=1∑nj=i+1∑nwijxixj
这会出现一个问题 就是观察样本中如果两个特征都没有相互交叉的值那么相乘之后就被估计为0,就会判别为特征之间没有交叉。显然这样是不对的,样本中没有出现这两个特征交叉的数据不代表实际的情况下没有交叉的情况。这时候我们换个角度考虑一下,我们如果将对w_ij的估计问题转换成多个MF,那么问题不就迎刃而解了么
w
i
j
=
<
V
i
,
V
j
>
:
=
∑
f
=
1
k
v
i
,
f
v
j
,
f
但
是
这
样
的
计
算
复
杂
度
为
O
(
k
∗
n
2
)
进
行
一
些
数
学
变
换
∑
i
=
1
n
∑
j
=
i
+
1
n
<
V
i
,
f
,
V
j
,
f
>
x
i
x
j
=
1
2
∑
f
=
1
k
(
(
∑
i
=
1
n
v
i
,
f
x
i
)
2
−
∑
f
=
1
n
v
i
,
f
2
x
i
2
)
复
杂
度
变
成
了
k
∗
n
F
M
的
核
心
思
想
就
是
将
w
i
j
转
换
成
两
个
向
量
v
i
,
v
j
的
内
积
,
这
样
稀
疏
数
据
的
学
习
不
充
分
的
问
题
得
到
了
解
决
,
非
零
的
样
本
也
大
大
的
增
加
w_ij = <V_i,V_j>:=\sum_{f=1}^kv_{i,f}v_{j,f}\quad 但是这样的计算复杂度为O(k*n^2)\\ 进行一些数学变换\\ \sum_{i=1}^n\sum_{j=i+1}^n<V_{i,f},V_{j,f}>x_ix_j= \frac{1}{2}\sum_{f=1}^k((\sum_{i=1}^nv_{i,f}x_i)^2-\sum_{f=1}^nv_{i,f}^2x_i^2)\\ 复杂度变成了k*n\\ FM的核心思想就是将w_{ij}转换成两个向量v_i,v_j的内积,这样稀疏数据的学习不充分的问题得到了解决,非零的样本也大大的增加
wij=<Vi,Vj>:=f=1∑kvi,fvj,f但是这样的计算复杂度为O(k∗n2)进行一些数学变换i=1∑nj=i+1∑n<Vi,f,Vj,f>xixj=21f=1∑k((i=1∑nvi,fxi)2−f=1∑nvi,f2xi2)复杂度变成了k∗nFM的核心思想就是将wij转换成两个向量vi,vj的内积,这样稀疏数据的学习不充分的问题得到了解决,非零的样本也大大的增加
FM中两个K维内积向量 k取值较小(100左右)
更加高阶的特征交叉计算量大,工程商实现复杂,研究表名 高阶、非线性特征提取用深度模型比较合适。所以FM只考虑到二阶特征组合。
损失函数的选取
回归问题:用mse
分类问题:用logstic loss
DeepFM=FM+DNN
FM用来提取低阶特征:如 一阶 二阶特征
DNN用来提取高阶的 非线性特征(激活函数的使用)
最后将FM和DNN输出的结果相加 经过sigmoid得出概率
y=sigmoid(y_fm,y_dnn)
特点:可以整合交叉特征 线性时间复杂度,可以应对稀疏数据的情况 模型相对简单 易于工程上的实现
DeepFM算法参数设置
激活函数:relu
dropout:设置为0.6-0.9
神经元个数200-400个
隐藏层层数最开始效果明显,之后在增加效果不明显,甚至更差,容易过拟合,3层比较合适
网络形状:使用固定的效果最好,就是每一层的神经员个数相同。
eg 固定:200-200-200 菱形:150-300-150 下降 300-200-100 增长100-200-300
推荐工具DeepCTR
里面包含的模型:
DeepFM、Wide&Deep、Deep Interest Network、Attentional Factorization Machine、Deep&Cross Network、xDeepFM、Piece-wise Linear Model、Convolutional Click Prediction Model、Factorization-supported Neural Network、Product-based Neural Network