Python共生矩阵对比奇异值分解 (SVD)和词嵌入

词嵌入

词嵌入是转换成数字的文本。同一文本可能有不同的数字表示。

许多机器学习算法和几乎所有深度学习架构都无法处理原始形式的字符串或纯文本。 它们需要数字作为输入来执行任何类型的工作,从广义上讲是分类、回归等。

不同类型的词嵌入可以大致分为两类:

基于频率的嵌入

我们在这一类下遇到的向量一般有三类:计数向量、TF-IDF向量、具有固定上下文窗口的共生矩阵。

基于预测的嵌入

我们在这个类别下通常会遇到两种类型的向量:连续的词袋(CBOW)、Skip-Gram。

本文,我们将关注具有固定上下文窗口的共生矩阵。

共生矩阵

矩阵 A 存储单词的共生。在这种方法中,我们计算每个单词在感兴趣的单词周围特定大小的窗口内出现的次数。计算语料库中所有单词的计数。

因此,具有固定窗口大小 1 的合成共现矩阵 A 看起来像:

 NLP   flying   I   like   deep   learning   enjoy   NLP  0.0 0.0 0.0 1.0 0.0 0.0 0.0  flying  0.0 0.0 0.0 0.0 0.0 0.0 1.0  I  0.0 0.0 0.0 2.0 0.0 0.0 1.0  like  1.0 0.0 2.0 0.0 1.0 0.0 0.0  deep  0.0 0.0 0.0 1.0 0.0 1.0 0.0  learning  0.0 0.0 0.0 0.0 1.0 0.0 0.0  enjoy  0.0 1.0 1.0 0.0 0.0 0.0 0.0 \begin{array}{|l|l|l|l|l|l|l|l|}\hline & \text { NLP } & \text { flying } & \text { I } & \text { like } & \text { deep } & \text { learning } & \text { enjoy } \\\hline \text { NLP } & 0.0 & 0.0 & 0.0 & 1.0 & 0.0 & 0.0 & 0.0 \\\hline \text { flying } & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & 1.0 \\\hline \text { I } & 0.0 & 0.0 & 0.0 & 2.0 & 0.0 & 0.0 & 1.0 \\\hline \text { like } & 1.0 & 0.0 & 2.0 & 0.0 & 1.0 & 0.0 & 0.0 \\\hline \text { deep } & 0.0 & 0.0 & 0.0 & 1.0 & 0.0 & 1.0 & 0.0 \\\hline \text { learning } & 0.0 & 0.0 & 0.0 & 0.0 & 1.0 & 0.0 & 0.0 \\\hline \text { enjoy } & 0.0 & 1.0 & 1.0 & 0.0 & 0.0 & 0.0 & 0.0 \\\hline\end{array}  NLP  flying  I  like  deep  learning  enjoy  NLP 0.00.00.01.00.00.00.0 flying 0.00.00.00.00.00.01.0 I 0.00.00.02.00.00.01.0 like 1.00.02.00.01.00.00.0 deep 0.00.00.01.00.01.00.0 learning 0.00.00.00.01.00.00.0 enjoy 0.01.01.00.00.00.00.0

矩阵的奇异值

令 A 为 m * m 矩阵。乘积 Aᵀ A 是一个对称矩阵。

[ ( A t A ) t = A t ⋅ ( A t ) t = A t A ] \left[\left(A^{t} A\right)^{t}=A^{t} \cdot\left(A^{t}\right)^{t}=A^{t} A\right] [(AtA)t=At(At)t=AtA]

因此 Aᵀ A 有 n 个线性独立特征向量 v₁ ,v₂…vₙ 和实特征值 λ₁ , λ₂… λₙ 。

我们知道 Aᵀ A 的特征值也都是非负的。

设 λ 是 Aᵀ A 的特征值,对应特征向量 v。 那么,

λ = λ ∥ v ∥ 2 = λ v t v = v t λ V = V t A t A v = ( A V ) t A V = ∥ A v ∥ ∥ L ⩾ 0 \begin{aligned}\lambda=\lambda\|v\|^{2}=\lambda v^{t} v &=v^{t} \lambda V=V^{t} A^{t} A v \\&=(A V)^{t} A V \\&=\|A v\| \|^{L} \geqslant 0\end{aligned} λ=λv2=λvtv=vtλV=VtAtAv=(AV)tAV=AvL0

标记特征向量 v₁, v₂… vₙ,使得 λ₁ ≥λ₂ ≥… λₙ。令 σᵢ = √λᵢ。因此,σ₁ ≥σ₂ ≥…σₙ ≥0。数 σ₁, σ₂,… σₙ 称为矩阵 A 的奇异值。

奇异值分解 (SVD)

from numpy import array
from scipy.linalg import svd
from numpy import diag
from numpy import dot
# define a matrix
A = array(df)
print('Matrix A is: \n')
print(A)
# SVD
U, s, VT = svd(A)
print('*'*120)
print('Matrix U is: \n')
print(U)
print('*'*120)
Sigma = diag(s)
print('Matrix Sigma is: \n')
print(Sigma)
print('*'*120)
print('Matrix VT is: \n')
print(VT)

共生矩阵 X 应用 SVD

∣ V ∣ [ ∣ V ∣ X ] = ∣ V ∣ [ ∣ ∣ u 1 u 2 ⋯ ∣ ∣ ] ∣ V ∣ [ ∣ V ∣ σ 1 0 ⋯ 0 σ 2 ⋯ ⋮ ⋮ ⋱ ] ∣ V ∣ [ − ∣ V ∣ − v 1 − − v 2 − ⋮ ] |V|\left[\begin{array}{l}|V| \\X\end{array}\right]=|V|\left[\begin{array}{ccc}\mid & \mid & \\u_{1} & u_{2} & \cdots \\\mid & \mid &\end{array}\right]|V|\left[\begin{array}{ccc}|V| & \\\sigma_{1} & 0 & \cdots \\0 & \sigma_{2} & \cdots \\\vdots & \vdots & \ddots\end{array}\right]|V|\left[\begin{array}{ccc}- & |V| & \\- & v_{1} & - \\- & v_{2} & - \\\vdots &\end{array}\right] V[VX]=Vu1u2VVσ100σ2VVv1v2

源代码

详情参阅 - 亚图跨际

你可能感兴趣的:(数据科学,python,矩阵,机器学习)