文章目录

  • FM
    • 基本思想
    • 模型学习
    • FM vs SVM
  • FFM
    • 基本思想
    • 模型学习
    • 双线性FFM(Bilinear-FFM)
    • FFM应用

预估CTR/CVR,业界常用的方法有人工特征工程 + LR(Logistic Regression)、GBDT(Gradient Boosting Decision Tree) + LR,该模型可以 半自动化 地做一些特征组合。FM(Factorization Machine)它可以 全自动化 地做特征组合。FFM(Field-aware Factorization Machine)模型。所有的 CTR 模型,它的核心就是特征组合,是怎么解决特征组合的问题,它的发展路径就按照这个方向发展。本文先介绍FM,然后介绍FM的改进FFM。

FM

基本思想

FM(Factorization Machine)的提出主要是为了解决稀疏数据下的特征组合问题

下面我们通过一个例子来说明FM模型,根据用户的基本属性,预测用户是否点击了广告,有下面这样的数据(经过One-Hot编码):

age city=Beijing city=Shanghai city=Shengzheng sex=man sex=woman label
user_1 20 1 0 0 0 1 1
user_2 25 0 0 0 1 0 0

由上表的数据可以看出,经过One-Hot编码之后的特征是比较稀疏的。城市和性别特征一共5维,但只有两个维度有非零值。在实际应用中CTR/CVR预测时,用户的性别、职业、教育水平、品类偏好,商品的品类等,经过One-Hot编码转换后都会导致样本数据的稀疏性。特别是商品品类这种类型的特征,如商品的末级品类约有550个,采用One-Hot编码生成550个数值特征,但每个样本的这550个特征,有且仅有一个是有效的(非零),这也说明了One-Hot编码的另一个特点就是导致特征空间大

假设我们用最简单的线性拟合来预测y值:
y ^ = w 0 + ∑ i = 1 n w i x i \hat{y}=w_0+\sum_{i=1}^n{w_ix_i} y^=w0+i=1nwixi
上述这个模型的不足之处在于没有考虑到“北京的男性用户”、“上海的女性用户”这种组合特征可能是有用的,即 x i , x j x_i,x_j xi,xj,( x i , x j x_i,x_j xi,xj都是one-hot特征)同时为1时可能是一个很有用的特征,这种组合特征是 x i , x j x_i,x_j xi,xj和的线性组合所无法表示的。所以,我们必须在模型中引入 x i , x j x_i,x_j xi,xj的组合特征。直接将二者的乘积 x i x j x_ix_j xixj作为一个新的特征,即 x i x_i xix j x_j xj 都非零时,组合特征 x i , x j x_i,x_j xi,xj才有意义。

这种关联特征与label的正向相关性在实际问题中是普遍存在的,如“化妆品”类商品与“女”性,“球类运动配件”的商品与“男”性,“电影票”的商品与“电影”品类偏好等。因此,引入两个特征的组合是非常有意义的。同样道理我们组合任意三个特征、四个特征,随着阶数的提高,样本会显得非常稀疏,而且额外引入的参数呈指数增长。

所以新的模型长这样:
y ^ = w 0 + ∑ i = 1 n w i x i + ∑ i n ∑ j = i + 1 n w i j x i x j \hat{y}=w_0+\sum_{i=1}^n{w_ix_i}+\sum_i^n{\sum_{j=i+1}^n{w_{ij}x_ix_j}} y^=w0+i=1nwixi+inj=i+1nwijxixj
注:我们穷举所有的i,j组合,若某些 x i , x j x_i,x_j xi,xj的组合不是有用特征,经过大量样本的训练,模型会把那些无用的特征的系数训练为0。

从上式可以看出组合特征的参数一共有 n ( n − 1 ) 2 \frac{n(n-1)}{2} 2n(n1)个,任意两个参数都是独立的,训练每个参数 w i j w_{ij} wij 需要大量的 x i 、 x j x_i、x_j xixj都不为0的样本,如果训练样本不足,容易导致 w i j w_{ij} wij不准确。

