计算广告(十一)

news2024/11/14 23:44:54

MF矩阵分解(Matrix Factorization)是一种常见的数学工具,它将一个大型矩阵分解为两个或多个较小的矩阵,这些较小的矩阵相乘会得到一个近似于原始矩阵的矩阵。矩阵分解在许多领域中都有广泛的应用,如机器学习、数据挖掘、推荐系统和信号处理等。

以下是一些常见的矩阵分解技术:

奇异值分解(SVD, Singular Value Decomposition):将一个矩阵分解为三个矩阵的乘积,即A = UΣV^T。U和V分别是正交矩阵,Σ是对角矩阵,对角线上的元素称为奇异值。

主成分分析(PCA, Principal Component Analysis):通过线性变换将原始数据映射到新的坐标系,选择主成分来实现数据降维。PCA可以看作是SVD的一个应用。

非负矩阵分解(NMF, Non-negative Matrix Factorization):将一个非负矩阵分解为两个非负矩阵的乘积,用于特征提取和数据压缩。

独立成分分析(ICA, Independent Component Analysis):通过寻找一个线性变换,将原始数据变换为统计上独立的分量,广泛应用于信号处理和数据分析。

张量分解(Tensor Decomposition):矩阵分解的扩展,将高维张量分解为若干个低维张量的乘积。常见的张量分解方法包括CP分解(CANDECOMP/PARAFAC Decomposition)和Tucker分解。

QR分解:将一个矩阵分解为一个正交矩阵Q和一个上三角矩阵R的乘积,即A = QR。

LU分解:将一个矩阵分解为一个下三角矩阵L和一个上三角矩阵U的乘积,即A = LU。

Cholesky分解:将一个对称正定矩阵分解为一个下三角矩阵和它的转置的乘积,即A = LL^T。

因子分析(Factor Analysis):将观测数据分解为潜在变量和误差项的线性组合,广泛应用于心理学、社会学等领域。

稀疏矩阵分解(Sparse Matrix Factorization):将一个稀疏矩阵分解为两个稀疏矩阵的乘积,适用于处理大规模稀疏数据。

在广告领域,矩阵分解技术主要应用于用户行为分析、用户分群、广告推荐和效果预测等场景。以下是一些常见矩阵分解方法在广告中的应用场景及其优劣势:

奇异值分解(SVD):适用场景:广告推荐、用户画像构建优势:可以发现用户和广告之间的潜在关系,降低数据维度,减少计算量劣势:对缺失数据敏感,需要额外的填充或插值方法处理

主成分分析(PCA):适用场景:广告特征降维、用户画像构建优势:能够提取数据的主要特征,降低数据维度,减少计算量劣势:线性方法,可能无法捕捉到复杂的非线性关系

非负矩阵分解(NMF):适用场景:广告推荐、用户分群优势:非负约束使得结果具有直观的解释性,适用于稀疏数据劣势:求解过程可能收敛较慢,且需要事先确定矩阵的秩

独立成分分析(ICA):适用场景:广告效果分析、广告信号分离优势:可以找到数据中的独立成分,适用于去噪和信号提取劣势:计算复杂度较高,可能需要较长的计算时间

张量分解(Tensor Decomposition):适用场景:多维广告数据分析、用户行为建模优势:能够处理高维数据,发现多维数据中的潜在结构劣势:计算复杂度较高,求解过程可能收敛较慢

QR分解、LU分解、Cholesky分解:适用场景:这些方法在广告领域的应用相对较少,主要用于求解线性方程组和优化问题优势:稳定性较高,求解效率较高劣势:适用范围相对较窄

因子分析(Factor Analysis):适用场景:广告投放效果评估、广告特征提取优势:能够发现潜在因子,降低数据维度,减少计算量劣势:需要事先确定潜在因子的数量,且可能无法捕捉到复杂的非线性关系

稀疏矩阵分解(Sparse Matrix Factorization):适用场景:大规模稀疏广告数据处理、广告推荐优势:能够处理大规模稀疏数据,降低计算复杂度,提高计算效率劣势:需要特定的优化算法求解,可能对噪声敏感

总的来说,在广告领域,选择合适的矩阵分解方法取决于具体的应用场景和需求。例如,对于广告推荐,可以使用SVD、NMF或稀疏矩阵分解等方法;对于广告特征降维和用户画像构建,可以使用PCA、SVD等方法;而对于广告效果分析和信号分离,则可以考虑ICA方法。在实际应用过程中,可能需要尝试多种方法,以找到最适合当前问题的矩阵分解技术。

LU分解(LU decomposition) LU分解是将一个矩阵分解为一个下三角矩阵(L)和一个上三角矩阵(U)的乘积。如果原始矩阵为A,则有 A = LU。LU分解常用于线性代数和线性方程组的求解。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

编辑切换为居中

添加图片注释,不超过 140 字(可选)

编辑切换为居中

添加图片注释,不超过 140 字(可选)

QR分解(QR decomposition) QR分解是将一个矩阵分解为一个正交矩阵(Q)和一个上三角矩阵(R)的乘积。如果原始矩阵为A,则有 A = QR。QR分解在最小二乘法求解、特征值和特征向量计算等方面有广泛应用。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

编辑切换为居中

添加图片注释,不超过 140 字(可选)

我们已经获得了矩阵A的QR分解,现在让我们检验这个分解是否正确。

Q * R = | 0.3162 0.8944 | * | 3.1623 4.4272 |

| 0.9487 -0.4472 | | 0 1.3416 |

= | (0.3162 * 3.1623 + 0.8944 * 0) (0.3162 * 4.4272 + 0.8944 * 1.3416) |

| (0.9487 * 3.1623 - 0.4472 * 0) (0.9487 * 4.4272 - 0.4472 * 1.3416) |

= | 1 2 |

| 3 4 |

= A

我们发现Q * R确实等于矩阵A,这证明了我们的QR分解是正确的。

QR分解在许多数学和工程领域有着广泛应用。例如,在求解线性最小二乘问题时,可以将系数矩阵A进行QR分解,然后利用正交矩阵Q和上三角矩阵R求解最优解。

QR分解还可以用于计算矩阵的特征值和特征向量,以及在信号处理、数据压缩等领域的应用。

Cholesky分解:将一个对称正定矩阵分解为一个下三角矩阵和它的转置的乘积,即A = LL^T。

假设我们有以下一个3x3的对称正定矩阵A:

A = [(4, 2, 2), (2, 5, 2), (2, 2, 5)]

我们希望将矩阵A分解为一个下三角矩阵L和它的转置L^T的乘积,即A = LL^T。

我们可以用以下方式表示L矩阵的元素:

L = [(l11, 0, 0), (l21, l22, 0), (l31, l32, l33)]

根据A = LL^T,我们有:

A11 = l11^2 A21 = l21 * l11 A31 = l31 * l11 A22 = l21^2 + l22^2 A32 = l31 * l21 + l32 * l22 A33 = l31^2 + l32^2 + l33^2

通过解这些方程,我们可以得到L矩阵的元素:

l11 = sqrt(A11) = sqrt(4) = 2

l21 = A21 / l11 = 2 / 2 = 1

l31 = A31 / l11 = 2 / 2 = 1

l22 = sqrt(A22 - l21^2) = sqrt(5 - 1^2) = 2

l32 = (A32 - l31 * l21) / l22 = (2 - 1 * 1) / 2 = 0.5

l33 = sqrt(A33 - l31^2 - l32^2) = sqrt(5 - 1^2 - 0.5^2) = sqrt(4) = 2

现在,我们得到了下三角矩阵L:

L = [(2, 0, 0), (1, 2, 0), (1, 0.5, 2)]

我们可以验证一下LL^T是否等于原始矩阵A:

L^T = [(2, 1, 1), (0, 2, 0.5), (0, 0, 2)]

LL^T = [(2, 1, 1), * [(2, 0, 0), (1, 2, 0.5), (1, 2, 0), (1, 0.5, 2)] (1, 0.5, 2)]

LL^T = [(4, 2, 2), (2, 5, 2), (2, 2, 5)]

我们可以看到,LL^T确实等于原始矩阵A。这个简单的例子展示了如何进行Cholesky分解。Cholesky分解在许多数值计算和线性代数问题中有应用,例如求解线性方程组、计算矩阵的逆、最优化问题等。

Gram-Schmidt正交化过程是一个用于将一组线性无关向量正交化和单位化的过程。

换句话说,它可以将一组线性无关向量转换为一组两两正交且长度为1的正交向量。这种正交向量集合在许多线性代数和数值分析问题中非常有用,例如QR分解和计算特征值。

以下是Gram-Schmidt正交化过程的步骤:

选择一组线性无关向量:{v1, v2, ..., vn}。

令u1 = v1。

对于每个i(从2到n),执行以下操作:

  1. 计算向量vi在已正交化向量u1, u2, ..., u(i-1)上的投影: proj(vi) = (vi·u1)u1 + (vi·u2)u2 + ... + (vi·u(i-1))u(i-1)

  2. 计算正交向量: ui = vi - proj(vi)

将每个正交向量单位化: qi = ui / ||ui||

经过这个过程,我们将得到一组正交单位向量:{q1, q2, ..., qn}。这组向量具有与原始向量组相同的线性组合关系,但它们是正交的且长度为1。

需要注意的是,Gram-Schmidt正交化过程的稳定性和数值精度可能会受到浮点数舍入误差的影响。在实际应用中,通常使用改进的Gram-Schmidt过程或其他更稳定的正交化方法,如Householder变换。

首先,我们需要理解正交化过程的目标:将一组向量转换为另一组向量,这些向量之间互相垂直(正交),且长度为1(单位向量)。

假设我们有一组线性无关的向量(这意味着它们不能通过线性组合表示彼此)。我们的目标是创建一个新的向量组,它们之间相互正交且为单位向量。

以下是简化的步骤:

从原始向量组中选择第一个向量,将其单位化(除以其长度),将结果作为新向量组的第一个向量。

对于原始向量组中的每个剩余向量,执行以下操作:

  1. 从当前向量中减去其在新向量组中所有向量上的投影。这可以确保新向量与新向量组中的所有向量正交。

  2. 将结果单位化(除以其长度),将其添加到新向量组中。

在这个过程结束时,我们将得到一组相互正交的单位向量。

以通俗的类比来说,Gram-Schmidt正交化过程就像是将一组相互倾斜的木棍调整为相互垂直,同时保持它们之间的相对位置。这在许多数学和物理问题中非常有用,因为正交向量具有很好的性质,使得计算变得更容易和直观。

假设有以下向量集合:

v1 = (1, 1) v2 = (2, -1)

我们需要将这两个向量转换为正交基。首先,我们将v1作为正交基中的第一个向量:

u1 = v1 = (1, 1)

然后,我们计算第二个向量v2在u1上的投影:

proj_v2_u1 = (v2 · u1) / (u1 · u1) * u1

其中,·表示点积运算。计算结果为:

proj_v2_u1 = (1/2) * (1, 1) = (1/2, 1/2)

接下来,我们将v2减去其在u1上的投影,得到一个与u1正交的向量:

u2 = v2 - proj_v2_u1 = (3/2, -3/2)

现在,我们得到了一个正交基:

u1 = (1, 1) u2 = (3/2, -3/2)

这个正交基可以用来表示原向量集合中的任何向量,并且每个向量都可以唯一地表示为正交基向量的线性组合。

这个例子非常简单,但展示了Rammer–Schmidt正交化过程的基本思想。对于更高维度的向量集合,需要进行更多次的投影和减法运算才能得到正交基。

奇异值分解(Singular Value Decomposition, SVD)奇异值分解是将一个矩阵分解为三个矩阵的乘积,一个正交矩阵(U),一个对角矩阵(Σ),和另一个正交矩阵的转置(V^T)。如果原始矩阵为A,则有 A = UΣV^T。SVD在图像压缩、降维、推荐系统和自然语言处理等领域有广泛应用。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

编辑切换为居中

添加图片注释,不超过 140 字(可选)

编辑切换为居中

添加图片注释,不超过 140 字(可选)

编辑切换为居中

添加图片注释,不超过 140 字(可选)

至此,我们得到了A * A^T 和 A^T * A的特征值和特征向量。

