Word2Vec简明教程

  • 1. 特征向量
  • 2. 词向量
    • 2.1 例1:King- Man + Woman = Queen
    • 2.2 例2:跨语言同义词共现
  • 3. NNLM
  • 4. Word2Vec
    • 4.1 SkipGram
      • (1)基本概念
      • (2)数据模型
    • 4.2 CBoW
    • 4.3 Negative Sampling
    • 4.4 Hierarchical Softmax
  • 5. 使用gensim

1. 特征向量

近年来,研究者通过词汇学方法,发现约有五种特质可以涵盖人格描述的所有方面,提出了人格的大五模式(Big Five),俗称人格的海洋(OCEAN),包括以下五个维度:

  • 开放性(Openness):具有想象、审美、情感丰富、求异、创造、智能等特质。
  • 责任心(Conscientiousness):显示胜任、公正、条理、尽职、成就、自律、谨慎、克制等特点。
  • 外倾性(Extroversion):表现出热情、社交、果断、活跃、冒险、乐观等特质。
  • 宜人性(Agreeableness):具有信任、利他、直率、依从、谦虚、移情等特质。
  • 神经质性(Neuroticism):难以平衡焦虑、敌对、压抑、自我意识、冲动、脆弱等情绪的特质,即不具有保持情绪稳定的能力。

通过NEO-PI-R测试可以得出每个维度的打分(1-100),然后将其缩放到[−1,1][-1,1][1,1]之间:

利用余弦相似度可以计算两个人的性格相似度,如图,向量a=[x1,y1],b=[x2,y2]\boldsymbol a=[x_1,y_1],\boldsymbol b =[x_2,y_2]a=[x1,y1],b=[x2,y2]

则,sim(a,b)=cosθ=ab∣a∣∣b∣=x1x2+y1y2x12+y12x22+y22sim(a,b) = cos \theta = \frac {ab}{\mid a \mid \mid b \mid} = \frac {x_1x_2+y_1y_2}{\sqrt{x_1^2+y_1^2}\sqrt{x_2^2+y_2^2}}sim(a,b)=cosθ=abab=x12+y12

x22+y22

x1x2+y1y2
对于nnn维向量A=[a1,a2,...an],B=[b1,b2,...bn]A=[a_1,a_2,...a_n],B=[b_1,b_2,...b_n]A=[a1,a2,...an],B=[b1,b2,...bn]
sim(A,B)=AB∣A∣∣B∣=∑i=1nAiBi∑i=1nAi2∑i=1nAi2sim(A,B) = \frac {AB}{\mid A \mid \mid B \mid}= \frac {\sum_{i=1}^{n}{A_iB_i}}{\sqrt{\sum_{i=1}^{n}{A_i^2}}\sqrt{\sum_{i=1}^{n}{A_i^2}}}sim(A,B)=ABAB=i=1nAi2

i=1nAi2

i=1nAiBi

余弦相似度的取值范围在-1到1之间。余弦值越接近1,也就是两个向量越相似,完全相同时数值为1;相反反向时为-1;正交或不相关是为0。

np.linalg.norm 操作是求向量的范式,默认是L2范式,等同于求向量的欧式距离。

import numpy as np
jay = np.array([-0.4,0.8,0.5,-0.2,0.3])
p1  = np.array([-0.3,0.2,0.3,-0.4,0.9])
p2  = np.array([-0.5,0.4,-0.2,0.7,-0.1])def cos_sim(a, b):a_norm = np.linalg.norm(a)b_norm = np.linalg.norm(b)cos = np.dot(a,b)/(a_norm * b_norm)return cosprint(cos_sim(jay,p1),cos_sim(jay,p2))

输出如下:

0.6582337075311759 0.23612240736068565

可见前两者较为相似。

余弦相似度也常用在文本相似度、图片相似度等应用中,比如金融类新以下词出现的频率高:“股票、债券、黄金、期货、基金、上涨、下跌”,而先这些词出现相对较少:“宇宙、太空、星系、恒星、大气层”。每一篇文章也都有相应的特征,由其主题决定,最简单的可以用其TF-IDF值来表示。

2. 词向量

对于每个人可以抽取特征形成一组向量,对于每个词汇同样可以将其转换为一组向量,并计算相互之间的关系。1986年,Hinton在《Learning Distribution Representation of Concepts》中最早提出使用向量来表示词。