我们要在 w i j w_{ij} wij上做文章,将其表示成另外的形式,对每个特征分量 x i x_i xi,引入辅助量:
v i = ( v i 1 , v i 2 , … , v i k ) T \mathbf v_i = (v_{i1},v_{i2},\ldots,v_{ik})^T vi=(vi1,vi2,,vik)T
辅助量的长度为 k k k(k<<n),包含 k 个描述特征的因子。

w i j w_{ij} wij改写为:
w ^ i j = v i T v j = ∑ l = 1 k v i l v j l \hat w_{ij} = \mathbf v_i^T\mathbf v_j = \sum_{l=1}^k v_{il}v_{jl} w^ij=viTvj=l=1kvilvjl

因此,FM的模型方程为:
y ^ = w 0 + ∑ i = 1 n w i x i + ∑ i n ∑ j = i + 1 n < v i , v j > x i x j < v i , v j > = ∑ f = 1 k v i f v j f \hat{y}=w_0+\sum_{i=1}^n{w_ix_i}+\sum_i^n{\sum_{j=i+1}^n{<v_i,v_j>x_ix_j}}\\ <v_i,v_j>=\sum_{f=1}^k{v_{if}v_{jf}} y^=w0+i=1nwixi+inj=i+1n<vi,vj>xixj<vi,vj>=f=1kvifvjf
根据 x x x计算 y ^ \hat y y^的时间复杂度是:
{ n + ( n − 1 ) } + { n ( n − 1 ) 2 [ k + ( k − 1 ) + 2 ] + n ( n − 1 ) 2 − 1 } + 2 = O ( k n 2 ) \{n+(n-1)\} + \{\frac{n(n-1)}{2}[k+(k-1)+2] + \frac{n(n-1)}{2} -1\}+2=O(kn^2) {n+(n1)}+{2n(n1)[k+(k1)+2]+2n(n1)1}+2=O(kn2)
第一个花括号对应 ∑ i = 1 n w i x i \sum_{i=1}^n w_ix_i i=1nwixi的加法和乘法操作数,第二个花括号对应 ∑ i n ∑ j = i + 1 n < v i , v j > x i x j \sum_i^n{\sum_{j=i+1}^n{<v_i,v_j>x_ix_j}} inj=i+1n<vi,vj>xixj的加法乘法。

所有二次项参数 w i j w_{ij} wij 可以组成一个对称阵 W \mathbf W W(对角元素可以设置为正实数)。这个矩阵可以分解为 W = V T V \mathbf{W} = \mathbf{V}^T \mathbf{V} W=VTV,这里的 V \mathbf{V} V是由上面的辅助量 v i \mathbf v_i vi组成的矩阵。这样模型的参数就变成了 V \mathbf{V} V二次项的参数数量减少为 k n kn kn,其中 k k k是辅助量的长度, n n n是特征的个数。远少于多项式模型的参数数量。

参数因子化使得 x h x i x_h x_i xhxi的参数和 x j x i x_j x_i xjxi的参数不再是相互独立的,因此我们可以在样本稀疏的情况下相对合理地估计FM的二次项参数,具体来说, x h x i x_hx_i xhxix i , x j x_i,x_j xi,xj的系数分别为 ⟨ v h , v i ⟩ ⟨vh,vi⟩ vh,vi⟨ v i , v j ⟩ ⟨vi,vj⟩ vi,vj,它们之间有共同项 v i v_i vi。也就是说,所有包含“ v i v_i vi的非零组合特征”(存在某个 j ≠ i j≠i j=i,使得 x i x j ≠ 0 xixj≠0 xixj=0)的样本都可以用来学习隐向量 v i v_i vi,这很大程度上避免了数据稀疏性造成的影响。