最后,我们得到了矩阵A的SVD分解:

A = | 1 2 | = | 0.5760 -0.8174 | * | 5.4172 0 | * | 0.9145 0.4046 |

| 3 4 | | 0.8174 0.5760 | | 0 0.8023 | |-0.4046 0.9145 |

现在让我们验证这个分解是否正确:

U * Σ * V^T = | 0.5760 -0.8174 | * | 5.4172 0 | * | 0.9145 0.4046 |

| 0.8174 0.5760 | | 0 0.8023 | |-0.4046 0.9145 |

= | 0.5760 * 5.4172 -0.8174 * 0 | * | 0.9145 0.4046 |

| 0.8174 * 5.4172 0.5760 * 0.8023 | |-0.4046 0.9145 |

= | 3.1217 0.4630 | * | 0.9145 0.4046 |

| 4.4294 0.4624 | |-0.4046 0.9145 |

= | (3.1217 * 0.9145 + 0.4630 * (-0.4046)) (3.1217 * 0.4046 + 0.4630 * 0.9145) |

| (4.4294 * 0.9145 + 0.4624 * (-0.4046)) (4.4294 * 0.4046 + 0.4624 * 0.9145) |

= | 1.0000 2.0000 |

| 3.0000 4.0000 |

= A

我们发现U * Σ * V^T确实等于矩阵A,这证明了我们的SVD分解是正确的。

SVD在许多数学和工程领域有着广泛应用。例如,在图像压缩中,可以使用SVD对图像矩阵进行分解,然后保留前k个奇异值和对应的奇异向量,从而实现图像的压缩。在降维和数据挖掘中,SVD可以用于实现主成分分析(PCA),将高维数据映射到低维空间。在推荐系统中,SVD被用于矩阵分解和协同过滤,从而预测用户对未评分项目的喜好。此外,SVD在自然语言处理中也有广泛应用,如潜在语义分析(LSA)等。

主成分分析(PCA, Principal Component Analysis):通过线性变换将原始数据映射到新的坐标系,选择主成分来实现数据降维。PCA可以看作是SVD的一个应用。

让我们通过一个简单的例子来理解主成分分析(PCA)的计算过程。

假设我们有以下四个二维数据点:A(2, 3),B(3, 5),C(4, 2),D(5, 1)。

首先,我们需要计算数据的均值。对于每个维度,我们将数据点的坐标相加,然后除以数据点的数量。这里我们有:

均值向量 M = ( (2+3+4+5)/4 , (3+5+2+1)/4 ) = (3.5, 2.75)

接下来,我们需要将数据中心化,即将每个数据点减去均值向量:

A' = A - M = (-1.5, 0.25) B' = B - M = (-0.5, 2.25) C' = C - M = (0.5, -0.75) D' = D - M = (1.5, -1.75)

现在,我们需要计算这些中心化数据点的协方差矩阵。对于二维数据,协方差矩阵如下:

Cov = [Cov(x, x), Cov(x, y) Cov(y, x), Cov(y, y)]

其中 Cov(a, b) = Σ[(a_i - mean(a))(b_i - mean(b))] / (n-1)

我们可以得到以下协方差矩阵:

Cov = [(6, -5) (-5, 5)]

接下来,我们需要计算协方差矩阵的特征值和特征向量。我们可以通过求解以下特征方程得到特征值:

| Cov - λI | = 0

这里的 λ 是特征值,I 是单位矩阵。对于这个例子,我们得到特征方程为:

| (1 - λ, -5) | | (-5, 0 - λ) |

解这个方程,我们得到两个特征值:λ1 = 10,λ2 = -4。因为我们希望得到的主成分具有最大的方差,所以我们选择较大的特征值,即 λ1 = 10。接下来,我们将 λ1 代入原方程以求解对应的特征向量:

Cov * v = λ1 * v

解这个方程,我们得到特征向量 v1 = (1, -1)。注意特征向量可以归一化,所以我们可以选择 (-1, 1) 作为主成分方向。

最后,我们将中心化的数据点投影到主成分方向上,从而实现数据降维。这里我们只保留一维信息,即投影到特征向量 v1 上的值:

A_proj = A' · v1 = -1.5 * 1 + 0.25 * (-1) = -1.75

B_proj = B' · v1 = -0.5 * 1 + 2.25 * (-1) = -2.25

C_proj = C' · v1 = 0.5 * 1 + (-0.75) * (-1) = 1.25

D_proj = D' · v1 = 1.5 * 1 + (-1.75) * (-1) = 3.25

现在我们得到了在主成分方向上的一维投影数据:

A_proj = -1.75

B_proj = -2.25

C_proj = 1.25

D_proj = 3.25

通过这个例子,我们可以看到PCA如何将原始的二维数据降维到一维,同时保留了最大的方差信息。这有助于我们分析数据的主要趋势,并有助于降低数据分析的复杂性。

PCA通常用于降维和特征提取。它可以帮助我们发现数据中的潜在模式和结构,从而更好地理解数据。此外,PCA还可以用于数据压缩、数据可视化和噪声滤波等任务。

在实际应用中,PCA通常应用于具有更高维度的数据,如图像、文本和生物信息学数据等。通过将高维数据投影到较低维度的主成分空间,我们可以更高效地存储、处理和分析数据,同时避免维度诅咒(Curse of Dimensionality)带来的问题。

非负矩阵分解(Non-negative Matrix Factorization, NMF)非负矩阵分解是将一个非负矩阵分解为两个非负矩阵的乘积。如果原始矩阵为A,则有 A ≈ WH。NMF在文本挖掘、图像分析和生物信息学等领域有广泛应用。

给定一个非负矩阵A:

编辑切换为居中

添加图片注释,不超过 140 字(可选)

非负矩阵分解(NMF)的迭代更新过程通常基于一种优化算法,如梯度下降、交替最小二乘法(Alternating Least Squares, ALS)或交替非负最小二乘法(Alternating Non-negative Least Squares, ANLS)。在这里,我们介绍一种常用的基于梯度下降的乘法更新规则,称为Lee和Seung的乘法更新算法。

给定一个非负矩阵A,我们希望找到两个非负矩阵W和H,使得A≈WH。为了衡量A和WH之间的差异,我们通常使用平方Frobenius范数(即矩阵元素差的平方和)作为损失函数:

L(W, H) = ||A - WH||^2_F

我们的目标是最小化损失函数L(W, H)。为此,我们可以使用梯度下降方法来迭代更新W和H。具体而言,我们首先计算损失函数关于W和H的梯度,然后按梯度的负方向更新W和H。为了保持非负性,我们使用乘法更新规则:

W <- W * (A * H^T) ./ (W * (H * H^T))

H <- H * (W^T * A) ./ (W^T * W * H)

其中,“<-”表示赋值,“*”表示矩阵乘法,“./”表示逐元素除法。需要注意的是,这里的更新规则不保证损失函数的全局最小值,而是寻找一个局部最小值。

以下是NMF的迭代更新过程:

随机初始化非负矩阵W和H。

计算损失函数L(W, H)。

使用乘法更新规则更新矩阵W和H。

重复步骤2和3,直到损失函数收敛或达到最大迭代次数。

这种基于梯度下降的乘法更新算法在实际应用中表现良好,但仍存在一些局限性,例如可能陷入局部最小值。为了获得更好的性能,可以考虑使用其他优化算法(如ALS、ANLS等)和技巧(如初始化策略、正则化等)进行迭代更新。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

虽然这个分解的结果与原始矩阵A并不完全相等,但它们在一定程度上接近。实际应用中,可以通过更多的迭代和优化算法得到更好的近似结果。

NMF在许多应用领域有广泛应用,如文本挖掘、图像分析和生物信息学等。在文本挖掘中,NMF可以用于提取文档中的主题。

将文档-词项矩阵作为输入,通过NMF可以得到两个矩阵,一个表示文档-主题关系,另一个表示主题-词项关系。

在图像分析中,NMF可以用于图像压缩和特征提取。将图像表示为一个非负矩阵,通过NMF可以将图像分解为两个较小的矩阵,一个表示基本特征(如边缘、纹理等),另一个表示这些特征在原始图像中的权重。这样,可以使用较少的数据表示原始图像,从而实现图像压缩。同时,提取出的特征可用于图像分类和识别等任务。

在生物信息学中,NMF可以用于基因表达数据分析。基因表达数据通常表示为一个非负矩阵,其中每行表示一个基因,每列表示一个实验条件或样本,矩阵中的值表示基因在特定条件下的表达水平。通过应用NMF,可以将基因表达数据分解为两个矩阵,一个表示基因-功能模块关系,另一个表示功能模块-实验条件关系。这有助于发现基因之间的功能关联,以及基因在不同实验条件下的调控模式。

这些只是NMF在各个领域的一些应用示例。由于NMF的特性,它特别适用于处理非负数据,如计数、光谱数据、图像强度等。在实际应用中,NMF可以通过多种优化算法和技巧来获得更好的性能。

张量分解(Tensor Decomposition)张量分解是矩阵分解的推广,它将高阶张量(例如,三维数组)分解为一组较低阶张量的乘积。张量分解在信号处理、数据挖掘和机器学习等领域有广泛应用。

假设我们有一个三维张量A,它的形状是(2, 2, 2),表示为:

A = [[[ 1, 2],

[ 3, 4]],

[[ 5, 6],

[ 7, 8]]]

我们将使用一种称为CP分解(CANDECOMP/PARAFAC Decomposition)的张量分解方法将A分解为一组较低阶张量的乘积。CP分解将一个N阶张量分解为R个秩为1的张量之和,其中R是给定的分解秩。

在本例中,我们使用分解秩R=2。根据CP分解,我们可以将张量A表示为两个秩为1的张量之和,每个秩为1的张量可以表示为三个向量的外积。我们可以将这些向量表示为矩阵形式:

U_1 = | a11 a12 |

| a21 a22 |

U_2 = | b11 b12 |

| b21 b22 |

U_3 = | c11 c12 |

| c21 c22 |

这里,矩阵U_1、U_2和U_3分别表示张量A在每个维度上的分量。张量A可以通过将这些矩阵相乘来表示:

A ≈ [[[ a11 * b11 * c11, a12 * b12 * c12 ],

[ a21 * b11 * c11, a22 * b12 * c12 ]],

[[ a11 * b21 * c21, a12 * b22 * c22 ],

[ a21 * b21 * c21, a22 * b22 * c22 ]]]

为了获得矩阵U_1、U_2和U_3,我们需要使用一种张量分解算法,如交替最小二乘法(Alternating Least Squares, ALS)或梯度下降法。这里我们不会详细介绍这些算法,但在实际应用中,它们可以用于找到最佳的分解矩阵,从而使张量A的重构误差最小。

张量分解在信号处理、数据挖掘和机器学习等领域有广泛应用。例如,在信号处理中,张量分解可以用于提取信号中的基本成分,从而实现信号分离、降噪和压缩。在数据挖掘中,张量分解可以用于提取多维数据中的潜在模式和关系。在机器学习中,张量分解可以用于降维、特征提取和模型压缩等任务。

独立成分分析(ICA, Independent Component Analysis):通过寻找一个线性变换,将原始数据变换为统计上独立的分量,广泛应用于信号处理和数据分析。

独立成分分析(ICA)是一种用于信号处理和数据分析的技术,旨在将混合信号分离成独立的源信号。为了方便说明,我们将使用一个简单的例子。设有两个源信号s1(t)和s2(t),它们经过线性混合后形成观测信号x1(t)和x2(t)。

我们假设有以下两个源信号:

s1(t) = [2, 3, 4, 2] s2(t) = [1, 0, 1, 2]

线性混合的过程可以用矩阵表示,即:

X = A * S

其中X是观测信号矩阵,A是混合矩阵,S是源信号矩阵。我们设混合矩阵为:

A = [(1, 2), (2, 1)]

那么,观测信号矩阵为:

X = [(1, 2), * [(2, 3, 4, 2), (2, 1)] (1, 0, 1, 2)]

X = [(4, 3, 6, 6), (5, 6, 9, 6)]

现在我们要利用ICA从观测信号x1(t)和x2(t)中恢复原始源信号s1(t)和s2(t)。