对于词典D\mathcal DD中的任意词www,通过一个固定长度的向量v(w)∈Rm\rm v(w) \in \mathcal R^mv(w)Rm来表示,则v(w)\rm v(w)v(w)就称为www的词向量。

2.1 例1:King- Man + Woman = Queen

如,单词King的词向量(通过维基百科语料训练的Glove向量)如下:

[ 0.50451 , 0.68607 , -0.59517 , -0.022801, 0.60046 , -0.13498 , -0.08813 , 0.47377 , -0.61798 , -0.31012 , -0.076666, 1.493 ,
-0.034189, -0.98173 , 0.68229 , 0.81722 , -0.51874 , -0.31503 , -0.55809 , 0.66421 , 0.1961 , -0.13495 , -0.11476 , -0.30344 ,
0.41177 , -2.223 , -1.0756 , -1.0783 , -0.34354 , 0.33505 , 1.9927 , -0.04234 , -0.64319 , 0.71125 , 0.49159 , 0.16754 , 0.34344
, -0.25663 , -0.8523 , 0.1661 , 0.40102 , 1.1685 , -1.0137 , -0.21585 , -0.15155 , 0.78321 , -0.91241 , -1.6106 , -0.64426 , -0.51042 ]

根据值对单元格进行颜色编码(接近2则为红色,接近0则为白色,接近-2则为蓝色):

将“king”与其它单词进行比较:

可以看出:

  • 所有这些单词都有一条直的红色列,它们在这个维度上是相似的(名词属性)
  • “woman”和“girl”在很多地方是相似的,“man”和“boy”也是一样(Gender)
  • “boy”和“girl”也有彼此相似的地方,但这些地方却与“woman”或“man”不同。(Age)
  • “king”和“queen”彼此之间相似,但它们与其它单词都不同。(Royalty)
  • 除了最后一个单词“water”,所有单词都是代表人,可以看到蓝色列一直向下并在 “water”的词嵌入之前停下了,显示出类别之间的差异。

词嵌入最经典的例子就是King⃗−Man⃗+Woman⃗≈Queen⃗\vec {King} - \vec {Man} + \vec {Woman} \approx \vec {Queen}King

Man

+
Woman

Queen


2.2 例2:跨语言同义词共现

以下为谷歌Mikolov等人在《Exploiting Similarities among Languages for Machine Translation》提及的一个著名的跨语言同义词共现的案例。该例子通过语义映射技术,实现了机器翻译。通过为两种语言构建不同的语言空间,并在两个空间上建立映射关系。

在向量空间内,不同的语言享有许多共性,只要实现一个向量空间向另一个向量空间的映射和转换,即可实现语言翻译。该技术对英语和西班牙语间的翻译准确率高达90%90\%90%

如对于英语和西班牙语,训练得到对应的词向量空间E(nglish)和S(panish)。

  • 从英语中抽取五个词“one,two,three,four,five”,通过PCA降维,得到对应的二维向量Vone,Vtwo,Vthree,Vfour,VfiveV_{one},V_{two},V_{three},V_{four},V_{five}Vone,Vtwo,Vthree,Vfour,Vfive
  • 从西班牙语中抽取对应的五个词“uno,dos,tres,cuatro,cinoco”,通过PCA降维,得到对应的二维向量Vuno,Vdos,Vtres,Vcuatro,VcinocoV_{uno},V_{dos},V_{tres},V_{cuatro},V_{cinoco}Vuno,Vdos,Vtres,Vcuatro,Vcinoco

可以看出,5个词在两个向量空间中的相对位置差不多,说明两种不同语言对应向量空间的结构之间具有相似性,进一步说明了在词向量空间中利用距离刻画词与词之间相似度的合理性。

此外,对于句子、文档也可以用句子向量及文档向量来表示。

3. NNLM

为了得到每个词的词向量,需要根据大量语料进行训练。2003年,Bengio等人在《A neural probabilistic language model》提出了用神经网络建立统计语言模型的框架(NNLM,Neural Network Language Model),并首次提出了word embedding的概念(虽然没有叫这个名字),奠定了包括word2vec等后续研究word representation learning的基础。

NNLM模型的基本思想可以概括如下:

  • 假定词表中的每一个word都对应着一个连续的特征向量;
  • 假定一个连续平滑的概率模型,输入一段词向量的序列,可以输出这段序列的联合概率;
  • 同时学习词向量的权重和概率模型里的参数。
    值得注意的一点是,这里的词向量也是要学习的参数。