又因为:
∑ i = 1 n ∑ j = i + 1 n < v i , v j > x i x j = 1 2 ( ∑ f = 1 k ( ∑ i = 1 n v i f x i ) ( ∑ j = 1 n v j f x j ) − ∑ i = 1 n ∑ f = 1 k v i f v i f x i x i ) = 1 2 ∑ f = 1 k ( ( ∑ i = 1 n v i f x i ) ( ∑ j = 1 n v j f x j ) − ∑ i = 1 n v i f 2 x i 2 ) = 1 2 ∑ f = 1 k ( ( ∑ i = 1 n v i f x i ) 2 − ∑ i = 1 n v i f 2 x i 2 ) \sum_{i=1}^n{\sum_{j=i+1}^n{<v_i,v_j>x_ix_j}}\\ = \frac{1}{2}\left(\sum_{f=1}^k{\left(\sum_{i=1}^n{v_{if}x_i}\right)\left(\sum_{j=1}^n{v_{jf}x_j}\right)}-\sum_{i=1}^n{\sum_{f=1}^k{v_{if}v_{if}x_ix_i}}\right)\\ = \frac{1}{2}\sum_{f=1}^k\left(\left(\sum_{i=1}^n{v_{if}x_i}\right)\left(\sum_{j=1}^n{v_{jf}x_j}\right)-\sum_{i=1}^n{v_{if}^2x_i^2}\right)\\ = \frac{1}{2}\sum_{f=1}^k\left(\left(\sum_{i=1}^n{v_{if}x_i}\right)^2-\sum_{i=1}^n{v_{if}^2x_i^2}\right) i=1nj=i+1n<vi,vj>xixj=21f=1k(i=1nvifxi)(j=1nvjfxj)i=1nf=1kvifvifxixi=21f=1k((i=1nvifxi)(j=1nvjfxj)i=1nvif2xi2)=21f=1k(i=1nvifxi)2i=1nvif2xi2

注:上式右边展开可得到左边,原理是配方法。

这样根据 x x x计算 y ^ \hat y y^的时间复杂度是
k { [ n + ( n − 1 ) + 1 ] + [ 3 n + ( n − 1 ) + 1 ] } + ( k − 1 ) + 1 = O ( k n ) k\{[n+(n-1)+1]+[3n+(n-1)+1]\}+(k-1)+1=O(kn) k{[n+(n1)+1]+[3n+(n1)+1]}+(k1)+1=O(kn)

模型学习

引入二次项的FM模型,可以采用不同的损失函数用于解决回归、二元分类等问题,比如可以采用MSE(Mean Square Error)损失函数来求解回归问题,也可以采用Hinge/Cross-Entropy损失来求解分类问题。然后利用随机梯度下降学习模型。

(1)回归问题loss取最小平方误差
l o s s R ( y ^ , y ) = ( y ^ − y ) 2 loss^R(\hat y,y) = (\hat y - y)^2 lossR(y^,y)=(y^y)2
所以:
∂ l o s s R ( y ^ , y ) ∂ θ = 2 ( y ^ − y ) ∂ y ^ ∂ θ \frac{\partial loss^R(\hat y,y)}{\partial \theta} = 2 (\hat y - y)\frac{\partial \hat y }{\partial\theta} θlossR(y^,y)=2(y^y)θy^