首先,我们需要对观测信号进行预处理。通常,这包括中心化和白化。中心化意味着让数据的均值为零,白化意味着让数据的协方差矩阵变成单位矩阵。

中心化:

x1_mean = (4 + 3 + 6 + 6) / 4 = 4.75 x2_mean = (5 + 6 + 9 + 6) / 4 = 6.5

X_centered = [(4 - 4.75, 3 - 4.75, 6 - 4.75, 6 - 4.75), (5 - 6.5, 6 - 6.5, 9 - 6.5, 6 - 6.5)]

X_centered = [(-0.75, -1.75, 1.25, 1.25), (-1.5, -0.5, 2.5, -0.5)]

白化:

首先,计算X_centered的协方差矩阵:

Cov = [(2.1875, 2.625), (2.625, 4.25)]

然后计算特征值和特征向量:

特征值:λ1 = 0.1039, λ2 = 6.3336 特征向量:v1 = (-0.9291, 0.3699), v2 = (-0.3699, -0.9291)

计算白化矩阵E:

E = V * D^(-1/2) * V^T

其中,V是特征向量矩阵,D^(-1/2)是特征值矩阵的逆平方根。在我们的例子中,我们有:

V = [(-0.9291, 0.3699), (-0.3699, -0.9291)]

D^(-1/2) = [(1/sqrt(0.1039), 0), (0, 1/sqrt(6.3336))]

计算E:

E = [(-0.9291, 0.3699), * [(1/sqrt(0.1039), 0), * [(-0.9291, -0.3699), (-0.3699, -0.9291)] (0, 1/sqrt(6.3336))] (0.3699, -0.9291)]

E = [(1.6961, -1.2338), (-0.6569, -0.3396)]

现在,我们用E对中心化后的数据进行白化:

X_whitened = E * X_centered

X_whitened = [(1.6961, -1.2338), * [(-0.75, -1.75, 1.25, 1.25), (-0.6569, -0.3396)] (-1.5, -0.5, 2.5, -0.5)]

X_whitened = [(0.7789, -0.1681, 2.0137, 0.1681), (-1.6340, 0.0409, 2.3481, 0.0409)]

现在我们已经对观测信号进行了预处理,接下来我们需要应用ICA算法来估计源信号。有多种ICA算法,例如FastICA、Infomax等。在这里我们不详细介绍具体算法的实现过程,但它们都试图找到一个解混矩阵W,使得源信号S的估计值尽可能地具有统计独立性。

设我们已经找到了解混矩阵W:

W = [(0.9, -0.4), (0.4, 0.9)]

那么我们可以通过解混矩阵W来估计源信号S:

S_estimated = W * X_whitened

S_estimated = [(0.9, -0.4), * [(0.7789, -0.1681, 2.0137, 0.1681), (0.4, 0.9)] (-1.6340, 0.0409, 2.3481, 0.0409)]

S_estimated = [(1.9277, 2.9723, 3.9623, 1.9723), (0.9889, -0.0541, 0.9459, 1.9459)]

可以看到,我们估计出的源信号S_estimated与我们开始时的源信号S非常接近:

S = [(2, 3, 4, 2), (1, 0, 1, 2)]

S_estimated = [(1.9277, 2.9723, 3.9623, 1.9723), (0.9889, -0.0541, 0.9459, 1.9459)]

要注意的是,源信号的估计值可能与原始信号相差一个缩放因子和符号,这是因为ICA只能确定信号的独立性,而不能确保信号的尺度和方向与原始信号完全一致。然而,在许多应用中,这种近似是可以接受的。

这个简单的例子展示了ICA如何从混合信号中恢复独立的源信号。实际应用中的信号更为复杂,通常涉及到更高维度的数据。ICA在许多领域都有广泛的应用,包括图像处理、语音识别、生物医学信号处理等。

因子分析(Factor Analysis):将观测数据分解为潜在变量和误差项的线性组合,广泛应用于心理学、社会学等领域。

因子分析是一种统计方法,用于研究多个观测变量之间的关系,通过将它们分解为更少数量的潜在变量(因子)。这些因子可以解释观测变量之间的相关性。现在,让我们通过一个简单的例子来说明因子分析的基本概念和计算过程。

假设我们要研究三名学生在数学、英语和科学三门课程的成绩。我们收集了他们的成绩数据

编辑切换为居中

添加图片注释,不超过 140 字(可选)

我们想通过因子分析来挖掘这些成绩背后的潜在因子。

首先,计算各科成绩的相关系数矩阵。在这里,我们省略计算过程,直接给出相关系数矩阵:

| 1 | 0.92 | 0.95 |

| 0.92 | 1 | 0.97 |

| 0.95 | 0.97 | 1 |

然后,对相关系数矩阵进行特征值和特征向量的计算。在这个例子中,我们可以得到以下特征值和对应的特征向量:

特征值1 = 2.89

特征向量1 = [0.58, 0.58, 0.57]

特征值2 = 0.11

特征向量2 = [-0.60, 0.25, 0.75]

特征值3 = 0.00

特征向量3 = [0.55, -0.77, 0.30]

选择主成分。我们可以选择特征值较大的特征向量作为主成分。在这个例子中,我们选择特征值1对应的特征向量1作为主成分。

计算因子载荷矩阵(即原始变量与潜在因子之间的相关系数)。我们将主成分与原始变量的相关系数作为因子载荷:

| 0.58 |

| 0.58 |

| 0.57 |

通过因子载荷矩阵,我们可以得出一个潜在因子,这个因子可以解释数学、英语和科学成绩之间的相关性。在这个例子中,潜在因子可能代表了学生的学术能力。

这个简化的例子展示了因子分析的基本过程。实际应用中,我们可能会遇到更多的变量和更复杂的数据。以下是因子分析的扩展过程:

计算因子得分。通过将因子载荷与原始数据相乘,我们可以为每个学生计算因子得分。在这个例子中,因子得分如下:

学生A: 0.58 * 85 + 0.58 * 70 + 0.57 * 80 = 133.1

学生B: 0.58 * 60 + 0.58 * 50 + 0.57 * 55 = 95.05

学生C: 0.58 * 90 + 0.58 * 95 + 0.57 * 93 = 161.45

因子得分反映了每个学生在潜在因子(这里是学术能力)上的表现。

旋转(可选)。为了更好地解释因子载荷矩阵,我们可以对其进行旋转。旋转方法有很多种,如Varimax旋转、Quartimax旋转等。旋转的目的是使因子载荷矩阵更容易解释。在这个简化的例子中,我们省略了旋转步骤。

解释因子。根据因子载荷矩阵和因子得分,我们可以解释潜在因子。在这个例子中,潜在因子可能代表了学生的学术能力。因子分析帮助我们了解到,这三门课程的成绩之间的相关性可以通过一个潜在的学术能力因子来解释。

这个例子展示了因子分析的基本概念和计算过程。请注意,这个例子非常简化,实际应用中的因子分析可能涉及更多观测变量和更复杂的计算。在心理学、社会学等领域,因子分析被用来研究观测变量之间的关系,以揭示潜在的结构或模式。

稀疏矩阵分解(Sparse Matrix Factorization):将一个稀疏矩阵分解为两个稀疏矩阵的乘积,适用于处理大规模稀疏数据。

稀疏矩阵分解(Sparse Matrix Factorization)是一种线性代数方法,将一个稀疏矩阵分解为两个较小的稀疏矩阵的乘积,有助于减少计算复杂度和存储空间。一个常用的稀疏矩阵分解方法是非负矩阵分解(Non-negative Matrix Factorization, NMF),它要求分解后的两个矩阵的元素都是非负的。

假设我们有一个 4x5 的稀疏矩阵 A:

A =

[ 0 0 5 0 0 ]

[ 3 0 0 0 4 ]

[ 0 0 0 6 0 ]

[ 1 0 0 0 0 ]

我们希望将这个矩阵分解为两个非负矩阵 W 和 H 的乘积,其中 W 是一个 4x2 矩阵,H 是一个 2x5 矩阵:

A ≈ W * H

我们可以使用迭代算法(如梯度下降或交替最小二乘法)来找到 W 和 H 的最佳近似值。在这个例子中,我们将使用简化的迭代算法来演示计算过程。

首先,随机初始化 W 和 H:

W =

[ 0.5 0.8 ]

[ 0.6 0.1 ]

[ 0.2 0.9 ]

[ 0.4 0.3 ]

H =

[ 0.1 0.5 0.7 0.2 0.6 ]

[ 0.4 0.3 0.9 0.8 0.1 ]

我们将使用以下更新规则来更新 W 和 H:

W_ij = W_ij * (A * H^T)_ij / (W * H * H^T)_ij

H_ij = H_ij * (W^T * A)_ij / (W^T * W * H)_ij

这里,* 表示矩阵乘法,^T 表示矩阵转置。我们可以迭代更新 W 和 H,直到收敛。为了简化计算过程,我们只进行一次更新:

更新 W:

W =

[ 0.415 0.840 ]

[ 0.625 0.081 ]

[ 0.168 0.922 ]

[ 0.417 0.273 ]

更新 H:

H =

[ 0.113 0.490 0.805 0.176 0.699 ]

[ 0.419 0.315 0.833 0.860 0.036 ]

计算新的 A' = W * H:

A' =

[ 0.350 0.302 1.097 0.851 0.173 ]

[ 0.920 0.649 2.111 0.434 0.926 ]

[ 0.404 0.389 1.302 1.070 0.029 ]

[ 0.536 0.471 1.126 0.324 0.398 ]

可以看到,经过一次迭代后的 A' 与原始矩阵 A 之间的差异仍然较大。在实际应用中,我们需要多次迭代,直到收敛,才能得到较好的近似结果。

稀疏矩阵分解在大规模稀疏数据处理中有广泛应用,例如推荐系统、文本挖掘、图像处理等领域。通过降低数据维度和存储需求,稀疏矩阵分解可以提高算法的效率和可扩展性。

除了非负矩阵分解(NMF)外,还有其他稀疏矩阵分解方法,它们可以根据问题的具体需求进行选择。以下是一些常见的方法:

奇异值分解(SVD):将一个矩阵分解为三个矩阵的乘积,即 A = UΣV^T,其中 U 和 V 分别是正交矩阵,Σ 是对角矩阵。SVD 在降维、数据压缩和推荐系统等领域有广泛应用。

主成分分析(PCA):通过线性变换将原始数据投影到新的坐标系,保留数据的主要特征。PCA 可以看作是 SVD 的一种特例。

独立成分分析(ICA):寻找一种线性变换,将原始数据转换为统计独立的子成分。ICA 常用于盲源分离和特征提取。

CUR 分解:将矩阵 A 分解为三个矩阵的乘积,即 A ≈ CUR,其中 C 和 R 分别是从 A 中选取的列和行组成的矩阵,U 是一个小型矩阵。CUR 分解在大规模数据分析和数据挖掘中具有优势。

因子分析(FA):将原始数据表示为潜在变量和误差项的线性组合。因子分析主要用于数据降维和模式识别。

稀疏主成分分析(Sparse PCA):在主成分分析的基础上引入稀疏性约束,使得主成分具有稀疏特性。Sparse PCA 主要应用于高维数据的降维和特征选择。

这些方法各有优缺点,可以根据实际问题的需求进行选择。在处理稀疏数据时,选择适当的矩阵分解方法可以提高计算效率和结果的解释性。

在广告场景下,以下几种矩阵分解方法较为常用:

奇异值分解(SVD):SVD 被广泛应用于推荐系统和广告投放中,它可以用于提取关键特征并降低数据维度。通过对用户和广告之间的交互矩阵进行分解,可以挖掘潜在的用户兴趣和广告特征,从而实现精准推荐和投放。

非负矩阵分解(NMF):NMF 也适用于广告投放和推荐系统,特别是在处理非负数据时(例如点击次数、收藏次数等)。通过 NMF 可以将稀疏数据分解为两个低维稀疏矩阵,揭示用户和广告的潜在联系,从而实现精准定位和推荐。