该论文采用前向反馈神经网络来拟合一个词序列的条件概率p(wt∣w1,w2,...,wt−1)p(w_t|w_1,w_2,...,w_{t-1})p(wtw1,w2,...,wt1),如下图所示:

该模型分成两部:

  • 线性的Embedding层:输入为N−1N−1N1个one-hot词向量,通过一个共享的D×VD \times VD×V的矩阵CCC,映射为N−1N−1N1个分布式的词向量(distributed vector)。其中,VVV是词典的大小,DDD是Embedding向量的维度(一个先验参数)。CCC矩阵里存储了要学习的word vector。

  • 前向反馈神经网络:由一个tanh隐层和一个softmax输出层组成。通过将Embedding层输出的N−1N−1N1个词向量映射为一个长度为VVV的概率分布向量,从而对词典中的word在输入context下的条件概率做出预估:

p(wi∣w1,w2,...,wt−1)≈f(wi,wt−1,...,wt−n+1)=g(wi,C(wt−n+1),...,C(wt−1))p(w_i|w_1,w_2,...,w_{t-1}) \approx f(w_i, w_{t-1}, ..., w_{t-n+1}) = g(w_i, C(w_{t-n+1}), ..., C(w_{t-1}))p(wiw1,w2,...,wt1)f(wi,wt1,...,wtn+1)=g(wi,C(wtn+1),...,C(wt1))

通过最小化cross-entropy的正则化损失函数来调整模型参数:L(θ)=1T∑tlog⁡f(wt,wt−1,...,wt−n+1)+R(θ)L(\theta)=\frac{1}{T}\sum_t{\log{f(w_t, w_{t-1}, ..., w_{t-n+1})}}+R(\theta)L(θ)=T1tlogf(wt,wt1,...,wtn+1)+R(θ)

模型参数θ\thetaθ包括了Embedding层矩阵C的元素和前向反馈神经网络模型的权重wt,wt−1,...,wt−n+1w_t, w_{t-1}, ..., w_{t-n+1}wt,wt1,...,wtn+1

该模型同时解决了两个问题:

  • 统计语言模型里关注的条件概率p(wt∣context)p(w_t|context)p(wtcontext)的计算
  • 向量空间模型里关注的词向量的表达

这两个问题本质上并不独立。通过引入连续的词向量和平滑的概率模型,可以在一个连续空间里对序列概率进行建模,从根本上缓解数据稀疏性和维度灾难的问题;而且以条件概率p(wt|context)为学习目标去更新词向量的权重,具有更强的导向性,同时也与VSM里的Distributional Hypothesis不谋而合。

缺点:

  • 只能处理定长的序列
  • 训练速度太慢

4. Word2Vec

2013年,Google团队发表了word2vec工具(参见Mikolov等人发表的《Distributed Representations of Sentences and Documents》、《Efficient estimation of word representations in vector space》等论文),通过将所有的词向量化,来定量的度量词与词之间的关系,挖掘词之间的联系。

主要包含

  • 两个模型:skip-gram(跳字模型)和CBow,Continuous Bag of Words(连续词袋模型)
  • 两种高效训练的方法:Negative Sampling(负采样)和Hierarchical Softmax(层次Softmax)

4.1 SkipGram

(1)基本概念

Skip-gram模型从target word对context的预测中学习到word vector,该名称源于该模型在训练时会对上下文环境里的word进行采样。

如:
按照上述思路产生的样本如下:
针对上述模型,将预测相邻单词这一任务,转换为判断两个单词是否为相邻的单词的问题(0表示“不是邻居”,1表示“邻居”):


此时模型如下:
将模型从神经网络改为逻辑回归模型——更简单,计算速度更快。但是此时所有单词都是相邻单词邻居(target=1),得到的训练模型可能永远返回1。

为了解决该问题,需要在数据集中引入负样本,即非相邻单词样本(target=0):

这个想法的灵感来自噪声对比估计,将实际信号(相邻单词的正例)与噪声(随机选择的不是邻居的单词)进行对比,导致了计算和统计效率的巨大折衷。

word2vec训练过程中的两个关键超参数是窗口大小和负样本的数量,不同的任务适合不同的窗口大小。

(2)数据模型

