科普文:算法和数据结构系列【机器学习、数据科学中的相似度与距离算法原理汇总--下篇】
常常需要估算不同样本之间的相似性度量(Similarity Measurement),估算相似性度的方法主要两种:距离(Distance)、相似度(Similarity)。相似度算法有:余弦相似度(Cosine Similarity)、杰卡德相似系数(Jaccard Similarity)、皮尔逊相关系数(Pearson Correlation Coefficient)、互信息/信息增益(M
概叙
书接上篇:科普文:算法和数据结构系列【机器学习、数据科学中的相似度与距离算法原理汇总--上篇】-CSDN博客
在数据挖掘中、做分类时,常常需要估算不同样本之间的相似性度量(Similarity Measurement),估算相似性度的方法主要两种:距离(Distance)、相似度(Similarity)。
估算相似性:相似度(Similarity)算法
相似度度量(Similarity),即计算个体间的相似程度,与距离度量相反,相似度度量的值越小,说明个体间相似度越小,差异越大。
相似度算法是机器学习和数据挖掘领域中的重要工具,用于衡量不同对象之间的相似程度。除了上面的距离算法(如欧氏距离、曼哈顿距离等)外,还有许多其他相似度算法。
- 余弦相似度(Cosine Similarity):主要用于文本分析,通过测量两个非零向量的夹角的余弦值来计算它们之间的相似度。余弦值为1时,表示两个向量方向完全相同;为0时,表示两个向量正交,即完全不相关。
- 杰卡德相似系数(Jaccard Similarity):主要用于集合的相似度计算,它是两个集合交集大小与并集大小的比值。通常用于文本分析中,通过计算两个集合中共同的元素数量与总元素数量的比例来确定相似度。
- 皮尔逊相关系数(Pearson Correlation Coefficient):用于衡量两个变量之间线性相关程度的指标,取值范围从-1到1。相关系数接近1表示正相关,接近-1表示负相关,接近0表示无明显线性相关。
- 对数似然相似率:用于衡量两个事件发生的概率分布之间的相似度。通过比较两个事件发生的次数和概率分布来计算相似度。
- 互信息/信息增益(Mutual Information/Information Gain):在信息论中,用于衡量两个随机变量的相关性程度。通过比较两个变量的熵和联合熵来计算相似度。
- 相对熵/KL散度(Kullback-Leibler Divergence):用于衡量两个取值为正数的函数(概率分布)的相似性。通过比较两个分布的概率密度函数来计算相似度。
- 词频-逆文档频率(TF-IDF):在信息检索中,用于衡量查询词和文档之间的相关性。通过比较查询词在文档中的出现频率和逆文档频率来计算相似度。
- Tanimoto系数(广义Jaccard相似系数):是Jaccard相似系数的一种扩展,用于衡量两个集合或向量的相似度。元素的取值可以是实数。
- 最长公共子序列(Longest Common Subsequence, LCS):主要用于序列数据的相似度计算,如DNA序列或文本字符串。通过比较两个序列中最长公共子序列的长度来计算相似度。
余弦相似度(Cosine Similarity)
余弦相似度是一种用于衡量两个非零向量在方向上的相似程度的指标。
余弦相似度通过计算两个向量之间的夹角的余弦值来表示它们在向量空间中的相似性。余弦相似度的取值范围从-1到1,其中1表示两个向量完全相同,0表示它们之间没有相似性,而-1则表示两个向量方向相反。
详细参考:
科普文:Java基础之算法系列【文本相似度判定算法:手搓余弦相似度(Cosine Similarity)+TF-IDF(词频-逆文档频率)】-CSDN博客
示例:假设有两个二维向量 A =(1,3) 和 B =(2,3)。
首先,计算这两个向量的点积: A·B = 1*2 + 3*3 = 2 + 9 = 11
接着,计算每个向量的范数(长度):
||A|| = sqrt(1^2 + 3^2) = sqrt(1 + 9) = sqrt(10)
||B|| = sqrt(2^2 + 3^2) = sqrt(4 + 9) = sqrt(13)
最后,用点积除以范数的乘积,得到余弦相似度:
cosθ = A·B / (||A|| * ||B||) = 11 / (sqrt(10) * sqrt(13))=0.964763821238

0.964763821238这个值就是 A 和 B 的余弦相似度,表示了 A 和 B 的相似程度。
在实际计算中,你可能需要使用计算器或编程来计算平方根和最终的余弦值。这个值将是一个介于 -1 和 1 之间的数,越接近 1 表示两个向量越相似,越接近 -1 表示两个向量越不相似。
请注意,这个示例是在二维空间中进行计算的,但余弦相似度的概念可以扩展到任意维度的向量空间。
杰卡德相似系数(Jaccard Similarity/Jaccard Index)
杰卡德相似系数(Jaccard Similarity Coefficient)是衡量两个集合相似度的一种指标,也叫做雅卡尔指数Jaccard Index。

它反映了两个集合交集元素在并集中所占的比例,用符号J(A,B)表示:

当两个集合完全相同时,杰卡德相似系数为1;当两个集合没有任何共同元素时,杰卡德相似系数为0。
与杰卡德相似系数相反的概念是杰卡德距离(Jaccard distance)。
杰卡德距离可用如下公式表示:例如,如果两个集合有 1 个共同的实体,而有 5 个不同的实体,那么雅卡尔指数为 1/5 = 0.2。要计算雅卡尔距离,我们只需从 1 中减去雅卡尔指数:

杰卡德相似系数(Jaccard Similarity Coefficient)是一种用于衡量两个集合之间相似性和差异性的统计量,它通过计算两个集合交集的大小与并集的大小之比来评估它们的相似度。
杰卡德相似系数(Jaccard Similarity)原理
杰卡德相似系数的计算原理是基于集合的交集与并集。具体来说,对于给定的两个集合A和B,杰卡德相似系数J(A,B)定义为A与B交集的大小与A与B并集的大小的比值1。
公式如下:J(A,B) = |A ∩ B| / |A ∪ B|
其中,|A ∩ B|表示集合A和B的交集的元素个数,|A ∪ B|表示集合A和B的并集的元素个数。
示例:假设有两个集合A和B,其中:集合A = {apple, banana, orange},集合B = {banana, grape, orange}
首先,找出集合A和B的交集A ∩ B: A ∩ B = {banana, orange}
然后,找出集合A和B的并集A ∪ B:A ∪ B = {apple, banana, orange, grape}
接下来,计算交集和并集的元素个数:
|A ∩ B| = 2(因为交集有两个元素:banana和orange)
|A ∪ B| = 4(因为并集有四个元素:apple, banana, orange, grape)
最后,使用杰卡德相似系数的公式进行计算:
J(A,B) = |A ∩ B| / |A ∪ B| = 2 / 4 = 0.5
因此,集合A和B的杰卡德相似系数为0.5,表示这两个集合在词汇上有一定的相似性。
杰卡德相似系数(Jaccard Similarity)优缺点
优点:计算简单直观,适用于集合类型的数据,如文本分析、推荐系统等
- 简单易懂,计算方便。
- 对于二元数据(如0-1数据)的集合特别有效。
缺点:对集合大小敏感,当其中一个集合显著大于另一个时,相似度可能不高;不考虑元素权重,只考虑元素的存在性。
- 只适用于二元数据的集合,对于连续型数据或更复杂的数据结构可能不够灵活。
- 对于集合中元素的重要性或权重没有考虑,可能在实际应用中有所局限。
杰卡德相似系数(Jaccard Similarity)应用场景
杰卡德相似系数在信息检索、文本分类、图像识别、生物信息学等多个领域有广泛应用。
- 信息检索:用于比较文档之间的相似度,判断两篇文章在词汇或主题上的相似程度。
- 文本分类:比较文档集合的相似度,用于文档查重和文本聚类。类似地,它可以用于文本相似性分析,以测量文档之间有多少词语重叠。因此,它可以用来比较模式集合。
- 图像识别:比较两个图像中特定特征区域的相似性。在图像识别中,通过比较图像像素集合的相似度来识别相似图像。用于使用二进制或二进制数据的应用程序中。当你有一个深度学习模型来预测图像分割时,比如一辆汽车,雅卡尔指数可以用来计算给定真实标签的预测分割的准确度。
- 生物信息学:分析基因序列或蛋白质结构的相似性。
- 推荐系统:用于过滤相似度很高的新闻或网页去重,提高推荐结果的多样性。计算用户或物品的相似度,进行个性化推荐。
杰卡德相似系数(Jaccard Similarity)注意事项
- 在使用杰卡德相似系数时,需要确保数据是二元数据的集合,即每个元素只存在或不存在于集合中。
- 对于连续型数据或更复杂的数据结构,可能需要考虑其他相似度度量方法,如余弦相似度、欧氏距离等。
- 在实际应用中,应根据具体需求和数据特性选择合适的相似度度量方法,并结合其他评价指标进行综合评估。
Tanimoto系数(广义Jaccard相似系数)
Tanimoto系数(Tanimoto Coefficient),也被称为谷本系数或广义Jaccard相似系数,起源于化学信息学领域,用于比较分子之间的相似度。
其概念源于Jaccard系数,由Paul Jaccard在1901年首次提出,并在后续得到发展和应用,特别是在化学信息学、信息检索以及生物信息学等领域。
Tanimoto系数原理
Tanimoto系数基于集合论的概念,用于量化两个集合或向量的相似程度。它通过比较两个集合的交集与并集(或向量空间中的对应元素)的比例来确定它们的相似性。
具体来说,Tanimoto系数等于两个集合交集的元素数量除以它们并集的元素数量,
公式为:Tanimoto系数 = |A ∩ B| / (|A| + |B| - |A ∩ B|),
或者简化为Tanimoto系数 = ∣A∩B∣/∣A∪B∣。
示例:假设有两个集合A和B,其中:集合A = {1, 2, 3, 4},集合B = {2, 3, 5, 6}
首先,找出集合A和B的交集A ∩ B:A ∩ B = {2, 3}
然后,找出集合A和B的并集A ∪ B:A ∪ B = {1, 2, 3, 4, 5, 6}
接下来,计算交集和并集的元素个数:
|A ∩ B| = 2(因为交集有两个元素:2和3)
|A ∪ B| = 6(因为并集有六个元素:1, 2, 3, 4, 5, 6)
最后,使用Tanimoto系数的公式进行计算:
Tanimoto系数 = |A ∩ B| / (|A| + |B| - |A ∩ B|)
由于|A| = 4, |B| = 4, |A ∩ B| = 2,所以:
Tanimoto系数 = 2 / (4 + 4 - 2) = 2 / 6 = 1/3 ≈ 0.3333 或 33.33%
因此,集合A和B的Tanimoto系数为0.3333(或33.33%),表示这两个集合有中等程度的相似性,因为它们共享的元素占总独特元素的比例为三分之一。
Tanimoto系数的一个显著特点是它在0到1之间取值,其中0表示两个集合完全不重叠(无相似性),1表示两个集合完全相同(完全相似)。
Tanimoto系数优缺点
优点:直观易懂,适用范围广,不仅适用于二值数据,也适用于非二值数据,且能够处理稀疏特征。在化学信息学、生物信息学等领域中,Tanimoto系数通常能够取得较好的相似度度量效果。
- 对文本长度不敏感,适用于高维数据和稀疏向量。
- 在高维空间中表现良好,能够有效地衡量两个集合或向量的相似度。
缺点:对噪声敏感,当数据中存在噪声或异常值时,计算结果可能会受到影响;计算量大,当处理大规模数据集时,计算量可能会很大,故在数据预处理阶段需进行噪声去除。
- 不考虑向量中各元素的重要性,即所有元素都被视为等权重的。
- 对重复出现的单词敏感,可能会导致相似度计算结果的偏差。
- 无法捕捉变量之间的非线性关系。
Tanimoto系数应用场景
Tanimoto系数在信息检索、生物信息学、化学信息学等领域有着广泛的应用。
它不仅可以用于衡量两个分子之间的相似度,还可以用于衡量两个文档、两个网页等之间的相似度。
在推荐系统中,Tanimoto系数也常被用于计算用户或物品之间的相似度,以支持推荐算法的实现。
Tanimoto系数注意事项
- 在使用Tanimoto系数时,需要确保数据是以集合或向量的形式表示的,且元素之间是可比较的。
- 由于Tanimoto系数对重复元素敏感,因此在处理文本数据时,可能需要进行预处理,如去重等。
- 在选择相似度度量方法时,应根据具体的应用场景和数据特性进行综合考虑,选择最适合的度量方法。例如,在某些情况下,余弦相似度或欧氏距离可能更适合用于衡量向量之间的相似度。
皮尔逊相关系数(Pearson Correlation Coefficient)
皮尔逊相关系数(Pearson Correlation Coefficient)通常表示为r,是一种衡量两个变量之间线性相关程度的统计量。
其值介于-1与1之间,其中1表示完全正向线性相关,-1表示完全负向线性相关,0则表示无相关。这个相关系数是由卡尔·皮尔逊从弗朗西斯·高尔顿在19世纪80年代提出的一个相似却又稍有不同的想法演变而来的,也称作“皮尔逊积矩相关系数”。
皮尔逊相关系数原理
皮尔逊相关系数通过衡量两个变量的协方差与它们标准差的乘积的比值来表示它们之间的线性关系。
皮尔逊相关系数的计算公式为:r = cov(X,Y) / (σX * σY),其中cov(X,Y)表示变量X和Y的协方差,σX和σY分别表示X和Y的标准差。
它本质上是标准化后的协方差,用于评估两个变量之间线性关系的强度和方向。


其公式为:r = ∑(Xi - X̄)(Yi - Ȳ) / √[∑(Xi - X̄)²∑(Yi - Ȳ)²],其中Xi和Yi分别为两个变量的观测值,X̄和Ȳ分别为它们的均值。
上面的公式不好看,直接截图表示。

这个比值本质上是协方差的一种归一化测量,因此结果的值总是在-1和1之间。
示例:假设我们有以下两组数据,代表两个变量X和Y:
X = [1, 2, 3, 4, 5]
Y = [2, 2.5, 3.5, 4.5, 5]
首先,计算每个变量的均值:
X̄(X的均值) = (1 + 2 + 3 + 4 + 5) / 5 = 3
Ȳ(Y的均值) = (2 + 2.5 + 3.5 + 4.5 + 5) / 5 = 3.5
接着,计算每个数据点与各自均值的差(即离差),然后计算这些离差的乘积,并对所有乘积求和:
∑(Xi - X̄)(Yi - Ȳ) = (1-3)(2-3.5) + (2-3)(2.5-3.5) + (3-3)(3.5-3.5) + (4-3)(4.5-3.5) + (5-3)(5-3.5)
= (-2)(-1.5) + (-1)(-1) + (0)(0) + (1)(1) + (2)(1.5)
= 3 + 1 + 0 + 1 + 3
= 8
然后,分别计算每个变量的离差平方和,并对它们求和:
∑(Xi - X̄)² = (1-3)² + (2-3)² + (3-3)² + (4-3)² + (5-3)² = 4 + 1 + 0 + 1 + 4 = 10
∑(Yi - Ȳ)² = (2-3.5)² + (2.5-3.5)² + (3.5-3.5)² + (4.5-3.5)² + (5-3.5)² = 2.25 + 1 + 0 + 1 + 2.25 = 6.5
最后,用前面得到的乘积和除以两个离差平方和的平方根,得到皮尔逊相关系数:
r = 8 / √(10 * 6.5) ≈ 0.98
因此,变量X和Y之间的皮尔逊相关系数约为0.98,这表明它们之间存在非常强的正向线性相关关系,即变量相关(如果用来判断文本相似度,则说明相似度很高)。
请注意,这个计算示例是为了说明皮尔逊相关系数的计算过程而简化的。在实际应用中,通常会使用统计软件或编程语言中的相关函数来计算皮尔逊相关系数,以提高计算的准确性和效率。
皮尔逊相关系数的优缺点
优点:计算简单,易于理解,适用范围广,能够反映变量之间的线性关系强度和方向。
- 能够量化两个变量之间的线性相关程度,便于进行统计分析和预测。
- 计算简单,易于理解和应用。
- 简单直观:它提供了一个明确的数值,直接反映两个变量之间的线性相关性,易于解释。
- 标准化:由于它的取值范围在-1到1之间,便于不同变量之间的相关性比较,即使它们的量纲不同。
- 广泛适用:在许多应用场景中(如信号处理、统计分析、机器学习)非常常用,尤其是当数据符合线性模型时,皮尔逊相关系数是衡量相关性的理想工具。
缺点:只能测量线性关系,不能测量非线性关系,对异常值比较敏感,且假设数据服从正态分布,对数据的分布形态有一定要求。
- 仅适用于线性关系:皮尔逊相关系数只能捕捉线性关系,如果两个变量有非线性关系,它可能无法准确反映真实的相关性。例如,对于非线性或复杂关系,它可能低估甚至完全无法检测到相关性。
- 对异常值敏感:少量的异常值(outliers)可能会极大地影响皮尔逊相关系数的值,导致不准确的相关性评估。
- 假设正态分布:虽然不强制要求,但皮尔逊相关系数的统计意义在变量接近正态分布时最为可靠。在非正态分布的情况下,它的结果可能不稳定。
- 无法反映因果关系:皮尔逊相关系数仅说明变量之间的线性相关性,并不意味着因果关系。
- 只能反映变量之间的线性关系,对于非线性关系可能无法准确捕捉。
- 对离群点敏感,单个离群点可能会导致相关系数的显著变化。
- 即使两个变量高度相关,也不一定存在因果联系,相关性不代表因果关系。
皮尔逊相关系数的应用场景
理解皮尔逊相关系数的关键是理解相关系数衡量的是变量之间的线性关系强度和方向。
数学上,相关系数测量的是两个变量偏离各自均值的程度,以及这种偏离是否同时发生。如果两个变量同时向相同方向偏离均值,相关系数将为正值;如果向相反方向偏离,则相关系数为负值。
皮尔逊相关系数的本质是通过协方差来度量两个变量之间的相关程度,同时除以各自标准差的乘积,以进行标准化。
具体来说,皮尔逊相关系数衡量的是两个变量的共变异性与个别变异性的比例。它刻画了变量之间的线性关系的紧密程度,可以用来描述变量的相似性或相关性。
在计算似度或相似度时,皮尔逊相关系数常用于比较两个变量之间的关系强度,特别是在具有连续性数值的数据中。较高的相关系数表示变量之间有较强的线性关系,而较低的相关系数表示相关性较弱。
需要注意的是,皮尔逊相关系数只能测量变量之间的线性关系,并不适用于非线性关系的刻画。
皮尔逊相关系数在自然科学、社会科学、经济学、金融学等多个领域都有广泛应用。
- 自然科学:它可以用于研究不同变量之间的相互影响,如气温与降雨量之间的关系。
- 金融分析:评估股票与市场指数之间的相关性。在经济学和金融学中,它可以用于预测股票价格、汇率等经济指标的变化趋势。
- 社会科学:研究教育水平和收入之间的关系。它可以用于分析不同社会指标之间的关联,如收入与教育水平之间的关系。
- 医学研究:评估不同生理指标之间的关系。
- 市场营销:评估广告支出与销售额之间的关系。
皮尔逊相关系数的注意事项
- 在使用皮尔逊相关系数时,应确保数据满足正态分布的假设,否则可能导致结果不准确。
- 应注意识别和处理离群点,以减少它们对相关系数的影响。
- 相关性不代表因果关系,因此在解释相关系数时应谨慎,避免过度解读。
- 当数据之间存在非线性关系时,应考虑使用其他统计方法来衡量它们之间的关联程度。
对数似然相似率(Log-Likelihood Similarity)
对数似然相似率(Log-Likelihood Similarity),在统计学和机器学习中,是一种用于衡量两个数据分布或模型之间相似性的方法。它基于对数似然函数,通过比较两个数据集或模型在给定参数下的对数似然值,来评估它们之间的相似程度。
对数似然相似率的原理
对数似然相似率的原理在于,对于给定的观测数据和模型参数,计算数据在模型下的对数似然值。这个值反映了数据在模型下的拟合程度,即数据出现的概率。
当两个数据集或模型在相同参数下的对数似然值相近时,可以认为它们具有较高的相似性。
具体来说,对数似然函数是似然函数的对数形式,它通过将似然函数中的乘积转化为求和,简化了计算过程。
似然函数 L(θ) 中,使其值最大的参数θ能够最近似地说明训练数据。
和随机梯度下降法一样,我们接下来要做的就是对似然函数进行微分,求出参数 θ。不过直接对似然函数进行微分有点困难,在此之前要把函数变形。联合概率中的概率都是 1 以下的数,所以像联合概率这种概率乘法的值会越来越小。如果值太小,编程时会出现精度问题。并且与加法相比,乘法的计算量要大得多。
想要解决这些问题,只要取似然函数的对数就好了。像这样在等式两边加上 log 即可:

log 是单调递增函数。log 函数的图形如下所示:

图形一直向右上方延伸。单调递增函数是在 x1 < x2 时,f(x1) < f(x2) 的函数 f(x)。log(x)的图形一直向右上方延伸,而且在 x1 < x2时,log(x1) < log(x2)也成立。
我们现在考察的似然函数也是在 L(θ1) < L(θ2) 时,有logL(θ1) < logL(θ2) 成立。也就是说,使 L(θ) 最大化等价于使logL(θ) 最大化。
我们把对数似然函数变形看看:
每一行的变形分别利用了下面这些特性,好好理解一下:
- 第 2 行是 log(ab) = log a + log b
- 第 3 行是 log ab = b log a
- 第 4 行是 P(y(i) = 0|x(i) ) = 1 − P(y(i) = 1|x(i) )
前两个是对数函数的特性,下面对第 4 行进行解释:现在我们考虑的只有 y = 1 和 y = 0 两种情况,所以应有 P(y(i) = 0|x(i) ) + P(y(i) = 1|x(i) ) = 1
下面要做的就是就是进行偏分求未知量。前面讲了很多,总结一下就是逻辑回归将这个对数似然函数用作 目标函数。

接下来,对各个参数 θj 求微分就行了:
和回归的时候是一样的,我们把似然函数也换成这样的复合函数, 然后依次求微分。


这个是 u 对 v 微分,log(v) 的微分是 1/v。对 log(1 − v) 微分时,要像这样通过复合函数来求。还 要注意,这样做最后的表达式前面会有个负号。

所以,微分结果是这样的:
接下来是 v 对 θj 的微分:
这个看上去有点麻烦,不过其实我们已经知道了 sigmoid 函数的 微分是这样的,所以用这个应该就可以计算了。

现在 fθ(x)本身就是 sigmoid 函数,所以这个微分表达式可以直接使用。
设 z = θTx,然后再一次使用复合函数的微分会比较好。

v 对 z 微分的部分也就是 sigmoid函数的微分。
z 对 θj 的微分就简单了。
接下来把结果相乘就好了:
我们就代入各个结果,然后通过展开、约分,使表达式 变得更简洁。

接下来要做的就是从这个表达式导出参数更新表达式。不过现在是以最大化为目标,所以必须按照与最小化时相反的方向移动参数哦。也就是说,最小化时要按照与微分结果的符号相反的 方向移动,而最大化时要与微分结果的符号同向移动。

为了与回归时的符号保持一致,也可以将表达式调整为下面这样。注意,η 之前的符号和∑中的符号反转了。
这就是我们最终求得的结果表达式:
示例:以下是一个对数似然相似率的计算示例,基于用户偏好商品的数据:假设有两个用户A和用户B,他们的商品偏好可以用以下矩阵表示:
其中,矩阵的行代表用户A和用户B,列代表不同的商品集合(例如,a,b,c表示用户A偏好的商品,d表示用户B特有的偏好商品,e,f表示用户A和用户B都非偏好的商品)。
为了计算对数似然相似率,首先需要计算行熵、列熵和矩阵熵。熵是衡量不确定性的一个指标,这里使用熵来表示用户在选择商品时的不确定性。
-
计算行熵:
对于用户A,行熵为商品a,b,c和商品e,f的熵之和(因为用户A对d没有偏好,所以d的熵在计算用户A的行熵时不考虑)。
对于用户B,行熵为商品a,b,c、商品d和商品e,f的熵之和。
-
计算列熵:
对于商品a,b,c,列熵为用户A和用户B在该商品集合上的熵之和。
对于商品d,列熵仅为用户B的熵(因为用户A对d没有偏好)。
对于商品e,f,列熵为用户A和用户B在该商品集合上的熵之和。
-
计算矩阵熵:
矩阵熵是整个矩阵所有元素的熵之和。
在计算熵时,通常使用以下公式:
Entropy = -Σ(p_i * log(p_i))
其中,p_i是某个商品或商品集合被用户选择的概率。
-
计算对数似然相似率:
对数似然相似率通常定义为:
Similarity = 1 - 2 * (MatrixEntropy - RowEntropy - ColumnEntropy)
其中,MatrixEntropy是矩阵熵,RowEntropy是所有行熵的平均值,ColumnEntropy是所有列熵的平均值。
请注意,上述计算示例是一个简化的版本,实际计算时可能还需要考虑其他因素,如平滑处理(例如,当某个商品集合的偏好数量为0时,直接计算熵会导致对数运算中的错误)。
由于具体的计算涉及复杂的数学运算和编程实现,这里无法直接给出数值结果。但你可以根据上述步骤和公式,使用编程语言(如Python、MATLAB等)来实现对数似然相似率的计算。
此外,不同的实现和定义可能会有所差异,因此在实际应用中,建议查阅相关文献或资料以获取准确的计算方法。
对数似然相似率的优缺点
优点:
- 简化计算:对数似然相似率通过取对数,将原本复杂的乘积计算转化为更简单的求和计算,大大简化了计算过程。
- 易于理解:对数似然相似率基于似然函数,而似然函数在统计学中具有明确的定义和直观的解释,使得对数似然相似率也易于理解和应用。
缺点:
- 对模型依赖性强:对数似然相似率的计算依赖于特定的模型和数据分布,不同的模型和数据分布可能导致不同的相似度评估结果。
- 对异常值敏感:由于对数似然函数涉及概率计算,因此它对数据中的异常值较为敏感,异常值可能导致相似度评估的偏差。
对数似然相似率的应用场景
对数似然估计广泛应用于统计学和机器学习中,如参数估计、模型选择、假设检验等。例如,在机器学习中,它被用于线性回归、逻辑回归、朴素贝叶斯等模型的参数估计。
对数似然相似率在多个领域都有广泛的应用,包括但不限于:
- 机器学习:在分类算法中,对数似然相似率可以用于评估不同分类模型在给定数据上的拟合程度,从而选择最优模型。
- 统计学:在统计分析中,对数似然相似率可以用于比较不同数据集之间的相似性,以及评估模型对数据的拟合效果。
- 信息检索:在信息检索领域,对数似然相似率可以用于衡量文档与查询之间的相似程度,从而帮助实现更精确的文档检索。
对数似然相似率的注意事项
在使用对数似然相似率时,需要注意以下几点:
- 模型选择:选择合适的模型和数据分布是对数似然相似率准确评估的关键。应根据实际应用场景和数据特点,选择最合适的模型和数据分布进行计算。
- 异常值处理:由于对数似然相似率对异常值敏感,因此在进行相似度评估前,应对数据中的异常值进行识别和处理,以减少它们对评估结果的影响。
- 结果解释:对数似然相似率的结果是一个相对值,它反映了两个数据集或模型在给定参数下的相似程度。在解释结果时,应结合具体应用场景和数据特点进行综合分析,避免过度解读或误解。
互信息/信息增益(Mutual Information/Information Gain)
互信息(Mutual Information,MI)和信息增益(Information Gain)是信息论和机器学习中重要的概念。
- 互信息是信息论中一个极其重要的概念,它衡量了两个变量之间共享信息的量,即两个随机变量之间的统计依赖性。
- 信息增益则是数据挖掘和机器学习中用于评估特征对目标变量的影响力的重要指标,它基于信息理论中的熵概念,用于衡量一个特征提供了多少信息,或者说,由于知道某个特征的信息而导致的数据集不确定性的减少量。
互信息原理
互信息的计算依赖于两个随机变量的联合概率分布和边缘概率分布。
其公式为MI(X;Y) = ∑ p(x,y) log(p(x,y)/(p(x)p(y))),其中p(x,y)是X和Y的联合概率,p(x)和p(y)分别是X和Y的边缘概率。
互信息的值越大,说明两个变量共享的信息量越多,相互之间的依赖性也越强。
基于信息论,计算两个随机变量的联合分布与各自边缘分布之间的差异,公式为I(X;Y)=H(X)+H(Y)−H(X,Y)I(X;Y)=H(X)+H(Y)−H(X,Y),其中H(X)H(X)和H(Y)H(Y)分别是变量X和Y的熵,H(X,Y)H(X,Y)是它们的联合熵。
以下是一个互信息的计算示例,使用Python中的scikit-learn库来实现:
示例:使用mutual_info_regression计算回归问题中的互信息
-
安装必要的库(如果还未安装):
pip install scikit-learn -
生成或加载数据:
在这个示例中,我们将生成一个回归数据集。
from sklearn.datasets import make_regression # 生成回归数据集 X, y = make_regression(n_samples=100, n_features=5, noise=0.1) -
计算互信息:
使用
mutual_info_regression函数来计算特征和目标变量之间的互信息。
from sklearn.feature_selection import mutual_info_regression
# 计算互信息
mi = mutual_info_regression(X, y)
# 输出各特征的互信息
print("Feature Mutual Information:", mi)
示例:使用mutual_info_classif计算分类问题中的互信息
-
安装必要的库(如果还未安装):
pip install scikit-learn -
加载数据集:
在这个示例中,我们将使用Iris数据集。
from sklearn.datasets import load_iris
# 加载分类数据集(如 Iris 数据集)
data = load_iris()
X = data.data # 特征矩阵
y = data.target # 目标变量
-
计算互信息:
使用
mutual_info_classif函数来计算特征和目标变量之间的互信息。
from sklearn.feature_selection import mutual_info_classif
# 计算互信息
mi = mutual_info_classif(X, y)
# 输出各特征的互信息
print("Feature Mutual Information:", mi)
注意事项
- 在计算互信息时,确保你的数据类型(分类或回归问题)与所选用的函数(
mutual_info_regression或mutual_info_classif)相匹配。 - 互信息的值越大,表示两个变量之间的关系越紧密。在特征选择中,可以选择互信息较高的特征作为模型训练的输入,以提高模型的性能。
- 对于大数据集或高维数据,计算互信息可能会比较耗时。在实际应用中,可以考虑使用更高效的算法或并行计算来加速计算过程。
以上示例展示了如何使用scikit-learn库中的函数来计算互信息。你可以根据自己的数据和需求,调整代码中的参数和函数来实现互信息的计算。
信息增益原理
信息增益的计算基于数据集的熵和条件熵。通过计算父节点的信息熵与子节点的加权平均信息熵之差来衡量,是决策树算法中基于信息论的关键概念
熵是随机变量的不确定性度量,而条件熵则是在给定某个特征条件下的不确定性度量。
信息增益的公式为IG(T, F) = H(T) – H(T|F),其中H(T)是数据集T的熵,H(T|F)是在特征F的条件下数据集T的条件熵。
信息增益反映了由于知道特征F的信息而导致的数据集不确定性的减少量。
信息增益(Information Gain)是数据挖掘和机器学习中用于评估特征对目标变量影响力的重要指标。
示例:使用信息增益选择最佳分裂特征
假设我们有一个简单的二元分类问题,数据集包含10个样本,目标变量分为两个类别:“是”或“否”。特征A有两个可能的取值:A1和A2。
数据集:
计算步骤:
-
计算整个数据集的信息熵H(D):
- 目标变量为“是”的样本有4个,概率为4/10 = 0.4。
- 目标变量为“否”的样本有6个,概率为6/10 = 0.6。
H(D) = -(0.4 * log2(0.4) + 0.6 * log2(0.6)) ≈ 0.971
-
计算特征A条件下的条件熵H(D|A):
-
对于A1:
- A1条件下,“是”的样本有3个,概率为3/4 = 0.75;“否”的样本有1个,概率为1/4 = 0.25。
- H(D|A1) = -(0.75 * log2(0.75) + 0.25 * log2(0.25)) ≈ 0.811
-
对于A2:
- A2条件下,“是”的样本有1个,概率为1/6 ≈ 0.167;“否”的样本有5个,概率为5/6 ≈ 0.833。
- H(D|A2) = -(0.167 * log2(0.167) + 0.833 * log2(0.833)) ≈ 0.646
-
加权平均条件熵H(D|A):
- A1的概率为4/10 = 0.4,A2的概率为6/10 = 0.6。
H(D|A) = 0.4 * H(D|A1) + 0.6 * H(D|A2) = 0.4 * 0.811 + 0.6 * 0.646 ≈ 0.71
-
-
计算信息增益G(D,A):
G(D,A) = H(D) - H(D|A) = 0.971 - 0.71 ≈ 0.26
结果分析:
- 特征A的信息增益为0.26。这个值表示,通过使用特征A来划分数据集,数据集的不确定性减少了0.26比特。
- 在决策树算法中,通常会选择信息增益最大的特征来进行数据集的划分。因此,在这个例子中,特征A是一个很好的候选特征用于分裂节点。
请注意,上述计算示例是基于简化的数据和假设进行的。在实际应用中,数据集可能更加复杂,包含更多的样本和特征。此外,决策树算法还可能考虑其他因素(如基尼指数、增益率等)来选择最佳分裂特征。
优缺点
-
互信息:
- 优点:能够衡量两个变量之间的非线性关系,不受变量类型限制。能够捕捉线性和非线性关系,适用于任何类型的变量关系。
- 缺点:计算复杂度较高,特别是在高维数据集中;对于稀有事件可能过于敏感。
-
信息增益:
- 优点:在决策树算法中,信息增益能够有效地选择最能将数据集分割成不同类别的特征,提高模型的预测准确性。在决策树算法中广泛应用,能够有效选择特征,提高模型性能。
- 缺点:可能偏向于选择具有较多取值的特征;对于具有相同信息量的特征,可能无法区分其重要性。只考察特征对整个系统的贡献,不适合做“本地”的特征选择。
应用场景
- 互信息:广泛应用于特征选择、聚类分析、图像配准、生物信息学等领域,用于评估变量之间的相关性或依赖性。
- 特征选择:在机器学习中,用于挑选与目标变量最相关的特征。
- 数据挖掘:发现数据集中隐藏的关联规则。
- 信息检索:评估查询词和文档的相关性。
- 信息增益:主要用于决策树算法的构建,在数据挖掘、机器学习、分类问题等场景中发挥着重要作用。通过选择信息增益最大的特征进行分支,可以构建出更加高效准确的决策树模型。
- 决策树构建:在构建决策树时,用于选择最佳分裂特征。
- 文本挖掘:在文本分类任务中,如情感分析、主题建模等,通过信息增益选择特征,提高模型处理速度和准确性。
注意事项
- 在使用互信息时,需要注意计算复杂度和对稀有事件的敏感性,可能需要进行适当的平滑处理或剪枝策略。
- 在使用信息增益时,需要注意避免过拟合问题,可以通过设置停止条件或剪枝策略来控制决策树的生长。同时,对于具有相同信息量的特征,可能需要结合其他指标(如基尼指数、增益率等)来进行综合评估。
信息熵(Information Entropy)
信息熵是衡量分布的混乱程度或分散程度的一种度量。分布越分散(或者说分布越平均),信息熵就越大。分布越有序(或者说分布越集中),信息熵就越小。
信息熵是信息论中的核心概念,用于量化一个随机变量的不确定性或“惊讶”程度。
信息熵原理
信息熵的数学表达式为:H(X) = -Σ P(x) * log(P(x)),其中H(X)表示随机变量X的熵,P(x)表示X取值为x的概率。
这个公式用于衡量数据集的混乱程度或不确定性:
- 信息熵越高,表示随机变量的不确定性越大;
- 反之,信息熵越低,表示随机变量的不确定性越小。
示例:计算一个简单数据集的信息熵
假设我们有一个数据集D,包含10个样本,用于预测某人是否会外出。其中有3个样本为“是”(外出),2个样本为“否”(不外出),剩余5个样本为“可能”(不确定)。我们可以计算这个数据集的信息熵来衡量其不确定性。

计算步骤:
-
计算每个类别的概率:
- “是”的概率:p(是) = 3/10 = 0.3
- “否”的概率:p(否) = 2/10 = 0.2
- “可能”的概率:p(可能) = 5/10 = 0.5
-
使用信息熵公式计算:
-
H(D) = - Σ p(x) * log₂(p(x))
-
H(D) = - (p(是) * log₂(p(是)) + p(否) * log₂(p(否)) + p(可能) * log₂(p(可能)))
-
H(D) = - (0.3 * log₂(0.3) + 0.2 * log₂(0.2) + 0.5 * log₂(0.5))
-
H(D) ≈ - (0.3 * (-1.585) + 0.2 * (-1.609) + 0.5 * (-1))
-
H(D) ≈ - (0.3 * -1.585 + 0.2 * -1.609 + 0.5 * -1)
-
H(D) ≈ - (-0.4755 + -0.3218 + -0.5)
-
H(D) ≈ - (-1.2973)
-
H(D) ≈ 1.2973
-
结果分析:
- 数据集D的信息熵约为1.2973比特。这个值表示,在给定数据集D的情况下,每次对“是否外出”进行预测时,平均需要1.2973比特的信息来消除不确定性。
- 信息熵的值越高,表示数据集的混乱程度越高,不确定性越大。在这个例子中,由于“可能”这个类别的概率较高(0.5),导致整体的不确定性较高,因此信息熵也相对较高。
请注意,在实际应用中,信息熵的计算可能涉及更复杂的数据集和概率分布。此外,对于连续变量或具有大量可能取值的离散变量,通常需要先进行离散化处理或采用其他方法来估计概率分布。
信息熵优缺点
优点:
- 信息熵能够量化信息的不确定性,为信息处理和传输提供了理论基础。
- 在数据挖掘和机器学习中,信息熵是特征选择和模型评估的重要指标,有助于提高模型的准确性和效率。
缺点:
- 信息熵的计算依赖于概率分布,对于复杂或未知的概率分布,计算可能较为困难。
- 信息熵只能反映数据的整体不确定性,无法提供关于数据具体分布或结构的详细信息。
信息熵应用场景
- 特征选择:在数据挖掘和机器学习中,通过计算每个特征的信息增益(即特征划分数据集前后的信息熵差值),可以评估特征的重要性,从而选择对模型预测效果最有帮助的特征。
- 决策树构建:信息熵是决策树算法(如ID3、C4.5等)中用于选择最优分裂点的重要指标。通过比较不同特征划分数据集后的信息熵,可以选择能够最大程度降低数据集不确定性的特征作为分裂点,从而提高决策树的准确性和效率。
- 聚类分析:信息熵也可以用于聚类分析中,通过衡量不同类别的混乱程度来评估聚类的效果。
- 通信系统设计:在信息论中,信息熵被用于评估通信系统的传输效率和可靠性,为通信系统的设计和优化提供理论基础。用于预测无噪声信道所能够承载的最大信息量,即香农信道容量。
- 市场分析和预测:帮助理解市场的不确定性和波动,提高预测能力。
- 生物信息学:在基因组序列分析中,用于了解基因组的复杂性和进化中的重要性。
- 经济与社会科学:分析市场波动、财富分布以及社会行为模式。
- 自然语言处理:评估语言模型的复杂性和语言的多样性。
- 信息安全:评估密码的强度,高熵密码安全性更高。
信息熵注意事项
在使用信息熵时,应注意其假设条件,如数据分布的假设,以及计算过程中可能涉及的数值稳定性和精度问题。
- 在计算信息熵时,需要确保概率分布的准确性和完整性,否则可能导致计算结果的不准确。
- 信息熵只能反映数据的整体不确定性,对于具体的数据分布或结构特征,需要结合其他指标或方法进行综合分析。
- 在应用信息熵进行特征选择或决策树构建时,需要注意过拟合问题,避免选择过多或过于复杂的特征导致模型泛化能力下降。
相对熵/KL散度(Kullback-Leibler Divergence)
相对熵/KL散度是信息论中用于度量两个概率分布之间差异的重要概念。
相对熵,也被称为Kullback-Leibler散度(简称KL散度),是信息论中用于量化两个概率分布P和Q之间差异的一种标准。
KL散度(Kullback-Leibler Divergence)是相对熵的一个特例,它表示两个概率分布之间的差异。
它起源于信息论的研究,特别是在信息传输、存储和处理过程中,用于衡量信息的损失程度。
相对熵/KL散度原理
熵
![]()
- 熵的定义表明了一个事件所含有的信息量,上式中xixi表示一个事件,P(xi)P(xi)表示该事件发生的概率。由定义可知,如果某事件发生概率为1,则它的熵为0。
- 独立事件的信息量可叠加。
- 由于事件发生的概率在[0,1]之间,因此熵的定义中有负号,来抵消负的对数函数值,使得最终计算得到的熵是正的。
- 需要注意的是,熵都是基于概率计算的,具体计算中跟样本取值没有关系。
KL散度(相对熵)定义

对于离散型随机变量,信息熵公式如下:
对于连续型随机变量,信息熵公式如下:
在信息论中,相对熵等价于两个概率分布的信息熵的差值,若其中一个概率分布为真实分布,另一个为理论(拟合)分布,则此时相对熵等于交叉熵与真实分布的信息熵之差,表示使用理论分布拟合真实分布时产生的信息损耗 。

![]()
上面就是:交叉熵与真实分布的信息熵之差.
因此该公式的字面上含义就是真实事件的信息熵与理论拟合的事件的香农信息量与真实事件的概率的乘积的差的累加。
比较难懂的是![]()
示例:比如随机变量X ∼ P X \sim PX∼P取值为1,2,3时的概率分别为[0.1,0.4,0.5],随机变量Y ∼ Q Y \sim QY∼Q取值为1,2,3时的概率分别为[0.4,0.2,0.4],则:

也就是用P来拟合Q和用Q来拟合P的相对熵居然不一样,而他们的距离是一样的。
这也就是说,相对熵的大小并不跟距离有一一对应的关系。
示例:计算两个离散概率分布之间的相对熵
假设我们有两个离散概率分布P和Q,它们分别表示某个随机变量的可能取值及其对应的概率。
概率分布P和Q:
- 分布P:P={p1,p2,p3}={0.2,0.5,0.3}
- 分布Q:Q={q1,q2,q3}={0.3,0.4,0.3}



请注意,在实际应用中,相对熵的计算可能涉及更复杂的数据集和概率分布。此外,当处理连续概率分布时,需要使用积分形式来计算相对熵。在这个示例中,我们使用了离散概率分布和求和形式来计算相对熵。
交叉熵
![]()
- 交叉熵表示从事件A的角度看,如何描述事件B。
- 事件A与B的交叉熵形式上就是A与B的KL散度公式中的后半部分。
- A与B的交叉熵=A与B的KL散度-A的熵。
- 交叉熵不具有对称性。
- 交叉熵在机器学习分类任务中计算方式如下:

相对熵/KL散度优缺点
优点:
- 相对熵能够量化两个概率分布之间的差异,为信息处理和传输提供了理论基础。
- 在机器学习、深度学习和自然语言处理等领域,相对熵被广泛应用于特征选择、模型评估和优化等任务。
缺点:
- 相对熵不是对称的,即
,这可能导致在某些应用场景下需要谨慎使用。 - 当Q中的某些概率值非常小或为零时,相对熵的计算可能会变得不稳定或无穷大。
相对熵/KL散度应用场景
- 机器学习:在机器学习中,相对熵常用于特征选择和模型评估。通过计算特征与目标变量之间的相对熵,可以评估特征的重要性,从而选择对模型预测效果最有帮助的特征。
- 深度学习:在深度学习中,相对熵常用于优化算法,如梯度下降法中的损失函数。通过最小化相对熵,可以使得模型的预测分布更加接近真实分布。
- 自然语言处理:在自然语言处理中,相对熵可以用于衡量两个文本分布之间的差异,如不同语言模型之间的比较和评估。
- 信息传输:在信息传输过程中,相对熵可以用于衡量信息的损失程度,从而优化传输策略和提高传输效率。
机器学习与交叉熵
- 在机器学习的有监督分类任务中通常采用交叉熵作为损失函数,本质上是对KL散度的一种简化。
- 概率论中,随机变量是随机事件的一种数学表示,随机变量的分布则是一个函数,将随机变量的不同取值映射到该取值发生的概率上。
- 在有监督分类任务中,我们最终训练得到的分类模型本质上就是一个映射,将一个样本映射到该样本发生的概率上(通常对分类结果进行归一化,softmax),因此,训练的目的本质上就是为了学习一个映射,相当于学习一个随机变量的分布。假设每条数据样本均为独立同分布采样,我们希望学习到的分布与真实分布相同,但是由于真实分布无法获得(不可能采集到所有样本),因此用训练集的分布来代替真实分布,因此可以用训练集分布(真实分布)关于模型分布的KL散度作为损失函数,希望模型训练得到的分布尽可能与真实分布一致。
- 由于KL散度的公式中的第一项是真实分布的熵,而我们是用训练集的分布来代替的真实分布,在机器学习模型的优化过程中训练集的分布是不会改变的,无法优化。因此为了简单起见,可以只使用KL散度的第二项作为损失函数,即交叉熵作为损失函数。
- 在具体实现中,可以认为训练集中(样本,类别)-> 概率 表示了一种真实分布,当然这里的概率一般采用one-hot编码表示。比如(样本1,猫)-> 1 表示(样本1,猫)发生的概率为1,那么当然这个样本一定是属于猫这一类。在模型预测的输出中,会输出一个分类向量,分类向量每个元素分别表示样本1属于某一类的概率,计算真实概率与模型输出之间的交叉熵即可作为模型损失。
- 刚开始学机器学习时总觉得困惑的有两点,一是既然模型训练的目的是学习数据的真实分布,那么为什么计算损失的时候只计算标签和输出之间的损失,是怎么跟数据的分布联系起来的,实际上计算分布之间的差异用的就是概率,没有用到实际的样本值。二是会认为数据样本是随机变量的取值,而对应的类别是概率,但实际上数据样本和类别都是数据的一部分,标签是对应的概率,在具体实现中是没有类别对应的具体的数字的,而是以概率或者说标签来给出了类别。因此,模型输出的n维预测向量隐式表示了随机向量n个取值(虽然我们看到的只有一个数据样本,但是与隐含的n个类别一起形成了n个取值)对应的概率,且这些概率相加为1,有取值有概率,可以看成是个分布,当然可以用交叉熵来表示差异。这样问题又来了,相当于每个训练样本都对应了一个分布,然后针对每个训练样本计算交叉熵,通过拟合每个样本,最终拟合整个训练集?
- 交叉熵实际上计算的是标签与输出分布之间的交叉熵。
相对熵/KL散度注意事项
- 在使用相对熵时,需要确保概率分布的准确性和完整性,否则可能导致计算结果的不准确。
- 相对熵不是对称的,因此在比较两个概率分布时,需要明确指定哪个分布是参考分布(即Q)。
- 当Q中的某些概率值非常小或为零时,需要采取适当的处理方法来避免计算不稳定或无穷大的情况。例如,可以对Q进行平滑处理或设置一个最小概率值。
词频-逆文档频率(TF-IDF)
详细参考:科普文:Java基础之算法系列【文本相似度判定算法:手搓余弦相似度(Cosine Similarity)+TF-IDF(词频-逆文档频率)】-CSDN博客
TF-IDF(Term Frequency-Inverse Document Frequency)是信息检索、自然语言处理(NLP)和文本分析领域最常用的相关性算法之一。
它用于评估一个词在文档集合中的重要性,由词频(TF)和逆文档频率(IDF)两个部分组成。
词频-逆文档频率(TF-IDF)的原理:
-
词频(TF):词频表示某个词在文档中出现的频率。一般来说,某个词在文档中出现的频率越高,它对该文档的贡献也就越大。词频的计算公式通常为词在文档中出现的次数除以文档的总词数,以进行归一化处理。
-
逆文档频率(IDF):逆文档频率表示一个词在整个文档集合中出现的稀有程度。若某个词出现在大部分文档中,则它的信息价值较低,IDF值较小;反之,若词语在文档中较为罕见,IDF值较大。IDF的计算公式通常为文档总数的对数除以包含该词的文档数量加一,以避免分母为零的情况。
-
TF-IDF值:TF-IDF值是词频和逆文档频率的乘积,它帮助评估一个词对某个文档的重要性。TF-IDF值越大,说明该词对文档的区分能力越强,越适合作为文档的关键词。
词频-逆文档频率(TF-IDF)示例数据
假设我们有以下三个文档:
- 文档1: "我喜欢吃苹果。"
- 文档2: "我喜欢吃香蕉。"
- 文档3: "苹果和香蕉都很好吃。"
1. 计算词频(TF)
首先,计算每个词在每个文档中的词频(TF)。
-
文档1: "我喜欢吃苹果。"
- 总词数: 4
- "我": 1次, TF("我", 文档1) = 1/4 = 0.25
- "喜欢": 1次, TF("喜欢", 文档1) = 1/4 = 0.25
- "吃": 1次, TF("吃", 文档1) = 1/4 = 0.25
- "苹果": 1次, TF("苹果", 文档1) = 1/4 = 0.25
-
文档2: "我喜欢吃香蕉。"
- 总词数: 4
- "我": 1次, TF("我", 文档2) = 1/4 = 0.25
- "喜欢": 1次, TF("喜欢", 文档2) = 1/4 = 0.25
- "吃": 1次, TF("吃", 文档2) = 1/4 = 0.25
- "香蕉": 1次, TF("香蕉", 文档2) = 1/4 = 0.25
-
文档3: "苹果和香蕉都很好吃。"
- 总词数: 6
- "苹果": 1次, TF("苹果", 文档3) = 1/6 ≈ 0.17
- "和": 1次, TF("和", 文档3) = 1/6 ≈ 0.17
- "香蕉": 1次, TF("香蕉", 文档3) = 1/6 ≈ 0.17
- "都": 1次, TF("都", 文档3) = 1/6 ≈ 0.17
- "很": 1次, TF("很", 文档3) = 1/6 ≈ 0.17
- "好吃": 1次, TF("好吃", 文档3) = 1/6 ≈ 0.17
2. 计算逆文档频率(IDF)
计算每个词在整个文档集合中的逆文档频率(IDF)。
- 文档总数: 3
- 包含"我"的文档数: 2, IDF("我") = log(3/(2+1)) = log(3/3) = 0
- 包含"喜欢"的文档数: 2, IDF("喜欢") = log(3/(2+1)) = log(3/3) = 0
- 包含"吃"的文档数: 2, IDF("吃") = log(3/(2+1)) = log(3/3) = 0
- 包含"苹果"的文档数: 2, IDF("苹果") = log(3/(2+1)) = log(3/3) = 0
- 包含"香蕉"的文档数: 2, IDF("香蕉") = log(3/(2+1)) = log(3/3) = 0
- 包含"和"的文档数: 1, IDF("和") = log(3/(1+1)) = log(3/2)
- 包含"都"的文档数: 1, IDF("都") = log(3/(1+1)) = log(3/2)
- 包含"很"的文档数: 1, IDF("很") = log(3/(1+1)) = log(3/2)
- 包含"好吃"的文档数: 1, IDF("好吃") = log(3/(1+1)) = log(3/2)
3. 计算TF-IDF值
将每个词在每个文档中的词频(TF)与其逆文档频率(IDF)相乘,得到TF-IDF值。
-
文档1:
- "我": 0.25 * 0 = 0
- "喜欢": 0.25 * 0 = 0
- "吃": 0.25 * 0 = 0
- "苹果": 0.25 * 0 = 0
-
文档2:
- "我": 0.25 * 0 = 0
- "喜欢": 0.25 * 0 = 0
- "吃": 0.25 * 0 = 0
- "香蕉": 0.25 * 0 = 0
-
文档3:
- "苹果": 0.17 * 0 = 0
- "和": 0.17 * log(3/2)
- "香蕉": 0.17 * 0 = 0
- "都": 0.17 * log(3/2)
- "很": 0.17 * log(3/2)
- "好吃": 0.17 * log(3/2)
注意事项
- 在实际计算中,IDF的分母通常需要加1,以防止分母为零。
- 在这个示例中,由于所有文档都很短且词汇重复率高,导致很多词的IDF值为0。在实际应用中,更丰富的文档集合和更多样化的词汇将产生更有意义的TF-IDF值。
- TF-IDF值越大,表示该词在该文档中越重要,且在整个文档集合中越稀有。
最长公共子序列(Longest Common Subsequence, LCS)
最长公共子序列(Longest Common Subsequence,简称LCS)是计算机科学中的一个经典问题,主要用于在两个或多个序列中查找最长的公共子序列的问题。
一个数列如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则称为已知序列的最长公共子序列。最长公共子序列问题是一个经典的计算机科学问题,也是数据比较程序(如Diff工具)和生物信息学应用的基础。
最长公共子序列(LCS)的原理
LCS问题通常使用动态规划(Dynamic Programming,简称DP)来解决。
最长公共子序列的原理基于动态规划。
其核心思想是将复杂问题分解为更小的子问题,并存储这些子问题的解,以避免重复计算。通过定义一个二维数组dp,其中dp[i][j]表示序列A的前i个元素和序列B的前j个元素的最长公共子序列的长度,然后通过状态转移方程来填充这个数组。
动态规划通过分解原问题为更小的子问题,并存储这些子问题的解来避免重复计算。对于LCS问题,动态规划算法使用一个二维数组来存储子序列的长度。通过逐步填充这个二维数组,最终可以得到最长公共子序列的长度。如果需要找到具体的子序列,还可以根据这个二维数组进行回溯。
最长公共子序列(LCS)示例数据
假设我们有两个字符串:
- 字符串1: "ABCDEF"
- 字符串2: "ACEFHB"
计算过程
-
构造二维数组:
我们构造一个二维数组
c[i][j],其中c[i][j]表示字符串1的前i个字符和字符串2的前j个字符的最长公共子序列的长度。数组的行数等于字符串1的长度加1,列数等于字符串2的长度加1。 -
初始化数组:
将数组的第一行和第一列全部初始化为0,因为空字符串与任何字符串的最长公共子序列长度都是0。
-
填充数组:
从数组的第二个元素(索引为1)开始,根据以下规则填充数组:
对于我们的示例:
- 如果
字符串1[i-1] == 字符串2[j-1],则c[i][j] = c[i-1][j-1] + 1。 - 如果
字符串1[i-1] != 字符串2[j-1],则c[i][j] = max(c[i-1][j], c[i][j-1])。 -
| | A | B | C | D | E | F | |-----|---|---|---|---|---|---| | | 0 | 0 | 0 | 0 | 0 | 0 | |-----|---|---|---|---|---|---| | | 0 | 1 | 1 | 1 | 1 | 1 | |-----|---|---|---|---|---|---| | | 0 | 1 | 1 | 1 | 2 | 2 | |-----|---|---|---|---|---|---| | | 0 | 1 | 2 | 2 | 2 | 3 | |-----|---|---|---|---|---|---| | | 0 | 1 | 2 | 2 | 2 | 3 | |-----|---|---|---|---|---|---| | | 0 | 1 | 2 | 2 | 2 | 3 | |-----|---|---|---|---|---|---| | | 0 | 1 | 1 | 1 | 1 | 2 |
- 如果
-
读取结果:
数组
c[m][n](其中m是字符串1的长度,n是字符串2的长度)中的值即为最长公共子序列的长度。在我们的示例中,c = 3,因此最长公共子序列的长度为3。 -
回溯找到最长公共子序列:
为了找到具体的最长公共子序列,我们可以从
c[m][n]开始回溯。如果c[i][j] == c[i-1][j-1] + 1,则说明最长公共子序列包含字符串1[i-1],我们将其加入结果序列,并继续回溯c[i-1][j-1]。如果c[i][j] == c[i-1][j],则说明最长公共子序列不包含字符串1[i-1],我们回溯c[i-1][j]。如果c[i][j] == c[i][j-1],则说明最长公共子序列不包含字符串2[j-1],我们回溯c[i][j-1]。对于我们的示例,回溯过程如下:
- 从
c开始,因为c == c + 1,所以最长公共子序列包含F,回溯到c。 - 因为
c == c + 1,所以最长公共子序列包含E,回溯到c。 - 因为
c == c + 1,所以最长公共子序列包含C,回溯到c。 - 因为
c不能再通过c[i-1][j-1] + 1的方式得到,所以最长公共子序列回溯结束,结果为"CEF"。
- 从
最长公共子序列(LCS)的优缺点
优点:LCS算法灵活,可以应用于不同类型的文本比对,如代码、自然语言文本等;精确性高,能够准确识别出两个文本之间的相似性,有助于定位差异。
- 高效性:动态规划算法可以在多项式时间内解决LCS问题,时间复杂度为O(n2),其中n是两个序列中较长的长度。
- 实用性:LCS可以描述两段文字之间的“相似度”,即它们的雷同程度,从而用来辨别抄袭、版本控制等。
缺点:时间复杂度较高,对于非常长的文本,可能需要较长的计算时间;空间复杂度也较高,需要存储中间结果,对于非常大的文本,可能需要较大的内存空间。
- 空间复杂度:虽然动态规划算法的时间复杂度是O(n2),但其空间复杂度也是O(n2),需要存储一个二维数组。
- 非唯一性:最长公共子序列可能不唯一,算法通常只返回其中一个。
最长公共子序列(LCS)的应用场景
LCS问题广泛应用于文本比较、生物信息学、版本控制等领域。
例如,在文本修改前后对照中,LCS可以用于比较两个文本之间的差异,如版本控制系统中,当用户提交了新的代码版本时,系统会使用LCS算法来找出旧版本和新版本之间的最小编辑距离。
在生物信息学中,LCS用于比较DNA序列,寻找两条基因序列的相似性。
此外,在音乐处理中,可以找出发音相似的乐句;在自然语言处理中,帮助计算两个句子的语义相似度。
- 版本控制:如Git用来调和文件之间的改变。
- 数据比较:如Diff工具比较两个文件的不同。
- 生物信息学:比较DNA或蛋白质序列的相似性。
- 防抄袭系统:检查论文的抄袭率。
- 程序代码相似度度量:评估两段代码的相似度。
最长公共子序列(LCS)的注意事项
- 子序列与子串的区别:子序列不要求元素在原序列中连续,而子串要求连续。这是LCS与最长公共子串问题的主要区别。
- 算法实现:在实际应用中,需要注意边界条件的处理和动态规划表的填充顺序。
- 性能优化:虽然动态规划算法的时间复杂度是O(n2),但在某些特殊情况下,可以通过其他算法(如启发式搜索)进行性能优化。
- 多序列LCS:对于多于两个序列的LCS问题,其复杂度更高,且通常属于NP-hard问题。
综上所述,最长公共子序列(LCS)是一个强大且实用的工具,广泛应用于计算机科学和生物信息学等领域。但在使用时,需要注意其算法原理、优缺点以及应用场景,以确保其有效性和准确性。
更多推荐


所有评论(0)