主成分分析(PCA):PCA 可以用于广告数据的降维和特征提取。在广告投放中,广告商可能需要处理大量的用户和广告特征数据。通过 PCA,可以将高维数据投影到低维空间,同时保留数据的主要特征,从而提高计算效率和广告投放的准确性。

稀疏主成分分析(Sparse PCA):Sparse PCA 在广告场景中同样有一定的应用。与 PCA 类似,Sparse PCA 可以用于降维和特征提取,但其结果具有稀疏性,有助于提高结果的可解释性。在广告投放中,这有助于找出更为关键的特征,提高广告效果。

在广告场景中,可以根据具体的问题和需求选择合适的矩阵分解方法。通过矩阵分解,广告商可以挖掘用户和广告之间的潜在关系,实现精准投放和推荐。

这些矩阵分解方法各有优缺点,选择合适的方法取决于具体的应用场景和需求。以下是这些方法的优劣势:

奇异值分解(SVD):优点:提取关键特征,降低数据维度,具有较强的稳定性和可解释性。缺点:计算复杂度较高,不适合非常大规模的数据集,且不能直接处理稀疏矩阵。

非负矩阵分解(NMF):优点:适用于非负数据,能够发现潜在结构,保持结果的非负性和稀疏性。缺点:收敛速度较慢,可能陷入局部最优解,且无法保证唯一解。

主成分分析(PCA):优点:降低数据维度,提取关键特征,具有较强的稳定性和可解释性。缺点:对异常值敏感,结果可能受到数据集的线性相关性影响,且不能直接处理稀疏矩阵。

独立成分分析(ICA):优点:可以提取统计独立的成分,适用于盲源分离和特征提取。缺点:计算复杂度较高,难以处理高维数据,且不能直接处理稀疏矩阵。

CUR 分解:优点:适用于大规模数据,分解后的矩阵具有较强的可解释性。缺点:计算复杂度较高,且需要选择合适的列和行进行分解。

因子分析(FA):优点:提取潜在变量,降低数据维度,有助于模式识别和数据解释。缺点:基于线性模型,可能无法描述数据的非线性结构,且不能直接处理稀疏矩阵。

稀疏主成分分析(Sparse PCA):优点:提取稀疏主成分,有助于特征选择和降维。缺点:计算复杂度较高,对参数选择敏感,且不能直接处理稀疏矩阵。

在广告场景中,可以根据以下几个方面来选择合适的矩阵分解方法:

数据性质:考虑数据是否为非负、稀疏等特点,选择相应的分解方法。

计算复杂度:权衡计算资源和时间,选择合适的方法。对于大规模数据集,可以选择计算复杂度较低的分解方法,如 CUR 分解。 3. 结果可解释性:在某些场景下,希望得到具有较强可解释性的结果,此时可以选择稀疏主成分分析(Sparse PCA)或非负矩阵分解(NMF)等方法。

稳定性和唯一性:某些方法可能陷入局部最优解或无法保证唯一解,如 NMF。在需要稳定性和唯一性的场景下,可以选择 SVD 或 PCA 等方法。

降维和特征提取:不同的矩阵分解方法具有不同的降维和特征提取能力。例如,PCA 和 Sparse PCA 可以用于降维和特征提取,而 NMF 则更注重发现潜在结构。

根据具体的应用场景和需求,可以选择合适的矩阵分解方法。在广告领域,矩阵分解技术可以帮助广告商挖掘用户和广告之间的潜在关系,实现精准推荐和投放。

在大规模稀疏广告场景中,考虑到性能、效果和数据量等方面的因素,以下几种矩阵分解方法较为适用:

非负矩阵分解(NMF):

性能:NMF 计算复杂度相对较低,对于稀疏数据的处理效率较高。

效果:NMF 能够发现潜在结构,且保持结果的非负性和稀疏性,有助于挖掘用户和广告之间的潜在联系。

数据量:NMF 适用于大规模稀疏数据,尤其是非负数据(如点击次数、收藏次数等)。

CUR 分解:

性能:CUR 分解在大规模数据分析和数据挖掘中具有优势,计算复杂度相对较低。

效果:CUR 分解的结果具有较强的可解释性,有助于发现关键特征。

数据量:CUR 分解适用于大规模稀疏数据,通过选择合适的列和行进行分解。

稀疏主成分分析(Sparse PCA):

性能:Sparse PCA 的计算复杂度相对较高,但在处理大规模稀疏数据时,其稀疏性有助于提高计算效率。

效果:Sparse PCA 结果具有稀疏性,有助于找出更为关键的特征,提高广告效果。

数据量:Sparse PCA 适用于大规模稀疏数据,可以降低数据维度并提取关键特征。

综合性能、效果和数据量等因素,在大规模稀疏广告场景中,NMF、CUR 分解和 Sparse PCA 都是适合的选择。具体选择哪种方法取决于实际问题的需求和场景特点。例如,如果广告数据为非负数据,可以优先考虑 NMF;如果需要更强的可解释性,可以考虑 CUR 分解或 Sparse PCA。

交替最小二乘法(Alternating Least Squares, ALS)是一种优化算法,用于求解含有多个变量的最小二乘问题。在ALS中,我们迭代地固定一部分变量,优化另一部分变量,直到收敛。这种方法在许多应用中都有广泛应用,如矩阵分解、张量分解和推荐系统等。

下面我们以矩阵分解为例说明ALS的工作原理。假设我们有一个矩阵A(m x n),我们希望将其分解为两个矩阵W(m x k)和H(k x n)的乘积,即:

A ≈ WH

我们的目标是找到W和H,使得A和WH之间的平方Frobenius范数最小:

min ||A - WH||^2_F

在ALS中,我们首先随机初始化矩阵W和H。然后,我们固定其中一个矩阵(例如W),并优化另一个矩阵(例如H)。接下来,我们固定刚刚优化的矩阵H,优化另一个矩阵W。如此迭代,直到损失函数收敛或达到最大迭代次数。

以下是ALS算法的基本步骤:

随机初始化矩阵W和H。

固定矩阵W,求解最小二乘问题,更新矩阵H。

固定矩阵H,求解最小二乘问题,更新矩阵W。

计算损失函数 ||A - WH||^2_F。

重复步骤2-4,直到损失函数收敛或达到最大迭代次数。

以推荐系统为例,假设我们有一个用户-物品评分矩阵A:

A = | 5 0 3 0 |

| 0 4 0 2 |

| 1 0 0 5 |

我们希望将矩阵A分解为两个矩阵W和H的乘积,其中W表示用户潜在特征,H表示物品潜在特征。我们可以使用ALS来求解这个问题:

随机初始化矩阵W和H。

固定W,求解最小二乘问题,更新H。

固定H,求解最小二乘问题,更新W。

计算损失函数 ||A - WH||^2_F。

重复步骤2-4,直到损失函数收敛或达到最大迭代次数。

最后,我们可以得到分解后的矩阵W和H,它们可以用于预测用户对未评分物品的评分。例如,如果分解后的矩阵W和H为:

W = | 1.2 0.5 |

| 0.8 1.1 |

| 0.6 1.3 |

H = | 0.9 0.8 1.2 1.1 |

| 1.0 1.1 0.5 1.3 |

我们可以通过计算WH的乘积来预测用户对物品的评分:

WH = | 1.98 1.05 2.94 2.76 |

| 1.78 2.89 1.46 2.33 |

| 1.50 2.93 1.67 2.89 |

从预测的评分矩阵中,我们可以看出用户1可能对物品2的评分为1.05,用户2可能对物品1的评分为1.78,用户3可能对物品2的评分为2.93等。这些预测可以用于为用户推荐物品,从而实现个性化推荐。

需要注意的是,ALS通常应用于稀疏矩阵(如用户-物品评分矩阵)。在这种情况下,我们只需针对已知评分进行优化。此外,为了防止过拟合,我们还可以在损失函数中加入正则化项。

总之,交替最小二乘法(Alternating Least Squares, ALS)是一种求解矩阵分解问题的优化算法,可以用于推荐系统、降维和特征提取等任务。通过迭代地固定一部分变量,优化另一部分变量,ALS可以找到一组最佳矩阵,使得原始矩阵与分解矩阵的乘积之间的误差最小。

矩阵分解的主要目的是降低数据的复杂性,同时保留尽可能多的原始信息。实际应用中,可以根据具体问题和数据特点选择合适的矩阵分解方法。以下是一些建议:

选择合适的矩阵分解方法:根据问题的性质和数据的特点,选择适当的矩阵分解方法。例如,如果需要解线性方程组,可以选择LU分解;如果需要对非负数据进行降维,可以选择NMF。

利用矩阵分解进行降维:通过矩阵分解,可以将原始高维数据投影到低维空间,从而降低数据的复杂性。例如,使用SVD或NMF进行数据降维可以提取数据中的主要特征,有助于进一步的数据分析和可视化。

利用矩阵分解进行特征提取:矩阵分解可以帮助提取数据中的潜在特征。例如,在文本挖掘中,使用NMF可以从大量文档中提取主题;在图像处理中,使用SVD可以提取图像的主要特征。

使用矩阵分解进行推荐系统建模:在推荐系统中,矩阵分解可以用来预测用户对项目的评分或兴趣。例如,使用SVD对用户-项目评分矩阵进行分解,可以预测用户对未评分项目的喜好程度。

利用矩阵分解进行数据压缩:矩阵分解可以用来压缩数据,减少存储空间和计算时间。例如,使用SVD对图像进行压缩,可以有效降低图像的存储空间和传输带宽。

模型优化与调参:在实际应用中,可以通过调整矩阵分解方法的参数来优化模型性能。例如,在SVD中,可以通过调整奇异值的数量来平衡压缩比和信息保留;在NMF中,可以通过调整分解矩阵的秩来控制特征的粒度。

总之,矩阵分解是一种强大且灵活的数学工具,可以广泛应用于各种领域。通过选择合适的矩阵分解方法并进行优化,可以有效地解决实际问题。

矩阵分解(Matrix Factorization):矩阵分解适用于推荐系统和预测用户对广告的喜好程度。

通过对用户-项目评分矩阵进行分解,可以提取用户和项目的潜在特征,从而预测用户对未评分广告的喜好程度。

优点:

能够挖掘潜在特征,提高推荐准确性。

易于实现,计算复杂度相对较低。

缺点:

需要大量的用户行为数据,对于冷启动问题(新用户或新广告)表现较差。

无法利用额外的特征信息(例如,用户年龄、性别等)来改善模型性能。

在广告领域,矩阵分解有很多应用场景,主要体现在以下几个方面:

用户画像构建:通过矩阵分解可以发现用户的兴趣和行为特征,从而构建精确的用户画像。这有助于广告投放平台精准匹配广告,提高广告的投放效果。

数据收集:首先需要收集大量的用户行为数据,如用户的浏览记录、购物记录、点击广告记录等。这些数据可以作为矩阵的输入,用于后续的矩阵分解处理。

数据预处理:对收集到的原始数据进行预处理,包括数据清洗、去除异常值和缺失值等,以提高数据质量。此外,还需要将数据转换成适用于矩阵分解算法的形式,如用户-项目矩阵。

矩阵分解:选择合适的矩阵分解算法(如SVD、NMF等),对预处理后的用户-项目矩阵进行分解,得到两个低维矩阵,一个表示用户潜在特征,另一个表示项目(如广告、商品等)的潜在特征。

假设我们有一个在线购物网站,网站上有3个用户(User1, User2, User3)和4个商品(ItemA, ItemB, ItemC, ItemD)。我们根据这些用户的购买记录创建一个用户-项目矩阵,其中矩阵的每个元素表示用户对商品的购买次数。例如:

编辑切换为居中

添加图片注释,不超过 140 字(可选)

我们可以使用矩阵分解方法(如SVD)将这个3x4的用户-项目矩阵分解为两个低维矩阵。假设我们将潜在特征的维度设为2,那么分解后的两个矩阵如下:

用户潜在特征矩阵(3x2):

编辑切换为居中

添加图片注释,不超过 140 字(可选)

项目潜在特征矩阵(2x4):

编辑切换为居中

添加图片注释,不超过 140 字(可选)

这两个矩阵分别表示用户和项目的潜在特征。例如,用户潜在特征矩阵中的每一行表示一个用户的潜在特征向量,项目潜在特征矩阵中的每一列表示一个项目的潜在特征向量。