SkipGram关注是给定中心词www生成背景词ccc的条件概率p(c∣w)p(c \mid w)p(cw),假设给定中心词的情况下背景词的生成相互独立,则

max⁡θ∏w∈Word∏c∈Contextp(c∣w;θ)\max_{\theta} \prod_{w \in Word} \prod_{c \in Context} p(c \mid w; \theta)θmaxwWordcContextp(cw;θ)

⇒max⁡θ∑w∈Word∑c∈Contextlog⁡p(c∣w;θ)\Rightarrow \max_{\theta} \sum_{w \in Word} \sum_{c \in Context} \log p(c \mid w; \theta)θmaxwWordcContextlogp(cw;θ)

在跳字模型中,每个词被表示成两个ddd维向量,用来计算条件概率,词典索引集V={0,1,…,∣V∣−1}\mathcal{V} = \{0, 1, \ldots, |\mathcal{V}|-1\}V={0,1,,V1}

假设这个词在词典中索引为iii,当它为中心词时向量表示为vi∈Rd\boldsymbol{v}_i\in\mathbb{R}^dviRd,而为背景词时向量表示为ui∈Rd\boldsymbol{u}_i\in\mathbb{R}^duiRd。 设中心词www在词典中索引为www,背景词ccc在词典中索引为ccc,给定中心词生成背景词的条件概率可以通过对向量内积做softmax运算而得到:

P(c∣w)=exp(uc⊤vw)∑i∈Vexp(ui⊤vw),P(c \mid w) = \frac{\text{exp}(\boldsymbol{u}_c^\top \boldsymbol{v}_w)}{ \sum_{i \in \mathcal{V}} \text{exp}(\boldsymbol{u}_i^\top \boldsymbol{v}_w)},P(cw)=iVexp(uivw)exp(ucvw),

因此,Skip-gram模型的本质是计算输入word的input vector vw\boldsymbol{v}_wvw 与目标word的output vector uc\boldsymbol{u}_cuc 之间的余弦相似度,并进行softmax归一化,要学习的模型参数θ\thetaθ正是这两类词向量。

此时log⁡P(c∣w)=uc⊤vw−log⁡(∑i∈Vexp(ui⊤vw))\log P(c \mid w) = \boldsymbol{u}_c^\top \boldsymbol{v}_w - \log\left(\sum_{i \in \mathcal{V}} \text{exp}(\boldsymbol{u}_i^\top \boldsymbol{v}_w)\right)logP(cw)=ucvwlog(iVexp(uivw))

为了计算最大值,对其求导
∂logP(w∣c)∂vw=uo−∑j∈Vexp⁡(uj⊤vw)uj∑i∈Vexp⁡(ui⊤vw)=uo−∑j∈V(exp(uj⊤vc)∑i∈Vexp(ui⊤vw))uj=uo−∑j∈VP(w∣c)uj.\begin{aligned} \frac{\partial \text{log}\, P(w \mid c)}{\partial \boldsymbol{v}_w} &= \boldsymbol{u}_o - \frac{\sum_{j \in \mathcal{V}} \exp(\boldsymbol{u}_j^\top \boldsymbol{v}_w)\boldsymbol{u}_j}{\sum_{i \in \mathcal{V}} \exp(\boldsymbol{u}_i^\top \boldsymbol{v}_w)}\\ &= \boldsymbol{u}_o - \sum_{j \in \mathcal{V}} \left(\frac{\text{exp}(\boldsymbol{u}_j^\top \boldsymbol{v}_c)}{ \sum_{i \in \mathcal{V}} \text{exp}(\boldsymbol{u}_i^\top \boldsymbol{v}_w)}\right) \boldsymbol{u}_j\\ &= \boldsymbol{u}_o - \sum_{j \in \mathcal{V}} P(w \mid c) \boldsymbol{u}_j. \end{aligned} vwlogP(wc)=uoiVexp(uivw)jVexp(ujvw)uj=uojV(iVexp(uivw)exp(ujvc))uj=uojVP(wc)uj.

它的计算需要词典中所有词www为中心词的条件概率,其他词向量的梯度同理可得。训练结束后,对于词典中的任一索引为iii的词,均得到该词作为中心词和背景词的两组词向量vi\boldsymbol{v}_iviui\boldsymbol{u}_iui,一般使用跳字模型的中心词向量作为词的表征向量。