(2)二分类问题loss取logit函数
l o s s C ( y ^ , y ) = − ln ⁡ σ ( y ^ y ) loss^C(\hat y ,y) = -\ln \sigma(\hat y y) lossC(y^,y)=lnσ(y^y)
所以:
∂ l o s s C ( y ^ , y ) ∂ θ = [ ( σ ( y ^ y ) − 1 ] y ∂ y ^ ∂ θ \frac{\partial loss^C(\hat y,y)}{\partial \theta} = [(\sigma(\hat y y) - 1]y \frac{\partial \hat y }{\partial\theta} θlossC(y^,y)=[(σ(y^y)1]yθy^

其中:
∂ ∂ θ y ^ ( x ) = { 1 , if θ is w 0 x i , if θ is w i x i ∑ j = 1 n v j , f x j − v i , f x i 2 , if θ is v i , f \frac{\partial}{\partial\theta} \hat y (\mathbf{x}) = \left\{\begin{array}{ll} 1, & \text{if}\; \theta\; \text{is}\; w_0 \\ \ x_i, & \text{if}\; \theta\; \text{is}\; w_i \\ \ x_i \sum_{j=1}^n v_{j, f} x_j - v_{i, f} x_i^2, & \text{if}\; \theta\; \text{is}\; v_{i, f} \end{array}\right. θy^(x)=1,xi,xij=1nvj,fxjvi,fxi2,ifθisw0ifθiswiifθisvi,f

为了避免过拟合,也引入正则化。所以,FM的最优化问题就变成了:
θ ∗ = arg ⁡ min ⁡ θ ∑ i = 1 N ( l o s s ( y ^ ( x i ) , y i ) + ∑ λ θ θ 2 ) \theta ^* = \mathop{\arg\min}_{\theta} \sum_{i=1}^N\left(loss(\hat y(x_i) ,y_i)+ \sum \lambda_\theta \theta^2\right) θ=argminθi=1N(loss(y^(xi),yi)+λθθ2)
注: λ θ \lambda_\theta λθ是正则化系数。

FM vs SVM

(1)SVM的二元特征交叉参数是独立的,而FM的二元特征交叉参数是两个k维的向量 v i 、 v j v_i、v_j vivj,交叉参数就不是独立的,而是相互影响的。

(2)FM可以在原始形式下进行优化学习,而基于kernel的非线性SVM通常需要在对偶形式下进行

(3)FM的模型预测是与训练样本独立,而SVM则与部分训练样本有关,即支持向量

FFM

基本思想

FFM(Field-aware Factorization Machine)是FM的升级版模型,通过引入field的概念,FFM把相同性质的特征归于同一个field。以上面的广告分类为例,“sex=man”、“sex = woman”这两个特征都是代表性别的,可以放到同一个field中。即同一个categorical特征经过One-Hot编码生成的数值特征都可以放到同一个field,包括用户性别、职业、品类偏好等。在FFM中,每一维特征 x i x_i xi,针对其它特征的每一种 f i e l d f i field \quad f_i fieldfi,都会学习一个隐向量 v i , f j v_{i,f_j} vi,fj。因此,隐向量不仅与特征相关,也与field相关。也就是说,“sex=man”这个特征与“city”特征和“age”特征进行关联的时候使用不同的隐向量,这与“city”和“age”的内在差异相符,也是FFM中“field-aware”的由来。

假设样本的 n n n 个特征属于 f f f 个field,那么FFM的二次项有 n f nf nf个隐向量。而在FM模型中,每一维特征的隐向量只有一个,二次项有n个隐向量。FM可以看作FFM的特例,是把所有特征都归属到一个field时的FFM模型。根据FFM的field敏感特性,可以导出其模型方程:
y ( x ) = w 0 + ∑ i = 1 n w i x i + ∑ i = 1 n ∑ j = i + 1 n ⟨ v i , f j , v j , f i ⟩ x i x j y(\mathbf{x}) = w_0 + \sum_{i=1}^n w_i x_i + \sum_{i=1}^n \sum_{j=i+1}^n \langle \mathbf{v}_{i, f_j}, \mathbf{v}_{j, f_i} \rangle x_i x_j y(x)=w0+i=1nwixi+i=1nj=i+1nvi,fj,vj,fixixj
下面通过例子说明FFM:

user movie Genre Price
user_1 3Idiots Comedy, Drama 9.99

这条记录可以编码成5个特征,其中“Genre=Comedy”和“Genre=Drama”属于同一个field,“Price”是数值型,不用One-Hot编码转换。为了方便说明FFM的样本格式,我们将所有的特征和对应的field映射成整数编号。

Field name Field index Feature name Feature index
User 1 User=YuChin 1
Movie 2 Movie=3Idiots 2
Genre 3 Genre=Comedy 3
Genre 3 Genre=Drama 4
Price 4 Price 5

那么,FFM的组合特征有10项:
⟨ v 1 , 2 , v 2 , 1 ⟩ ⋅ 1 ⋅ 1 + ⟨ v 1 , 3 , v 3 , 1 ⟩ ⋅ 1 ⋅ 1 + ⟨ v 1 , 3 , v 4 , 1 ⟩ ⋅ 1 ⋅ 1 + ⟨ v 1 , 4 , v 5 , 1 ⟩ ⋅ 1 ⋅ 9.99 + ⟨ v 2 , 3 , v 3 , 2 ⟩ ⋅ 1 ⋅ 1 + ⟨ v 2 , 3 , v 4 , 2 ⟩ ⋅ 1 ⋅ 1 + ⟨ v 2 , 4 , v 5 , 2 ⟩ ⋅ 1 ⋅ 9.99 + ⟨ v 3 , 3 , v 4 , 3 ⟩ ⋅ 1 ⋅ 1 + ⟨ v 3 , 4 , v 5 , 3 ⟩ ⋅ 1 ⋅ 9.99 + ⟨ v 4 , 4 , v 5 , 3 ⟩ ⋅ 1 ⋅ 9.99 \langle \mathbf{v}_{{\color{blue}1}, {\color{red}2}}, \mathbf{v}_{{\color{blue}2}, {\color{red}1}} \rangle \cdot {\color{green}1} \cdot {\color{green}1} + \langle \mathbf{v}_{{\color{blue}1}, {\color{red}3}}, \mathbf{v}_{{\color{blue}3}, {\color{red}1}} \rangle \cdot {\color{green}1} \cdot {\color{green}1} + \langle \mathbf{v}_{{\color{blue}1}, {\color{red}3}}, \mathbf{v}_{{\color{blue}4}, {\color{red}1}} \rangle \cdot {\color{green}1} \cdot {\color{green}1} + \langle \mathbf{v}_{{\color{blue}1}, {\color{red}4}}, \mathbf{v}_{{\color{blue}5}, {\color{red}1}} \rangle \cdot {\color{green}1} \cdot {\color{green}{9.99}} \ {} \\+ \langle \mathbf{v}_{{\color{blue}2}, {\color{red}3}}, \mathbf{v}_{{\color{blue}3}, {\color{red}2}} \rangle \cdot {\color{green}1} \cdot {\color{green}1} + \langle \mathbf{v}_{{\color{blue}2}, {\color{red}3}}, \mathbf{v}_{{\color{blue}4}, {\color{red}2}} \rangle \cdot {\color{green}1} \cdot {\color{green}1} + \langle \mathbf{v}_{{\color{blue}2}, {\color{red}4}}, \mathbf{v}_{{\color{blue}5}, {\color{red}2}} \rangle \cdot {\color{green}1} \cdot {\color{green}{9.99}} \ {} + \langle \mathbf{v}_{{\color{blue}3}, {\color{red}3}}, \mathbf{v}_{{\color{blue}4}, {\color{red}3}} \rangle \cdot {\color{green}1} \cdot {\color{green}1} \\+ \langle \mathbf{v}_{{\color{blue}3}, {\color{red}4}}, \mathbf{v}_{{\color{blue}5}, {\color{red}3}} \rangle \cdot {\color{green}1} \cdot {\color{green}{9.99}} \ {} + \langle \mathbf{v}_{{\color{blue}4}, {\color{red}4}}, \mathbf{v}_{{\color{blue}5}, {\color{red}3}} \rangle \cdot {\color{green}1} \cdot {\color{green}{9.99}} v1,2,v2,111+v1,3,v3,111+v1,3,v4,111+v1,4,v5,119.99+v2,3,v3,211+v2,3,v4,211+v2,4,v5,219.99+v3,3,v4,311+v3,4,v5,319.99+v4,4,v5,319.99

其中,红色是field编号,蓝色是特征编号,绿色是此样本的特征取值。二次项的系数是通过与特征field相关的隐向量点积得到的,二次项参数共有 k n f knf knf 个( f f f是特征filds个数),相比FM参数扩大了F倍。

模型学习

FFM省略了常数项和一次项,模型方程如下:
ϕ ( w , x ) = ∑ j 1 , j 2 ∈ C 2 ⟨ w j 1 , f 2 , w j 2 , f 1 ⟩ x j 1 x j 2 \phi(\mathbf{w}, \mathbf{x}) = \sum_{j_1, j_2 \in \mathcal{C}_2} \langle \mathbf{w}_{j_1, f_2}, \mathbf{w}_{j_2, f_1} \rangle x_{j_1} x_{j_2} ϕ(w,x)=j1,j2C2wj1,f2,wj2,f1xj1xj2
其中, C 2 \mathcal C_2 C2是非零特征的二元组合, j 1 j_1 j1 是特征,属于field f 1 f_1 f1w j 1 , f 2 w_{j_1,f_2} wj1,f2 是特征 j 1 j_1 j1对field f 2 f_2 f2的隐向量。此FFM模型采用logistic loss作为损失函数,和L2惩罚项,因此只能用于二元分类问题。
min ⁡ w ∑ i = 1 L log ⁡ ( 1 + exp ⁡ { − y i ϕ ( w , x i ) } ) + λ 2 ∥ w ∥ 2 \min_{\mathbf{w}} \sum_{i=1}^L \log \big( 1 + \exp\{ -y_i \phi (\mathbf{w}, \mathbf{x}_i ) \} \big) + \frac{\lambda}{2} \| \mathbf{w} \|^2 wmini=1Llog(1+exp{yiϕ(w,xi)})+2λw2
其中, y i ∈ − 1 , 1 y_i∈{−1,1} yi1,1 是第 i 个样本的label,L 是训练样本数量,λ 是惩罚项系数。

接着通过梯度下降法训练得到最优参数。

在训练FFM的过程中,有许多小细节值得特别关注。

第一,样本归一化。

第二,特征归一化。

第三,省略零值特征。

双线性FFM(Bilinear-FFM)

双线性 FFM 主要是为了解决FFM参数增加的问题。核心思想是通过共享参数从而减少参数数量。基本思路如下图:

从上图可知: v i , v j v_i,v_j vi,vj还是跟 FM 一样,还是用一个 vector 来表达,但是把两个交互的复杂特性放在大家共享参数里面去学,这就是双线性 FFM 的核心思想。如何共享参数W,又分为三种情况:

(1)共享同一个 W W W ,这是参数量最小的一种形式。 W W W的参数量是 k × k k\times k k×kk k k是特征Embedding的size;

(2)每个field共享一个 W W W ,即每个field各自学各自的 W W W

(3)每两个fields对共享一个 W W W ,能更加细化地描述特征组合;

下图展示了FFM和双线性FFM模型的参数变化情况:

FFM应用

CTR和CVR预估模型采用的特征大同小异,主要分三类:

用户相关的特征
年龄、性别、职业、兴趣、品类偏好、浏览/购买品类等基本信息,以及用户近期点击量/购买量/消费额等统计信息

商品相关的特征
商品所属品类、销量、价格、评分、历史CTR/CVR等信息

用户-商品匹配特征
浏览/购买品类匹配、浏览/购买商家匹配、兴趣偏好匹配等

为了使用FFM方法,所有的特征必须转换成“field_id:feat_id:value”格式,field_id代表特征所属field的编号,feat_id是特征编号,value是特征的值。数值型的特征比较容易处理,只需分配单独的field编号,如用户评论得分、商品的历史CTR/CVR等。categorical特征需要经过One-Hot编码成数值型,编码产生的所有特征同属于一个field,而特征的值只能是0或1,如用户的性别、年龄段,商品的品类id等。除此之外,还有第三类特征,如用户浏览/购买品类,有多个品类id且用一个数值衡量用户浏览或购买每个品类商品的数量。这类特征按照categorical特征处理,不同的只是特征的值不是0或1,而是代表用户浏览或购买数量的数值。按前述方法得到field_id之后,再对转换后特征顺序编号,得到feat_id,特征的值也可以按照之前的方法获得。

参考文章:

FM在特征组合中的应用

深入FFM原理与实践

分解机(Factorization Machines)推荐算法原理

从FFM到DeepFFM,推荐排序模型到底哪家强?

FM系列—FM+FFM详解相关推荐

  1. Material Design系列之BottomNavigationView详解

    Material Design系列之BottomNavigationView详解 Material Design官方文档Bottom navigation的介绍 BottomNavigationVie ...

  2. Docker系列07—Dockerfile 详解

    Docker系列07-Dockerfile 详解 1.认识Dockerfile 1.1 镜像的生成途径 基于容器制作  dockerfile,docker build 基于容器制作镜像,已经在上篇Do ...

  3. mongo 3.4分片集群系列之六:详解配置数据库

    这个系列大致想跟大家分享以下篇章: 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mongo 3.4分片集群系列之三:搭建 ...

  4. ftm模块linux驱动,飞思卡尔k系列_ftm模块详解.doc

    飞思卡尔k系列_ftm模块详解 1.5FTM模块1.5.1 FTM模块简介FTM模块是一个多功能定时器模块,主要功能有,PWM输出.输入捕捉.输出比较.定时中断.脉冲加减计数.脉冲周期脉宽测量.在K1 ...

  5. React Native按钮详解|Touchable系列组件使用详解

    转载自:http://www.devio.org/2017/01/10/React-Native按钮详解-Touchable系列组件使用详解/ 在做App开发过程中离不了的需要用户交互,说到交互,我们 ...

  6. React 源码系列 | React Context 详解

    目前来看 Context 是一个非常强大但是很多时候不会直接使用的 api.大多数项目不会直接使用 createContext 然后向下面传递数据,而是采用第三方库(react-redux). 想想项 ...

  7. Landsat系列数据级别详解

    Landsat系列数据级别详解 转载自此文:https://www.cnblogs.com/icydengyw/p/12056211.html 一.Landsat Collection 1 Lands ...

  8. 小猫爪:i.MX RT1050学习笔记26-RT1xxx系列的FlexCAN详解

    i.MX RT1050学习笔记26-RT1xxx系列的FlexCAN详解 1 前言 2 FlexCAN简介 2.1 MB(邮箱)系统 2.1.1 正常模式下 2.1.2 激活了CAN FD情况下 2. ...

  9. CISCO X8系列AP升级详解

    X8系列AP升级详解 准备工作 1.将AP连接到可获取IP地址的设备:交换机.家用路由或者猫等 2.用终端通过CONSOLE线连接AP,默认用户名为:cisco 密码为:Cisco 3.在AP获取到地 ...

  10. [C++ 系列] 90. 超详解C++思维导图

    这段时间针对 C++ 的学习到了一个收尾的阶段.目前所涉及到了 C++ 基础语法.大小知识点的学习.当然语言学习绝对离不开实战项目的练手,网络优质资源以及各类经典丛书也是 C++ 学习的巨大宝库.在此 ...

最新文章

  1. phplivechat安卓app下载_PHP在线网页客服系统PHP Live Chat中文版下载
  2. MongoDb Windows linux平台环境及主流编程语言驱动安装同时配置mongoDb的远程连接
  3. 怎么DIY一个粒子检测器
  4. Python中使用Flask、MongoDB搭建简易图片服务器
  5. HTML选择器属于jq的选择器吗,JQuery 选择器
  6. HBase——强一致性详解
  7. python3.6网络爬虫_python3.6网络爬虫
  8. 32muduo_net库源码分析(八)
  9. 淘宝推荐系统简介分享总结
  10. bat 设置变量带中文
  11. Java开源框架 iBase4J 搭建笔记
  12. 2019年数据库系统工程师上午真题及答案解析
  13. 保障系统迁移服务器搬迁,整体中心机房搬迁服务器idc数据迁移方案应用场景
  14. 终于知道为啥网页不让我复制粘贴了!
  15. Barsetto百胜图全自动美式磨豆咖啡机测评
  16. Hadoop伪分布和全分布部署指南
  17. 信息系统项目管理师核心考点(十九)制定项目章程依据(输入)
  18. python serial.write_PySerial write()即时时间
  19. python全国计算机等级考试_Python二级教程(全国计算机等级考试)
  20. Elastic search常用分词 和 多字段搜索优化

热门文章

  1. Java对txt文件、二进制文件的基本读写
  2. 宁波栎社机场停车场怎么收费,栎社机场停车场收费标准
  3. 查看网站黑链的几种方法
  4. 在小公司如何做一个合格的项目经理
  5. 三、12.13.14.15.编写三角形类Triangle
  6. PAT A1091 Acute Stroke ——帘卷西风,人比黄花瘦
  7. Uipath Studio流程设计器介绍
  8. 开发应用程序的Andr​​oid - 入门
  9. 电赛-DDS-AD9959
  10. WINDOWS下SIP拨号的实现