潜在特征可以表示用户和项目的某些隐含属性。在这个例子中,F1 和 F2 可以分别代表两类商品属性,如“科技产品”和“生活用品”。用户潜在特征矩阵中的数值表示用户对这两类属性的喜好程度。例如,User1 对 F1(科技产品)的兴趣程度为0.7,对 F2(生活用品)的兴趣程度为1.2。

通过这种方式,我们可以将用户和项目的潜在特征结合起来,为用户推荐他们可能感兴趣的商品,从而提高推荐系统的准确性和个性化程度。

在实际应用中,矩阵分解得到的潜在特征通常是难以直接解释的,因为它们代表的是数据中的一种隐含关系。F1 和 F2 作为“科技产品”和“生活用品”的示例是为了更好地解释矩阵分解的概念。在实际操作中,我们很难直接从潜在特征中获取这样具体的类别信息。

然而,有时我们可以尝试对潜在特征进行解释和分析,方法如下:

分析潜在特征与已知属性的关联:如果我们有关于商品的一些已知属性(如商品类别、价格、品牌等),可以通过计算潜在特征与这些已知属性之间的相关性,来找出潜在特征可能表示的含义。例如,如果发现某个潜在特征与“科技产品”类别的商品高度相关,那么可以认为这个潜在特征可能表示用户对科技产品的兴趣。

聚类分析:对潜在特征进行聚类分析,将具有相似潜在特征的商品分为一类。然后观察每个类别中的商品,尝试找出它们的共同属性,从而对潜在特征进行解释。例如,如果某个类别中的商品主要是电子产品,那么可以认为该类别对应的潜在特征可能与电子产品相关。

专家知识:在某些情况下,可以请教行业专家,根据他们的经验和对领域的了解,尝试解释潜在特征所表示的含义。

需要注意的是,尽管可以尝试从潜在特征中提取一些有意义的信息,但它们仍然具有一定的抽象性,因此直接解释潜在特征可能具有一定的局限性。

潜在特征提取:从分解后的用户潜在特征矩阵中提取每个用户的潜在特征向量。这些潜在特征向量可以用来表示用户的兴趣和行为倾向,有助于构建用户画像。

用户画像构建:基于提取的潜在特征向量,为每个用户构建个性化的用户画像。可以通过聚类、分类等方法将具有相似潜在特征的用户划分为同一类别,从而形成细分的用户群体。

评估与优化:使用评估指标(如准确率、召回率等)评估用户画像的构建效果,并根据评估结果进行调整和优化。如调整矩阵分解算法的参数、选择不同的特征提取方法等,以提高用户画像的准确性和可靠性。

推荐系统:矩阵分解可以用于构建推荐系统,通过挖掘用户和广告之间的潜在关联,为用户推荐与其兴趣相匹配的广告。这有助于提高用户的点击率和转化率,从而提高广告投放的回报率。

广告投放优化:矩阵分解可以用于分析广告投放效果数据,发现广告投放策略的优劣,从而优化广告投放策略。这可以降低广告投放成本,提高广告效果。

时序广告预测:矩阵分解可以处理时序数据,帮助分析用户在不同时间段的行为模式,从而预测用户在未来的广告需求。这有助于广告投放平台提前做好广告资源规划,提高广告投放效率。

矩阵分解在广告中的优势主要体现在以下几点:

降维:矩阵分解可以有效地降低数据维度,减少计算复杂度,提高计算效率。

模型简化:矩阵分解通过发现数据中的潜在关联,可以简化模型,提高模型的泛化能力。

增强泛化能力:矩阵分解可以在不影响精度的前提下,减少模型的参数数量,降低模型复杂度,提高泛化能力。

解决稀疏数据问题:矩阵分解可以处理稀疏数据,发现稀疏数据中的潜在关联,从而提高数据利用率。

可解释性:矩阵分解产生的潜在特征向量具有较好的可解释性,可以帮助我们更好地理解数据背后的结构和关联。

矩阵分解可以应用于广告场景的CTR(点击率)预估,但它通常不是首选方法。

相比于FM(因子分解机)和GBDT+LR(梯度提升决策树与逻辑回归的组合)等方法,矩阵分解在CTR预估中存在一定的优劣势。

优势:

降维和特征提取:矩阵分解能有效地降低数据的维度,提取潜在特征,有助于挖掘数据中的关联性。

处理稀疏数据:矩阵分解能较好地处理稀疏数据,发现稀疏数据中的潜在关联。

劣势:

线性关系假设:矩阵分解假设用户和广告之间存在线性关系,但实际情况可能比这更复杂。相比之下,FM和GBDT+LR可以捕捉更复杂的关系。

可解释性差:矩阵分解得到的潜在特征往往难以解释,这可能导致CTR预估的结果难以理解和优化。

特征交互:矩阵分解关注用户和项目的潜在关系,可能无法充分捕捉其他特征之间的交互。而FM和GBDT+LR可以更好地处理特征交互。

训练和调优:矩阵分解的训练和调优相对较难。相比之下,FM和GBDT+LR在训练和调优上更加成熟和高效。

因此,在广告场景的CTR预估中,矩阵分解虽然可以应用,但相比于FM和GBDT+LR等方法,其性能可能较差。实际应用中,可以尝试使用FM和GBDT+LR等方法作为主要的CTR预估手段,同时可以将矩阵分解作为一个辅助方法,与其他算法结合使用,提高CTR预估的准确性。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

矩阵分解(Matrix Factorization,简称MF)的核心概念在于通过计算两个低维矩阵的乘积来模拟实际用户点击或评分生成的大型稀疏协同信息矩阵。这两个较小的矩阵分别代表用户嵌入矩阵和物品嵌入矩阵。从本质上讲,矩阵分解是一种将用户与物品间的协同信息进行降维编码的模型。这样的处理方法能有效地解决数据稀疏性问题,同时为用户和物品提供更精确的相似度计算。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

在实际的大规模数据场景下,排序阶段的应用往往依赖于更多的信息。仅依赖用户ID和物品ID的模型并不实用,因为它们没有利用到大量其他可用的特征,也就是所谓的Side Information。实际上,在许多真实应用场景中,用户和物品都拥有丰富的信息,而协同过滤数据仅仅是其中的一部分。为了更精确地进行个性化广告预估,引入更多特征显然是非常有益的。但如果一个模型无法方便地引入更多特征,其应用范围将受到严重限制,难以真正实现实用性。这也是为什么矩阵分解类方法在排序阶段很少被使用,通常仅作为召回策略的一部分存在的原因。

LR(Logistic Regression,逻辑回归)模型是CTR(点击率预估,Click-Through Rate)领域早期最成功的模型。许多工业推荐排序系统采用LR这种“线性模型+人工特征组合引入非线性”的模式。逻辑回归模型具有简单、方便、易解释、容易扩展等多种优点,因此目前仍有许多实际系统采用这种模式。然而,LR模型最大的缺陷是需要进行人工特征工程,这一过程耗时且消耗大量人力资源。为了解决这个问题,研究人员探讨了将特征组合能力体现在模型层面的方法。”

在近年来,一些模型被提出来以解决这个问题,例如:

FM(因子分解机,Factorization Machines):FM模型可以自动地学习特征之间的交互关系,有效地降低了特征工程的复杂性。FM模型能够处理高维稀疏数据,并且计算效率较高。

DNN(深度神经网络,Deep Neural Networks):DNN模型可以自动地学习高阶特征组合,无需进行人工特征工程。通过多层的非线性变换,DNN能够表达更复杂的函数关系,提高CTR预估的精度。

Wide & Deep模型:这是一种结合线性模型(Wide部分)和深度神经网络(Deep部分)的模型,旨在捕捉低阶特征组合(Wide部分)和高阶特征组合(Deep部分)的信息。这种模型可以同时利用人工特征工程和自动特征学习的优点。

Wide & Deep模型是一种结合线性模型(Wide部分)和深度神经网络(Deep部分)的模型。Wide部分主要负责捕捉线性关系(低阶特征组合),而Deep部分则主要负责捕捉非线性关系(高阶特征组合)。这种结构使得Wide & Deep模型能够在不同层次上捕捉特征间的关系,从而提高预测准确性。

具体来说:

Wide部分:Wide部分是一个广义的线性模型,它可以捕捉特征之间的线性关系。这部分通常使用人工特征工程,将原始特征进行组合或者转换,以便在特征空间中找到更有效的线性关系。这些线性关系有助于解释简单的依赖关系和一些低阶特征交互。

Deep部分:Deep部分是一个深度神经网络,它可以捕捉特征之间的非线性关系。通过多层的非线性变换,深度神经网络能够自动地学习高阶特征组合,从而捕捉更复杂的函数关系。这使得模型能够更好地泛化到新的数据,并提高预测准确性。

将这两部分结合起来,Wide & Deep模型可以同时捕捉线性和非线性关系,提高推荐系统和其他预测任务的性能。在实际应用中,Wide & Deep模型已经在Google Play商店的App推荐等场景中取得了显著的效果。

线性关系和非线性关系是描述变量之间关系的两种类型。

线性关系是指两个或多个变量之间存在直接成比例的关系。换句话说,当一个变量发生变化时,另一个变量以恒定比例跟随变化。线性关系可以用线性方程来表示,其图形表示为直线。例如,y = ax + b,其中y和x是两个变量,a和b是常数。

线性关系举例:假设一家公司的员工工资与其工作经验成正比。那么,这种关系可以用线性方程表示,如 y = 1000x + 3000,其中y表示工资,x表示工作经验年数。当工作经验每增加1年,工资增加1000元。

非线性关系是指两个或多个变量之间不存在直接成比例的关系。非线性关系通常涉及到复杂的相互作用,不能用简单的线性方程表示。非线性关系可以用非线性方程来表示,其图形表示为曲线。例如,y = ax^2 + bx + c,其中y和x是两个变量,a、b和c是常数。

非线性关系举例:假设一个人的运动能力与其训练时间成非线性关系。在训练初期,运动能力可能随着训练时间的增加而快速提高。但是,随着训练时间的进一步增加,运动能力的提高速度可能会减缓,甚至在达到一定水平后停滞不前。这种关系可能由一个非线性方程来表示,如 y = a(1 - e^(-bx)),其中y表示运动能力,x表示训练时间,a和b是常数。

总之,线性关系是指变量之间存在直接成比例的关系,可以用线性方程表示;而非线性关系是指变量之间不存在直接成比例的关系,通常更复杂,需要用非线性方程来表示。

DeepFM:DeepFM是一种结合FM模型和DNN模型的混合模型,可以同时学习低阶和高阶特征组合。DeepFM既能利用FM模型捕捉稀疏特征交互,又能利用DNN模型学习高阶特征组合,从而提高CTR预估的准确性。

DeepFM和Wide & Deep相比:

特征处理:Wide & Deep模型的Wide部分需要进行人工特征工程,而DeepFM的FM部分可以自动地学习特征之间的交互关系,降低了特征工程的复杂性。

低阶特征组合:Wide & Deep模型使用线性模型捕捉低阶特征组合,而DeepFM使用因子分解机模型捕捉低阶特征组合。这使得DeepFM具有更强的特征交互能力。

输入共享:在DeepFM中,FM部分和DNN部分共享相同的输入特征;而在Wide & Deep模型中,Wide部分和Deep部分的输入特征可能有所不同。

这些模型在不同程度上都试图将特征组合的能力体现在模型层面,减少了人工特征工程的需求,并在实际应用中取得了较好的效果。

LR优势:

简单;可解释;易扩展;效率高;易并行

LR劣势:

难以捕获特征组合

特征组合引入LR模型可以帮助模型捕捉特征之间的交互关系,但在实际应用中,这种方法的泛化能力往往较弱,尤其是在大规模稀疏特征存在的场景下。

优势:GBDT+LR

将两两组合特征引入模型:通过组合特征,可以增加模型的非线性表达能力,提高模型在复杂任务上的性能。

劣势:

特征组合泛化能力弱:由于大部分特征组合在实际数据中可能很少出现(例如,CTR预估和推荐排序任务中的大规模稀疏特征),导致模型对这些组合特征的权重参数无法学习,泛化能力较弱。