上述计算过程极其耗时,为此Mikolov引入了两种优化算法:层次Softmax(Hierarchical Softmax)和负采样(Negative Sampling),核心思想都是降低计算量。

4.2 CBoW

CBoW模型从context对target word的预测中学习到词向量的表达,等价于一个词袋模型的向量乘以一个Embedding矩阵,从而得到一个连续的embedding向量。这也是CBoW模型名称的由来。

如:

使用目标词的前两个词(“by”,“a”)与后两个词(“bus”,“in”),来预测目标词(“red”):

4.3 Negative Sampling

P(D=1∣w,c)P(D=1 \mid w,c)P(D=1w,c)表示中心词www与背景词ccc同时出现(正例)的概率,P(D=0∣w,wk)P(D=0 \mid w,w_k)P(D=0w,wk)表示中心词www与背景词wkw_kwk不同时出现(负例)的概率,


P(D=1∣w,c)=σ(uc⊤vw)P(D=1 \mid w,c)= \sigma (\boldsymbol{u}_c^\top \boldsymbol{v}_w)P(D=1w,c)=σ(ucvw)

P(D=0∣w,wk)=1−σ(uk⊤vw)P(D=0 \mid w,w_k)= 1- \sigma (\boldsymbol{u}_k^\top \boldsymbol{v}_w)P(D=0w,wk)=1σ(ukvw)
此时,
p(c∣w)=P(D=1∣w,c)∑k=1KP(D=0∣w,wk)=σ(uc⊤vw)+∑k=1K[1−σ(uk⊤vw)]\begin{aligned}p(c \mid w) & =P(D=1 \mid w,c) \sum_{k=1}^K P(D=0 \mid w,w_k) \\ &= \sigma (\boldsymbol{u}_c^\top \boldsymbol{v}_w) + \sum_{k=1}^K[ 1- \sigma (\boldsymbol{u}_k^\top \boldsymbol{v}_w)] \end{aligned}p(cw)=P(D=1w,c)k=1KP(D=0w,wk)=σ(ucvw)+k=1K[1σ(ukvw)]

需要最大化p(c∣w)p(c \mid w)p(cw),由于上式的计算复杂度由KKK个负采样决定,计算量大大降低。

4.4 Hierarchical Softmax

为了避免要计算所有词的softmax概率,word2vec使用Huffman树来代替从隐藏层到输出softmax层的映射,softmax概率计算只需要沿着树形结构进行。
如图,沿着霍夫曼树从根节点一直走到叶子节点的词w2w_2w2

Huffman树的所有内部节点类似神经网络隐藏层的神经元,根节点的词向量对应投影后的词向量,而所有叶子节点就类似于之前神经网络softmax输出层的神经元,叶子节点的个数就是词汇表的大小。Huffman树中,隐藏层到输出层的softmax映射不是一下子完成的,而是沿着霍夫曼树一步步完成,因此这种softmax名为"Hierarchical Softmax"。

word2vec中采用了二元逻辑回归的方法,即规定沿着左子树走,那么就是负类(Huffman树编码1),沿着右子树走,那么就是正类(Huffman树编码0),使用sigmoid函数判别正类和负类。

使用Hierarchical Softmax后,由于Huffman树是二叉树,计算量为由VVV变成了log2Vlog2Vlog2V;此外,由于Huffman树是高频的词靠近树根,这样高频词被找到花费时间更短。

5. 使用gensim

gensim是一个很好用的Python NLP的包,封装了google的C语言版的word2vec,不只可以用于word2vec,还有很多其他的API可以用。可以使用
pip install gensim安装。

