一、欧氏距离和哈夫曼距离
二、L1范数和L2范数归一化与正则化
1.归一化:该向量各个元素除以对应的范数
假设有向量X=(x1,x2,x2,...xn)
L1范数:向量各个元素的绝对值之和,即$sum_{i=1}^{n}left | x_{i} ight |$
L2范数:$sqrt{sum_{i=1}^{n}x_{i}^{2}}$
则可得L1、L2范数归一化公式为:$frac{X(x_{1},x_{2},x_{3},...,x_{n})}{L1}$、$frac{X(x_{1},x_{2},x_{3},...,x_{n})}{L2}$
特别的是经过L2范数归一化之后,欧式距离和余弦相似度可以等价,假设有X1,X2向量,他们的欧式距离为D(X1,X2),余弦相似度为Sim(X1,X2),转化公式为:$Dleft( {{{f{X}}_{ m{1}}},{{f{X}}_{ m{2}}}} ight) = sqrt {2 - 2Simleft( {{{f{X}}_{ m{1}}},{{f{X}}_{ m{2}}}} ight)}$(转化公式推导由参考链接二得)
2.正则化:正则化(Regularization) 是机器学习中对原始损失函数引入额外信息,以便防止过拟合和提高模型泛化性能的一类方法的统称。也就是目标函数变成了原始损失函数+额外项,常用的额外项一般有两种,称作L1正则化和L2正则化(实际是L2范数的平方)。
以线性回归为例,使用L1正则化的模型叫做Lasso回归,使用L2正则化的模型叫做Ridge回归(岭回归)。
线性回归L1正则化损失函数:$min_w [sum_{i=1}^{N}(w^Tx_i - y_i)^2 + lambda |w|_1 ]$
线性回归L2正则化损失函数:$min_w[sum_{i=1}^{N}(w^Tx_i - y_i)^2 + lambda|w|_2^2]$
深入了解见参考链接四
三、TF-IDF文本向量化
在一份给定的文件里,词频(term frequency,tf)指的是某一个给定的词语在该文件中出现的频率。这个数字是对词数(term count)的归一化,以防止它偏向长的文件。(同一个词语在长文件里可能会比短文件有更高的词数,而不管该词语重要与否。)对于在某一特定文件里的词语${displaystyle t_{i}}$来说,它的重要性可表示为:
${displaystyle mathrm {tf_{i,j}} ={frac {n_{i,j}}{sum _{k}n_{k,j}}}}$
以上式子中${displaystyle n_{i,j}}$是该词在文件${displaystyle d_{j}}$中的出现次数,而分母则是在文件${displaystyle d_{j}}$中所有字词的出现次数之和。
逆向文件频率(inverse document frequency,idf)是一个词语普遍重要性的度量。某一特定词语的idf,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取以10为底的对数得到:
${displaystyle mathrm {idf_{i}} =lg {frac {|D|}{|{j:t_{i}in d_{j}}|}}}$
其中|D|:语料库中的文件总数 ${displaystyle |{j:t_{i}in d_{j}}|}$:包含词语${displaystyle t_{i}}$的文件数目(即${displaystyle n_{i,j} eq 0}$的文件数目)如果词语不在资料中,就导致分母为零,因此一般情况下使用${displaystyle 1+|{j:t_{i}in d_{j}}|}$ 然后${displaystyle mathrm {tf{}idf_{i,j}} =mathrm {tf_{i,j}} imes mathrm {idf_{i}} }$ 某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的tf-idf。因此,tf-idf倾向于过滤掉常见的词语,保留重要的词语。
python实现TF-IDF以sklearn为例,可以使用CountVectorizer()将语料转化为词频矩阵,再使用TfidfTransformer()重置词频矩阵的权重两函数的shape是一致的。另外可以使用TfidfVectorizer()一步到位,如下:
from sklearn.feature_extraction.text import TfidfVectorizer
corpus = [
'This is the first document',
'This document is the second document',
'And this is the third one',
'Is this the first document',
]
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(corpus)
# print(X.toarray())
print(X.shape) # (4,9) 4个文档,共九个词语
参考:
https://zhuanlan.zhihu.com/p/45902017
https://www.cnblogs.com/Kalafinaian/p/11180519.html
https://zhuanlan.zhihu.com/p/137073968
https://www.cnblogs.com/zingp/p/10375691.html
https://zhuanlan.zhihu.com/p/97273457