GBDT+LR 是一种经典的CTR预估模型,通过将GBDT和LR两种模型进行级联组合,可以充分利用两种模型的优势,解决高维稀疏特征的CTR预估问题。

具体来说,GBDT可以通过多棵树对特征进行组合和选择,得到一些高阶交叉特征,从而提高模型的表达能力。同时,GBDT能够处理稀疏特征,避免了稀疏特征下模型参数稀疏的问题。在GBDT模型的基础上,再使用LR模型进行预测,可以进一步提高模型的准确性。

在实际应用中,GBDT+LR模型在解决高维稀疏特征的CTR预估问题上表现良好,已被广泛应用于在线广告推荐等领域。

FM(因子分解机,Factorization Machines)模型是一种广泛应用于推荐系统、点击率预估等领域的机器学习算法。它可以有效地解决高维稀疏数据的特征组合问题。

FM模型的核心思想是将线性回归扩展为二阶特征组合,并对高维稀疏数据进行降维处理。

FM模型的基本结构如下:

线性回归部分(一阶特征):这部分可以看作是传统的线性回归模型,即对每个特征的权重进行线性加权。

二阶特征交叉部分:这部分考虑了特征之间的交互。在实际应用中,特征之间的交互关系可能很复杂,所以通过二阶交叉特征来捕捉特征间的非线性关系。

然而,直接计算二阶交叉特征可能导致参数过多,计算复杂度高。

为了解决这个问题,FM模型引入了因子分解的方法,即通过隐向量(embedding)来表示每个特征。对于每个特征 i,引入一个 k 维隐向量 vi,其中 k 是隐向量的维度。

这样,每个特征 i 和特征 j 的二阶交叉项可以用它们的隐向量的内积表示:vi·vj。这种方法将原本需要 O(n^2) 个参数的问题降低到了 O(nk) 的复杂度,大大减少了计算量。

FM模型的数学表达式为:

y(x) = w0 + Σwi*xi + ΣΣ(vi·vj)xixj 其中,

y(x) 是预测值;

w0 是全局偏置项;

wi 是特征 i 的权重;

xi 和 xj 是特征 i 和特征 j 的值;

vi 和 vj 是特征 i 和特征 j 的隐向量;

Σ 和 ΣΣ 分别表示对特征 i 和特征对 (i, j) 的求和。

FM模型的优势:

参数较少,降低了计算复杂度;

能有效处理高维稀疏数据;

能捕捉特征之间的交互关系;

可以采用随机梯度下降等优化方法进行训练;

模型具有很好的扩展性,可以用于各种场景。

FM模型在推荐系统、点击率预测等领域得到了广泛应用,其表现往往优于传统的线性模型。

FM(Factorization Machine)和XGBoost都是CTR预估中常用的模型,但它们的适用场景略有不同。

FM适用于高维稀疏特征的CTR预估,可以将特征进行交叉,得到二次项特征,从而能够更好地捕捉特征之间的交互信息。FM模型相对简单,训练速度较快,通常适用于数据量较大,特征维度较高的场景。

而XGBoost适用于高维稠密特征的CTR预估,可以处理非线性关系和特征之间的复杂交互关系。XGBoost是一种梯度提升决策树模型,它在特征工程和模型参数调节上比FM更加灵活,可以通过调节模型参数和特征工程的方式来提高模型的性能。

因此,如果特征维度较高且数据稀疏,可以考虑使用FM模型;如果特征维度较高且数据稠密,可以考虑使用XGBoost模型。当然,在实际应用中,不同的数据和业务场景下可能需要尝试多种模型,从而选择出最适合的模型。

因子分解机(FM)模型直接包含了任意两个特征的二阶特征组合,与支持向量机(SVM)模型的主要区别在于特征组合权重的计算方法。FM为每个特征学习一个大小为k的一维向量,因此,两个特征A和B的特征组合权重值可以通过它们对应的向量A和B的内积表示。这本质上是对特征进行embedding化的表示,与当前广泛应用的各种实体embedding方法具有相同的基本思想。然而,FM模型早在2010年就提出了这种方法,那时候尚未出现如今众多的embedding形式与概念。因此,FM可以看作是当前深度学习中各种embedding方法的先驱。当然,FM模型在某种程度上也受到了其前辈模型的影响。与现代深度DNN排序模型相比,FM模型只是少了两层或三层的多层感知机(MLP)隐层,这些隐层用于直接对多阶特征进行非线性组合建模。在其他方面,它们基本上是相同的。

在 FM 模型中,每个特征的隐向量是唯一的。对于输入特征向量中的每个特征,都会有一个与之对应的隐向量。这意味着,如果输入特征向量的维度是 n,那么 FM 模型会学习到 n 个独立的隐向量,每个隐向量的长度由超参数 k 控制。

这些隐向量在模型训练过程中会不断更新以优化模型的预测性能。通过隐向量之间的内积操作,FM 模型可以有效地捕捉不同特征之间的交互作用,从而提高模型的预测精度。在 FM 模型中,每个特征的隐向量都是唯一且至关重要的。

支持向量机(SVM)是一种基于间隔最大化的监督学习方法,它试图在特征空间中找到一个最佳的超平面来分隔不同类别的数据。SVM的特征组合权重计算与FM模型有所不同。

在SVM模型中,特征组合权重的计算主要依赖于所选的核函数。核函数(Kernel function)是将输入特征空间映射到一个更高维度的特征空间,使得在原始特征空间中线性不可分的数据在新的特征空间中变得线性可分。这种映射关系可以通过计算两个输入特征向量的核函数值来实现。

常用的核函数有线性核函数、多项式核函数、径向基核函数(RBF,Radial Basis Function)等。举一个简单的例子,对于线性核函数,特征组合权重的计算方法是直接计算输入特征向量的内积。而对于多项式核函数和RBF核函数,特征组合权重的计算方法涉及到特征向量的更复杂的非线性组合。

总之,SVM模型中的特征组合权重计算方法取决于所选择的核函数,核函数将原始特征空间映射到一个更高维度的特征空间,从而实现线性或非线性特征组合。

多层感知机(MLP,Multilayer Perceptron)是一种前馈神经网络,由多个层次组成,包括一个输入层、一个或多个隐藏层和一个输出层。每一层都包含若干个神经元,这些神经元通过权重连接在一起。隐层(Hidden Layer)是指除输入层和输出层之外的中间层。

隐层的主要作用是在输入和输出之间引入更多的非线性变换。在神经网络中,隐层的神经元通过激活函数(如ReLU、Sigmoid、Tanh等)将输入信号转换为输出信号。这些激活函数的非线性特性使得神经网络能够学习复杂的数据关系,从而对输入数据进行更高层次的抽象和表示。

具体来说,神经网络的每个隐层都可以被视为一个特征变换层。随着输入数据在神经网络中的前向传播过程,每个隐层都会将前一层的输出作为输入,通过激活函数和权重连接进行特征变换。通过多个隐层的堆叠,神经网络可以捕捉到数据中的高阶关系和复杂模式。

在实际应用中,隐层数量和每个隐层中的神经元数量是可以调整的超参数。通过合适的网络结构设计和参数选择,多层感知机可以在各种任务中取得较好的性能。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

编辑切换为居中

添加图片注释,不超过 140 字(可选)

FM的这种特征embedding模式

在大规模稀疏特征应用环境下比较好用?

为什么它的泛化能力强呢?

即使在训练数据里两个特征并未同时在训练实例里见到过,意味着xi xj一起出现的次数为0,如果换做线性模型的模式,是无法学会这个特征组合的权重的。

但是因为FM是学习单个特征的embedding,并不依赖某个特定的特征组合是否出现过,所以只要特征xi和其它任意特征组合出现过,那么就可以学习自己对应的embedding向量。

于是,尽管 xi xj这个特征组合没有看到过,但是在预测的时候,如果看到这个新的特征组合,因为 xi和xj都能学会自己对应的embedding,所以可以通过内积算出这个新特征组合的权重。这是为何说FM模型泛化能力强的根本原因。其实本质上,这也是目前很多花样的embedding的最核心特点,就是从0/1这种二值硬核匹配,切换为向量软匹配,使得原先匹配不上的,现在能在一定程度上算密切程度了,具备很好的泛化性能。 Wij = vi[i feature的embedding向量] * vj[j feature 的embedding向量],W = V * V^T,二维矩阵通过变换,能变成embedding的表达

假设我们有一个电影推荐系统,它根据用户的兴趣和电影的属性来预测用户是否喜欢某部电影。这个系统的输入特征可能包括用户兴趣(如科幻、喜剧、爱情等)和电影属性(如导演、演员、类型等)。在这种情况下,训练数据可能非常稀疏,因为每个用户只对少数电影产生兴趣,而每部电影也只属于某几个类别。

传统的线性模型将会在这种情况下遇到困难,因为许多特征组合(如用户兴趣和电影属性)在训练数据中可能从未一起出现过。这使得线性模型无法学习到这些特征组合的权重。

而FM采用了特征嵌入的方法,可以学习每个特征(如用户兴趣和电影属性)的嵌入向量,而不依赖于它们是否在训练数据中同时出现过。假设训练数据中从未出现过一个用户喜欢科幻片并且喜欢某位导演的情况。但是,FM可以学习到科幻片这个特征的嵌入向量,以及该导演的嵌入向量。

当在预测阶段遇到一个用户喜欢科幻片且喜欢该导演的情况时,尽管这个特征组合在训练数据中从未出现过,但FM可以通过计算科幻片特征和导演特征的嵌入向量之间的相似度来估计这个新特征组合的权重。因此,FM具有较强的泛化能力,可以在稀疏特征环境下更好地捕捉特征组合,从而提高预测准确性。

FM(因子分解机):优点:

参数较少:FM通过隐向量的形式来表示特征间的交互关系,因此参数较少,易于训练。

能有效捕捉特征交互:FM可以自动学习特征之间的二阶交互关系,因此可以有效地捕捉特征之间的相互作用。

支持稀疏数据:FM天然支持稀疏数据,适用于广告场景中的大规模稀疏数据。

缺点:

只能捕捉二阶交互:FM只能捕捉特征之间的二阶交互关系,对于高阶交互关系无法建模。

对于特征处理能力有限:FM对原始特征的处理能力有限,需要较为精细的特征工程。FM算法不能很好地处理非线性问题,因此在面对复杂的CTR预估场景时,其表现可能不如其他算法。

GBDT+LR(梯度提升决策树+逻辑回归):优点:

强大的特征处理能力:GBDT可以自动发现有效的特征组合,减少对特征工程的依赖。

可解释性强:决策树模型具有较高的可解释性,易于理解和调试。

捕捉高阶交互:GBDT通过多棵树的组合可以捕捉特征之间的高阶交互关系。

鲁棒性强:GBDT对异常值和噪声具有较强的鲁棒性。

缺点:

训练时间较长:由于GBDT需要串行训练多棵树,因此训练时间较长。

参数较多:GBDT+LR模型参数较多,需要进行较多的调参工作。

需要特征离散化:为了与LR模型结合,GBDT需要对特征进行离散化处理,可能会损失部分信息。

在广告CTR预估场景中,FM和GBDT+LR各有优劣。FM适用于参数较少、特征稀疏的场景,而GBDT+LR适用于需要强大特征处理能力、高阶特征交互的

编辑切换为居中

添加图片注释,不超过 140 字(可选)

FM如今被广泛采用并成功替代LR模型的一个关键所在是:它可以通过数学公式改写,把表面貌似是O(k*n^2)的复杂度降低到 O(k*n),其中n是特征数量,k是特征的embedding size,这样就将FM模型改成了和LR类似和特征数量n成线性规模的时间复杂度了,这点非常好。

那么,如何改写原始的FM数学公式,让其复杂度降下来呢?

编辑

添加图片注释,不超过 140 字(可选)

v是一个k维的向量

vi * vj -> k维向量逐位相乘,sum_k

编辑切换为居中

添加图片注释,不超过 140 字(可选)

编辑切换为居中

添加图片注释,不超过 140 字(可选)

编辑切换为居中

添加图片注释,不超过 140 字(可选)