在gensim中,word2vec 相关的API都在包gensim.models.word2vec中,和算法有关的参数都在类gensim.models.word2vec.Word2Vec中,主要参数如下:

  • sentences: 要分析的语料,可以是一个列表,或者从文件中遍历读出。
  • size: 词向量的维度,默认值是100。这个维度的取值一般与语料的大小相关,如果是不大的语料,比如小于100M的文本语料,则使用默认值一般就可以了。如果是超大的语料,建议增大维度。
  • window:即词向量上下文最大距离,window越大,则和某一词较远的词也会产生上下文关系。默认值为5。在实际使用中,可以根据实际的需求来动态调整这个window的大小。如果是小语料则这个值可以设的更小。对于一般的语料这个值推荐在[5,10]之间。
  • sg: word2vec两个模型的选择:如果是0(默认), 则是CBOW模型;是1则是Skip-Gram模型。
  • hs: word2vec两个解法的选择:如果是0(默认), 则是Negative Sampling;是1的话并且负采样个数negative大于0, 则是Hierarchical Softmax。
  • negative:即使用Negative Sampling时负采样的个数,默认是5。推荐在[3,10]之间。这个参数在我们的算法原理篇中标记为neg。
  • cbow_mean: 仅用于CBOW在做投影的时候,为0,则算法中的xw为上下文的词向量之和,为1则为上下文的词向量的平均值。
  • min_count:需要计算词向量的最小词频。这个值可以去掉一些很生僻的低频词,默认是5。如果是小语料,可以调低这个值。
  • iter: 随机梯度下降法中迭代的最大次数,默认是5。对于大语料,可以增大这个值。
  • alpha: 在随机梯度下降法中迭代的初始步长。算法原理篇中标记为η,默认是0.025。
  • min_alpha: 由于算法支持在迭代的过程中逐渐减小步长,min_alpha给出了最小的迭代步长值。随机梯度下降中每轮的迭代步长可以由iter,alpha, min_alpha一起得出。

以《人民的名义》为语料,分析主要人物的特征:

  • 通过词云可以发现,主要有侯亮平、李达康、高育良、祁同伟四位主角
  • 使用model.wv.similarity方法计算相互之间相似度,发现侯亮平、李达康、祁同伟之间相似度较高
  • 使用wv.doesnt_match比较沙瑞金与四位主角相似度,发现沙瑞金更加不同于四位主角
%matplotlib inline
import jieba
import jieba.analysefilePath = r'data/in_the_name_of_people.txt'
stopPath = r'data/stopword_cn.txt'with open(filePath,encoding = 'utf-8') as file:mytext = file.read() #读取到stringwith open(stopPath,encoding = 'utf-8') as file:word_list = file.read().split() #返回一个字符串,都是小写person = ['沙瑞金','田国富','高育良','侯亮平','祁同伟','陈海','钟小艾', '陈岩石','欧阳菁','易学习','程度','王大路','蔡成功','孙连城','季昌明', '丁义珍', '郑西坡','赵东来', '高小琴','赵瑞龙','田国富','陆亦可', '刘新建', '刘庆祝','李达康']
for p in person:jieba.suggest_freq(p, True)
result = " ".join(jieba.cut(mytext)) #string类型from wordcloud import WordCloud
import matplotlib.pyplot as plt
wordcloud = WordCloud(font_path = "simsun.ttf",stopwords=word_list,max_words=30).generate(result)
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off")

输出如下:

from gensim.models import word2vec
segPath = r'data/in_the_name_of_people_segment.txt'with open(segPath, 'w',encoding = 'utf-8') as f:f.write(result)sentences = word2vec.LineSentence(segPath)
model = word2vec.Word2Vec(sentences, hs=1,min_count=1,window=3,size=100)print(model.wv.similarity('侯亮平', '高育良')) #相似度0.93316543
print(model.wv.similarity('侯亮平', '祁同伟')) #相似度0.9705674
print(model.wv.similarity('侯亮平', '李达康')) #相似度0.96616036
print(model.wv.similarity('李达康', '高育良')) #相似度0.91774
print(model.wv.similarity('李达康', '祁同伟')) #相似度0.9734558
print(model.wv.similarity('高育良', '祁同伟')) #相似度0.9349903
print(model.wv.doesnt_match(u"沙瑞金 侯亮平 高育良 李达康 祁同伟".split()))

输出如下:

0.93316543
0.9705674
0.96616036
0.91774
0.9734558
0.9349903
沙瑞金

