余弦相似度,又称为余弦相似性,是通过计算两个向量的夹角余弦值来评估他们的相似度。余弦相似度将向量根据坐标值,绘制到向量空间中,如最常见的二维空间。
将向量根据坐标值,绘制到向量空间中。如最常见的二维空间。求得他们的夹角,并得出夹角对应的余弦值,此余弦值就可以用来表征,这两个向量的相似性。夹角越小,余弦值越接近于1,它们的方向更加吻合,则越相似。
单位向量是指模等于1的向量。由于是非零向量,单位向量具有确定的方向。一个非零向量除以它的模,可得所需单位向量。单位向量有无数个。(矢量和向量是同一个意思,Vector,这里习惯用矢量这个词语)
平行四边形定则解决向量加法的方法:将两个向量平移至公共起点,以向量的两条边作平行四边形,结果为公共起点的对角线。平行四边形定则解决向量减法的方法:将两个向量平移至公共起点,以向量的两条边作平行四边形,结果由减向量的终点指向被减向量的终点。
image.png
代数定义设二维空间内有两个向量
和
,定义它们的数量积(又叫内积、点积)为以下实数:
更一般地,n维向量的内积定义如下:
点乘的结果就是两个向量的模相乘,然后再与这两个向量的夹角的余弦值相乘。或者说是两个向量的各个分量分别相乘的结果的和。很明显,点乘的结果就是一个数,这个数对我们分析这两个向量的特点很有帮助。如果点乘的结果为0,那么这两个向量互相垂直;如果结果大于0,那么这两个向量的夹角小于90度;如果结果小于0,那么这两个向量的夹角大于90度。
Token在词法分析中是标记的意思。自然语言处理中,一般来说,Token代表“词”。自然语言预处理中,一个很重要的步骤就是将你收集的句子进行分词,将一个句子分解成“词”的列表。
LinearRegressionfromsklearn.linear_modelimportLinearRegressionfit(X,y[,n_jobs])对训练集X,y进行训练。是对scipy.linalg.lstsq的封装score(X,y[,]sample_weight)定义为(1-u/v),其中u=((y_true-y_pred)2).sum(),而v=((y_true-y_true.mean())2).mean()最好的得分为1.0,一般的得分都比1.0低,得分越低代表结果越差。其中sample_weight为(samples_n,)形状的向量,可以指定对于某些sample的权值,如果觉得某些数据比较重要,可以将其的权值设置的大一些。
注意:在gensim以前版本中TaggedDocument是LabeledSentence
Savetheobjecttofile(alsoseeload).fname_or_handleiseitherastringspecifyingthefilenametosaveto,oranopenfile-likeobjectwhichcanbewrittento.Iftheobjectisafilehandle,nospecialarrayhandlingwillbeperformed;allattributeswillbesavedtothesamefile.语料库建成之后,就可以进行一些有趣的检索了。例如参考文档[Algorithm&NLP]文本深度表示模型——word2vec&doc2vec词向量模型中的句子相似度实验:
下面是sentence2vec的结果示例。先利用中文sentence语料训练句向量,然后通过计算句向量之间的cosine值,得到最相似的句子。可以看到句向量在对句子的语义表征上还是相当惊叹的。
这里的相似度检索是指,给定一个正面的句子,然后检索和其相似度最大的句子。当然,这里也可以指定一个负面的句子,也就是和这个句子越不相似越好。这里有一个限制,如果正面的句子和负面的句子,进行分词之后,没有一个词语是被训练过的(被训练过的词语,是指语料库里面存在的词语),则无法进行操作。
具体在求相似度的操作之前,检索用向量需要进行一下处理。假设positive变量是一个数组,数组里面存放着正面的Token。corpus[token]表示token的矢量,这里对矢量进行按列求和,结果是一个和token维度一样的矢量。换句话说,就是将多个矢量合并为单个矢量。(Token矢量的求和矢量)然后将上面那个“Token矢量的求和矢量”,和新的positive的推测矢量进行相加,获得一个新的"求相似度用矢量"。
(Negative和Positive类似)
在语料库对象(DocumentModel)中有一个很有用的方法infer_vector,这个方法可以基于当前的文档模型快速,将一个文档转换(按照模型推测)成一个矢量。
infer_vector(doc_words,alpha=0.1,min_alpha=0.0001,steps=5)Inferavectorforgivenpost-bulktrainingdocument.Documentshouldbealistof(word)tokens.在机器学习界,有两种机器学习方式,一种是Online的,一种是Offline的。Online的方式,模型可以实时更新,新的样本会被实时进行训练,训练结果也实时反映到模型中去。Offline的方式,如果有新的样本,则需要将新老样本放在一起,重新进行训练。这里的话,模型无法进行Online的训练,所以新的样本,只是基于训练好的模型,被转换(推测Infer,有些类似于预测Predict)为一个矢量。
相似度计算的核心方法是most_similar
ComputethecentroidsonXbychunkingitintomini-batches.fit拟合操作,实际上就是计算每个簇的质心。所以说,如果簇只有一个的话,拟合的意义是求出整个数据的质心。predict(X)PredicttheclosestclustereachsampleinXbelongsto.predict预测操作,是给出每个样本属于哪个簇的结果
代码的逻辑如下:fit:XX[tag]里面的tag表示收集渠道,XX[tag]表示某个渠道的样本矢量数组:_cf[tag]:表示某个渠道的CommonFactor矢量,这里使用np.array(XX[tag]).mean(axis=0)按列求均值获得的。每一个渠道有一个CommonFactor矢量。remove代码则是将某个渠道里面所有的矢量,都剪去CommonFactor矢量(代码有删减,原来代码里面有对于未知渠道的防御代码,这里已经简化)
同时,我们还需要获得一个训练的得分(score)
评价训练得分的部分使用了余弦原理,通过单位向量的点乘(点积)结果来获得相似度。注意,一定要将两个矢量都单位化,转换为模为1的矢量,这样点乘出来的结果才是余弦值。负分数=矢量单位化(待预测矢量-簇的权重为正数的矢量均值)点积单位矢量化簇的正负差
推荐通过网络上的廖雪锋的Python教程学习python语法
numpysum
axis:求和的维。
numpymean
axis:求平均的维。
lambda和浮点数
python中使用.1代表浮点数0.1或者1.代表浮点数1.0。原因是要保证结果的精度,防止程序自动强制转换。
score=lambdaX,y:1.-((y-X)**2).sum()/((y-y.mean())**2).sum()percentile幾つかの数値データを小さい順に並べたとき、小さい方から数えて全体のX%に位置する値をXパーセンタイルと言います。(数值按照从小到大进行排列,从小的数字开始计算,全体数字的X%的位置,数值是多少)
例えば10人のクラスがあるとして、各生徒のテストの点数が[40,50,60,70,75,80,83,86,89,95]だったとします。その時、下から95%に位置する点数(逆に言うと上位5%に位置する点数)が何点なのか示すものが95パーセンタイルになります。