编辑切换为居中

添加图片注释,不超过 140 字(可选)

编辑切换为居中

添加图片注释,不超过 140 字(可选)

FM模型的特征组合计算公式中如果把k维特征向量内积求和公式抽到最外边后,公式就转成了上图这个公式了(不考虑最外边k维求和过程的情况下)。它有两层循环,内循环其实就是指定某个特征的第f位(这个f是由最外层那个k指定的)后,和其它任意特征对应向量的第f位值相乘求和;而外循环则是遍历每个的第f位做循环求和。这样就完成了指定某个特征位f后的特征组合计算过程。最外层的k维循环则依此轮循第f位,于是就算完了步骤三的特征组合

编辑切换为居中

添加图片注释,不超过 140 字(可选)

编辑切换为居中

添加图片注释,不超过 140 字(可选)

于是,通过上述四步的公式改写,可以看出在实现FM模型时,时间复杂度就降低到了 O(k*n),而虽说看上去n还有点大,但是其实真实的推荐数据的特征值是极为稀疏的,就是说大量xi其实取值是0,意味着真正需要计算的特征数n是远远小于总特征数目n的,无疑这会进一步极大加快FM的运算效率

FM理解平方项

编辑切换为居中

添加图片注释,不超过 140 字(可选)

这个平方项,它等价于将FM的所有特征项的embedding向量累加,之后求内积

FM召回阶段使用

离线训练过程与在排序阶段采用的FM模型相同,例如,我们可以利用线上收集的用户点击数据作为训练数据,在线下训练一个完整的FM模型。在召回阶段,我们需要每个特征以及该特征对应的训练好的embedding向量,这些可以提前存储以备使用。

在线预估阶段(y = F(user, item, context)),我们通过学习用户(User)相关特征、广告(Item)相关特征和上下文特征(Context,如何时何地使用何种品牌手机登录等),来学习一个映射函数F。一旦学习好这个函数,当遇到一个新的Item时,我们将用户特征、广告特征和用户遇到该广告时的上下文特征输入到F函数中,F函数将告诉我们用户是否对这个广告感兴趣。如果他们感兴趣,我们就可以将该广告推送给用户。

我们将特征划分为三个子集:用户相关特征集、广告相关特征集和上下文相关特征集。用户历史行为特征,如过去点击广告的特征,可以作为描述用户兴趣的特征,纳入用户相关特征集合中。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

对于某个用户,我们可以从离线训练好的FM模型中查询其子集特征所对应的embedding向量,并将这n个用户子集特征的embedding向量相加得到用户兴趣向量U。这个向量的维度与每个特征的维度相同。同样地,我们也可以从FM模型中查询每个广告及其对应子集特征的embedding向量,将这m个广告子集特征的embedding向量相加,得到广告向量I,它的维度也与每个特征的维度相同。

在简化版的FM召回模型中,用户兴趣向量U可以离线计算好并更新到线上相应的内容;而广告向量I也可以通过类似的离线计算或近在线计算方式得到。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

对于每个用户和广告,我们可以使用第一步中的方法计算用户兴趣向量,并将结果离线存储在在线数据库(如Redis)中,以便通过用户ID查询其对应的embedding。同时,我们可以将广告向量逐一离线计算并存储在Faiss(Facebook开源的embedding高效匹配库)数据库中。

当用户登录或刷新页面时,我们可以根据用户ID提取相应的兴趣向量embedding,然后与Faiss中存储的物料embedding进行内积计算。根据计算得分由高到低,返回得分Top K的广告作为召回结果,然后提交给第二阶段的排序模型进行进一步排序。在这个过程中,Faiss的查询速度至关重要。

通过累加用户embedding特征向量和累加广告embedding特征向量,然后进行向量内积计算,这种方法确实符合FM模型的原则。与常规FM模型基本等价,它遵循FM的特征组合原理。

实际上,这种方法执行了用户特征集合U和广告特征集合I之间的两两特征组合。为了提高计算效率,FM模型对原始公式进行了改写。改写后的高效计算公式中的第一个平方项等价于:将所有特征embedding向量逐位累加为一个求和向量V,然后计算该向量与其自身的内积操作<V,V>。这种计算方式符合FM原则,实现了任意两个特征的二阶特征组合。

上述描述的方法与标准FM模型的处理方式基本相同,区别在于将特征集合划分为两个子集合U和I,分别代表用户相关特征和广告相关特征。实际上,这种方法等价于在用户特征和广告特征之间进行两两特征组合,仅缺少了U内部特征之间和I内部特征之间的组合。通常情况下,我们不需要计算U内部特征之间以及I内部特征之间的组合,对最终效果的影响很小。因此,我们可以得出结论:该方法与FM标准计算过程基本等价。

在抽象的推荐和广告系统中,除了用户特征和广告特征外,还有一类重要的特征,即用户行为发生时的场景上下文特征(例如刷新APP的时间、地点、使用设备等)。

然而,上述召回模型并未考虑这一部分。

上下文特征被单独提出是因为其独特性。有些上下文特征几乎是实时变化的,例如刷新APP的时间,或对地理位置敏感的应用(如美团、滴滴)中的用户所处地点。在召回阶段,这种变化需要得到体现。因此,上下文特征的动态性较强,不太可能像用户特征那样离线计算并存储。

要将上下文特征融入与标准FM等价的召回模型,我们需要考虑两个问题:

由于部分上下文特征可能实时变化,无法离线计算,如何将其融入前述召回计算框架?

我们需要考虑上下文特征C与用户特征U之间的特征组合,同时也需要考虑C与广告特征I之间的特征组合。考虑到上下文特征在某些情况下可能非常强烈,如何将这两组特征组合考虑进来?

解决这两个问题将有助于我们构建一个更加全面和有效的推荐和广告召回模型。

融入动态场景特征的召回模型-step1

编辑切换为居中

添加图片注释,不超过 140 字(可选)

由于上下文特征的动态性,给定用户UID后,我们可以在线实时查询某个上下文特征对应的embedding向量。然后将所有上下文向量相加,得到综合的上下文向量C。实际上,这个过程与U和I的累加过程相同,区别仅在于上下文特征需要在线实时计算。通常情况下,场景上下文特征数量有限,因此在线计算速度是可以接受的。

融入动态场景特征的召回模型-step2

编辑切换为居中

添加图片注释,不超过 140 字(可选)

将在线计算得到的上下文向量C与事先计算好并存储的用户兴趣向量U进行内积计算,得到Score=<U,C>。这个数值代表了用户特征和上下文特征之间的二阶特征组合得分,我们将其计算出并备用。实际上,这个得分代表FM模型中U和C特征组合的原理与之前解释的U和I特征组合原理相同。

融入动态场景特征的召回模型-step3

编辑切换为居中

添加图片注释,不超过 140 字(可选)

将U和C向量相加求和,使用(U+C)在Faiss中通过内积方式取出Top K广告。这个过程与极简版类似,只是查询向量由U更换为(U+C)。通过这种方法取出的广告同时考虑了用户和广告的特征组合<U,I>,以及上下文和广告的特征组合<C,I>。这个原理与之前讲述的内容相似。

假设返回的Top K广告都带有内积得分Score1,再结合前一步的<U,C>得分Score,将两者相加对广告进行重排序(虽然<U,C>与广告无关,不会影响广告排序,但会影响最终得分,FM最外层的Sigmoid输出可能因为加入这个得分而发生变化),就能得到最终结果。这个最终结果考虑了U/I/C两两之间的特征组合。

因此,我们通过这种方法构建了一个完整的FM召回模型。这个召回模型通过构建用户embedding、上下文embedding和物品embedding,并充分利用类似Faiss这种高效embedding计算框架,实现了与FM计算等价的高效召回系统。

FM模型能否将召回和排序阶段一体化

当前常见的工业广告系统之所以分为召回和排序两个阶段,是因为这两个阶段各司其职,职责分明。召回主要考虑泛化性并降低候选广告集合的数量;排序则主要负责根据用户特征、广告特征和上下文特征对广告进行精准排名。

要将FM模型用于一体化的广告系统,即简化为单阶段模型,我们需要评估FM召回模型是否能够同时承担原先两阶段模型的两个职责。具体来说,我们需要确定FM召回模型直接输出推荐结果的速度是否足够快,以及精准程度是否与两阶段模型相媲美。如果这两个问题的答案都是肯定的,那么FM模型就能实现现有的两阶段推荐过程的一体化。

为了回答这个问题,我们首先从推荐精准度方面进行分析,因为如果精准度不能保证,那么速度再快也失去意义。

那么,FM召回模型的推荐结果质量是否能够接近召回和排序两阶段模式呢?假设我们有一个FM召回模型直接输出排序结果,而另一个对比模型采用常见的多路召回+FM模型排序配置。从之前的分析中我们可以看出,虽然FM召回模型为了提高速度而对模型进行了一些调整,但是如果两阶段模型中的排序阶段也采用FM模型,我们可以很容易地得出以下结论:如果FM召回模型使用的特征和两阶段模型的FM排序模型使用相同的特征,那么它们的推荐效果是等价的。

这意味着,只要将目前的多路召回都转化为特征并加入FM召回模型,同时确保FM排序阶段采用的特征在FM召回模型中也被使用,那么这两者的推荐效果应该是相似的。因此,从理论上讲,我们是可以将两阶段模型简化为单阶段模型的。

只用FM召回模型做推荐,速度是否足够快?

我们假设召回阶段FM模型对User embedding和Item embedding的匹配过程采用Facebook的Faiss系统,其速度快慢与两个因素有关系:

广告库中存储的Item数量多少,Item数量越多越慢;

embedding大小,embedding size越大,速度越慢;

当然,上面的测试主要关注的是Faiss查询速度。实际上,在合并用户特征embedding时,我们需要查询用户特征对应的embedding数据。这个问题应该不会太大,因为绝大多数用户特征是静态的,可以在离线阶段合并进入用户embedding。对于场景特征和实时特征,需要在线查询对应的embedding,但这些特征在总体上所占比例不算太大,所以速度应该不会受到太大影响。

综上所述,在理论分析角度来看,FM召回模型在实用速度和推荐效果方面,应该能够承载目前“多路召回+FM排序”两阶段推荐模式的功能。因此,可以推断FM召回模型有潜力将广告系统改造为单模型单阶段模式。

然而,在实际工业应用中,业界仍倾向于将召回和排序阶段分开。这主要是因为将所有功能集中在一个模块中可能会导致该模块难以维护,每次迭代的成本都会很高。将一系列灵活可调整、可解释的白盒子模型变成一个大黑盒子,并不是一个明智的选择。另外,FM虽然能提高点击率,但它不能完全替代其他具有产品意图的召回策略。

TensorFlow实现的FM模型推断部分的代码

import tensorflow as tf

def inference(self):
    # 定义线性层
    with tf.variable_scope("linear_layer"):
        # 初始化偏置项 b
        b = tf.get_variable(name='bias', shape=[self.output_dim], initializer=tf.zeros_initializer())
        # 初始化权重矩阵 w1
        w1 = tf.get_variable(name='w1', shape=[self.p, self.output_dim])
        # 计算线性层的输出
        self.linear_term = tf.add(tf.sparse_tensor_dense_matmul(self.x, w1), b)

    # 定义交互层
    with tf.variable_scope("interaction_layer"):
        # 初始化交互矩阵 V
        v = tf.get_variable(name="v", dtype=tf.float32, shape=[self.p, self.k], initializer=tf.truncated_normal_initializer(0, 0.01))
        # 计算交互层的输出
        self.interaction_terms = tf.multiply(1/2.0, tf.reduce_mean(tf.subtract(tf.pow(tf.sparse_tensor_dense_matmul(self.x, v), 2), tf.sparse_tensor_dense_matmul(tf.pow(self.x, 2), tf.pow(v, 2))), axis=1, keepdims=True))

    # 将线性层和交互层的输出相加,得到最终的logits
    self.y_logits = tf.add(self.linear_term, self.interaction_terms)
    # 使用softmax函数计算概率
    self.y_prob = tf.nn.softmax(self.y_logits)

这段代码实现了FM模型的推断部分,

包括线性层(linear_layer)和