Word2Vec简明教程:入门、原理及代码实现相关推荐

  1. 重磅综述:三万字长文读懂单细胞RNA测序分析的最佳实践教程 (原理、代码和评述)

    原文链接: https://www.embopress.org/doi/10.15252/msb.20188746 主编评语 这篇文章最好的地方不只在于推荐了工具,提供了一套分析流程,更在于详细介绍了 ...

  2. 超详细解读带你读懂单细胞RNA测序分析的最佳实践教程 (原理、代码和评述)

    Abstract 单细胞RNA-seq使研究者能够以前所未有的分辨率研究基因表达图谱.这一潜力吸引着更多科研工作者应用单细胞分析技术解决研究问题.随着可用的分析工具越来越多,如何组合成一个最新最好的数 ...

  3. 【二】gym初次入门一学就会---代码详细解析简明教程----平衡杆案例

    相关文章: [一]gym环境安装以及安装遇到的错误解决 [二]gym初次入门一学就会-简明教程 [三]gym简单画图 [四]gym搭建自己的环境,全网最详细版本,3分钟你就学会了! [五]gym搭建自 ...

  4. 基于LLVM的编译原理简明教程 (1) - 写编译器越来越容易了

    基于LLVM的编译原理简明教程 (1) - 写编译器越来越容易了 进入21世纪,新的编程语言如雨后春笋一样不停地冒出来.需求当然是重要的驱动力量,但是在其中起了重要作用的就是工具链的改善. 2000年 ...

  5. 一条数据的HBase之旅,简明HBase入门教程-Write全流程

    如果将上篇内容理解为一个冗长的"铺垫",那么,从本文开始,剧情才开始正式展开.本文基于提供的样例数据,介绍了写数据的接口,RowKey定义,数据在客户端的组装,数据路由,打包分发, ...

  6. 一条数据的HBase之旅,简明HBase入门教程-开篇

    常见的HBase新手问题: 什么样的数据适合用HBase来存储? 既然HBase也是一个数据库,能否用它将现有系统中昂贵的Oracle替换掉? 存放于HBase中的数据记录,为何不直接存放于HDFS之 ...

  7. duilib入门简明教程 -- 部分bug (11) (转)

    原文转自:http://www.cnblogs.com/Alberl/p/3344886.html 一.WindowImplBase的bug 在第8个教程[2013 duilib入门简明教程 -- 完 ...

  8. 【Python】【进阶篇】十二、Python爬虫的Xpath简明教程(十分钟入门)

    目录 十二.Python爬虫的Xpath简明教程(十分钟入门) 12.1 Xpath表达式 12.2 Xpath节点 12.3 节点关系 12.4 Xpath基本语法 12.4.1 基本语法使用 12 ...

  9. DuiLib入门简明教程

           Duilib 是一款强大的界面开发工具,可以将用户界面和处理逻辑彻底分离,极大地提高用户界面的开发效率. 国内首个开源 的directui 界面库,开放,共享,惠众,共赢,遵循bsd协议 ...

  10. 2013 duilib入门简明教程 -- 总结 (20)

    原文地址为: 2013 duilib入门简明教程 -- 总结 (20) duilib的入门系列就到尾声了,再次提醒下,Alberl用的duilib版本是SVN上第 387个版本,时间是2013.08. ...

最新文章

  1. mysql事务处理用法与实例详解
  2. 快速指南:使用OpenCV预处理神经网络中的面部图像
  3. C#编程(五十三)----------字典DictionaryTKey,TValue
  4. 学习JNI一些基础知识
  5. C#.NET 中的类型转换 (转)
  6. c语言flash里能存文件吗,STM32内部FLASH打包读写
  7. 绘制机械图c语言编程,求用C语言绘制机械三视图程序?
  8. 01)自学JavaScript
  9. day15(mysql 的多表查询,事务)
  10. Leetcode 513 javascript
  11. 2021-2025年中国电动毛巾散热器行业市场供需与战略研究报告
  12. springboot雪花算法的生成
  13. linux 串口 断帧,STM32f103使用串口中断发送数据时出现断帧是什么原因?
  14. amesim2020安装
  15. spss统计分析基础教程(上)--自学
  16. PTES标准中的渗透测试阶段
  17. JavaScript实现浏览器特定区域截屏和下载功能
  18. 浅谈企业知识资产管理及建设思路
  19. 自己做一个小项目python_【Python】第一个微信小项目
  20. 本人面试两个月真实经历:面试了20家大厂之后,发现这样介绍项目经验,显得项目很牛逼!

热门文章

  1. 传染病SIR模型及蒙特卡洛方法
  2. 全国大学生数学建模竞赛2016A题系泊系统的设计MATLAB程序
  3. html游戏开源代码是什么,怎么运行html5游戏的源代码
  4. GNS3中下载路由器
  5. 34 模板方法模式(模板方法设计模式)详解
  6. 2020软件测试学科全套上课视频教程网盘免费分享
  7. MES系统整体解决方案
  8. 欧拉角Yaw、Pitch、Roll
  9. java的oracle考试认证(OCJP)之路
  10. VM14 安装黑苹果教程步骤