交互层(interaction_layer)。

线性层负责处理特征之间的一阶关系,

交互层则负责处理特征之间的二阶关系。

最后,将这两部分的输出相加,计算出预测结果。

在这个实现中,输出结果的维度由output_dim指定,通常用于多分类问题。对于二分类问题,可以将output_dim设置为1。

GBDT+FM

# 导入所需库
from pyspark.sql import SparkSession
from pyspark.ml.feature import StringIndexer, VectorAssembler, VectorIndexer
from pyspark.ml.classification import GBTClassifier
from pyspark.ml import Pipeline
from pyspark.ml.evaluation import BinaryClassificationEvaluator
from pyspark.ml.regression import FMRegressor

# 创建Spark会话
spark = SparkSession.builder \
    .appName("GBDT+FM CTR Prediction Demo") \
    .getOrCreate()

# 加载数据
data = spark.read.csv("path/to/your/data.csv", header=True, inferSchema=True)
categorical_columns = ['gender', 'device']
numerical_columns = ['age', 'page_views']


# 预处理数据
# 对类别特征进行编码
indexers = [StringIndexer(inputCol=column, outputCol=column+"_index").fit(data) for column in categorical_columns]

# 创建特征向量
assembler = VectorAssembler(
    inputCols=[indexer.getOutputCol() for indexer in indexers] + numerical_columns,
    outputCol="features")

# 划分训练集和测试集
train, test = data.randomSplit([0.8, 0.2], seed=42)

# GBDT模型
gbdt = GBTClassifier(labelCol="label", featuresCol="features", maxIter=10)

# GBDT + FM模型
# 训练GBDT模型并获取叶子节点特征
gbdt_pipeline = Pipeline(stages=indexers + [assembler, gbdt])
gbdt_model = gbdt_pipeline.fit(train)
gbdt_leaf_features = gbdt_model.stages[-1].treeWeights

# 将叶子节点特征传递给FM模型作为输入
vector_indexer = VectorIndexer(inputCol="features", outputCol="indexed_features")
fm = FMRegressor(labelCol="label", featuresCol="indexed_features")

# 创建FM模型流水线
fm_pipeline = Pipeline(stages=[vector_indexer, fm])

# 训练FM模型
fm_model = fm_pipeline.fit(gbdt_leaf_features)

# 预测和评估
predictions = fm_model.transform(test)
evaluator = BinaryClassificationEvaluator(labelCol="label", metricName="areaUnderROC")
auc = evaluator.evaluate(predictions)
print("Test AUC: ", auc)

# 关闭Spark会话
spark.stop()

GBDT+FM(Gradient Boosting Decision Tree + Factorization Machines)和GBDT+LR(Gradient Boosting Decision Tree + Logistic Regression)都是广告点击率预估场景下的流行方法。它们各自具有一定的优势和劣势:

GBDT+FM:优势:

FM模型可以自动学习特征间的二阶交互关系,这对于广告CTR预估非常有用,因为用户行为和广告特征通常具有复杂的交互关系。

FM模型比LR更具泛化能力,尤其是在数据稀疏的情况下。

劣势:

GBDT+FM的训练和预测速度相对较慢,因为FM模型本身的计算复杂度较高。

GBDT+FM的实现和调优可能会更复杂,因为需要同时调整GBDT和FM的超参数。

GBDT+LR:优势:

GBDT+LR的训练和预测速度通常比GBDT+FM更快,因为逻辑回归模型的计算复杂度较低。

GBDT+LR的实现和调优相对简单,因为逻辑回归模型比FM模型更易于理解和调整。

劣势:

逻辑回归模型无法自动学习特征间的交互关系,需要人工创建交互特征,这可能会导致遗漏重要的交互信息。

GBDT+LR在数据稀疏的情况下可能不如GBDT+FM具有泛化能力。

综上,GBDT+FM和GBDT+LR各自具有优势和劣势。在实际应用中,选择哪种方法取决于特定场景的需求。如果对模型的泛化能力和特征交互学习有较高要求,可以考虑使用GBDT+FM。而如果对模型的训练和预测速度以及实现和调优的简便性有较高要求,则可以考虑使用GBDT+LR。最好在实际场景中对两种方法进行实验评估,根据实验结果选择最佳方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/420541.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Win10+Anaconda+Pytorch_CPU+VsCode安装配置

一、安装Anaconda 1&#xff0c;官网下载Anaconda安装包&#xff0c;找到对应版本的python&#xff0c;我下的是Anaconda3-2020.07-Windows-x86_64.exe&#xff0c;python版本为3.8.3&#xff1b; 安装时注意这个界面时 第一个不要勾选&#xff0c;安装成功后&#xff0c;手动…

如何在企业微信中使用低代码工具?

企业微信是一款非常强大的办公应用软件&#xff0c;可以方便地进行企业内部的沟通、协作、管理等工作。虽然企业微信本身并不提供低代码工具&#xff0c;但是可以通过集成第三方的低代码工具来实现在企业微信中的使用。 例如&#xff0c;可以使用低代码平台简道云&#xff0c;…

Python3--垃圾回收机制

一、概述 Python 内部采用 引用计数法&#xff0c;为每个对象维护引用次数&#xff0c;并据此回收不在需要的垃圾对象。由于引用计数法存在重大缺陷&#xff0c;循环引用时由内存泄露风险&#xff0c;因此Python还采用 标记清除法 来回收在循环引用的垃圾对象。此外&#xff0c…

「线性DP-学习案例」传球游戏

传球游戏 题目描述 ​ 上体育课的时候&#xff0c;小蛮的老师经常带着同学们一起做游戏。这次&#xff0c;老师带着同学们一起做传球游戏。 ​ 游戏规则是这样的&#xff1a;n个同学站成一个圆圈&#xff0c;其中的一个同学手里拿着一个球&#xff0c;当老师吹哨子时开始传球…

Systemverilog中Assertions的记录

1. assertion statement Assertion statement有以下几种类型&#xff1a; assert: 指定DUT的property&#xff0c;必须要verifyassume: 给验证环境指定假设的property。simulator检查这些property&#xff0c;但是formal工具会使用这些信息来产生输入激励。cover: 监控proper…

面试题:Ajax、Fetch、Axios三者的区别

Ajax 它的全称是&#xff1a;Asynchronous JavaScript And XML&#xff0c;翻译过来就是“异步的 Javascript 和 XML”。 Ajax 是一个技术统称&#xff0c;是一个概念模型&#xff0c;它囊括了很多技术&#xff0c;并不特指某一技术&#xff0c; Ajax 是一种思想&#xff0c;X…

【Hello Network】网络编程套接字(一)

作者&#xff1a;小萌新 专栏&#xff1a;网络 作者简介&#xff1a;大二学生 希望能和大家一起进步 本篇博客简介&#xff1a;简单介绍网络的基础概念 网络编程套接字&#xff08;一&#xff09;预备知识源ip和目的ip端口号TCP和UDP协议网络中的字节序socket编程接口socket常见…

爬虫1000+个C程序

爬虫1000个C程序 问题场景 由于实验需要&#xff0c;我需要1000个elf文件&#xff0c;可是网络可获取的elf文件较少&#xff0c;c程序较多&#xff0c;所以首先下载c程序&#xff0c;之后gcc编译链接生成elf文件。我需要的C源码不是项目级别的&#xff0c;正常100行左右就可以…

PNAS:土地利用和土地覆盖的变化决定了保护区的可持续性和影响

PNAS 中文题目&#xff1a; 土地利用和土地覆盖的变化决定了保护区的可持续性和影响 英文题目&#xff1a; Land-use and land-cover change shape the sustainability and impacts of protected areas 作者&#xff1a; Determinants and impacts of protected area remova…

MATLAB 神经网络变量筛选—基于BP的神经网络变量筛选(链接在文末)

灰色系统理论是一种研究少数据、贫信息、不确定性问题的新方法&#xff0c;它以部分信息已知&#xff0c;部分信息未知的“小样本”&#xff0c;“贫信息”不确定系统为研究对象&#xff0c;通过对“部分”已知信息的生成、开发&#xff0c;提取有价值的信息&#xff0c;实现对…

软考第六章 网络互连与互联网

网络互连与互联网 1.网络互连设备 组成因特网的各个网络叫做子网&#xff0c;用于连接子网的设备叫做中间系统。它的主要作用是协调各个网络的工作&#xff0c;使得跨网络的通信得以实现。 网络互连设备可以根据它们工作的协议层进行分类&#xff1a; 中继器&#xff1a;工…

双周赛102(模拟、BFS技巧、求最短路模板问题)

文章目录双周赛102[6333. 查询网格图中每一列的宽度](https://leetcode.cn/problems/find-the-width-of-columns-of-a-grid/)模拟[6334. 一个数组所有前缀的分数](https://leetcode.cn/problems/find-the-score-of-all-prefixes-of-an-array/)模拟(一次遍历)&#x1f62d;[6335…

【黑马】JavaWeb开发教程(涵盖Spring+MyBatis+SpringMVC+SpringBoot等)目录合集

​Java Web 传统路线&#xff1a; 课程讲述路线&#xff1a; 视频链接&#xff1a; 2023新版JavaWeb开发教程&#xff0c;实现javaweb企业开发全流程 学习时间&#xff1a; 断断续续&#xff0c;按照课程安排正常学习&#xff0c;历时15天&#xff0c;完结撒花&#xff01;…

快速认识并上手Eureka注册中心

文章目录一、初识Eureka1.1 EurekaServer1.2 EurekaClient1.2.1 EurekaClient中的角色二、EurekaServer2.1 搭建EurekaServer2.1.1 依赖引入2.1.2 添加注解2.1.3 配置eureka地址2.1.4 验证2.2 注册EurekaClient2.2.1 引入客户端依赖2.2.2 配置eureka地址2.2.3 验证2.3 服务发现…

【C++】多态---下(多态的原理)

前言&#xff1a; 在多态---上中我们了解了什么是多态&#xff0c;以及多态的使用条件等。本章将进行更深入的学习&#xff0c;我们详细理解多态的原理。 目录 &#xff08;一&#xff09;虚函数表 &#xff08;1&#xff09;虚函数表的引入 &#xff08;2&#xff09;虚表…

RHCE——时间服务器(ntp)

1.配置ntp时间服务器&#xff0c;确保客户端主机能和服务主机同步时间 2.配置ssh免密登陆&#xff0c;能够通过客户端主机通过redhat用户和服务端主机基于公钥验证方式进行远程连接 一.配置ntp时间服务器&#xff0c;确保客户端主机能和服务主机同步时间 1、软件安装 [rootl…

宝可梦朱紫太晶化效果小记

首先&#xff0c;不得不吐槽一下&#xff0c;switch上这么多代宝可梦下来&#xff0c;好玩是好玩&#xff0c;但是整体效果和优化不能说糟烂&#xff0c;只能说稀碎。 看这个朱紫的截帧都给我看吐了&#xff0c;上点心啊老任 回到效果&#xff0c;首先是实现方式 主要有俩点 …

3.Earth Engine语法Javascript版(基本属性2)

1.地图MAp 1. Map.add(item)这个方法通常是在地图展示区加入各种ui使用&#xff0c;如ui.Label 2.Map.centerObject(object, zoom)设置地图居中位置&#xff0c;参数object是矢量数据或者影响数据&#xff1b;zoom是缩放级别。 3.Map.addLayer(ee.Object, visParams, name, …

树莓派利用python-opencv使用CSI摄像头调用监控视频

目录 一、安装python-opencv。 二、使用工具Xshell7和MobaXterm 三、连接并打开CSI摄像头 3.1连线如图所示&#xff1a; 3.2打开摄像头 四、编写摄像头代码调用摄像头 一、安装python-opencv。 一定要选择配置好的安装python-opencv&#xff0c;不要去配置安装&#xff0c…

012 - C++指针

本期我们将学习 C 中的指针。 指针是一个令很多人都很痛苦的内容&#xff0c;然而指针其实没有大家想象中的那么复杂。另外我先要说明本期我们要讨论的是原始的指针&#xff0c;还有一种常用的指针叫智能指针&#xff0c;这个我们在之后的内容中会接触学习。 计算机处理内存&…