什么是相关性

我们曾经讲过,默认情况下,返回结果是按相关性倒序排列的。 但是什么是相关性? 相关性如何计算?

每个文档都有相关性评分,用一个正浮点数字段 _score 来表示 。 _score 的评分越高,相关性越高。

查询语句会为每个文档生成一个 _score 字段。评分的计算方式取决于查询类型 不同的查询语句用于不同的目的: fuzzy 查询会计算与关键词的拼写相似程度,terms 查询会计算 找到的内容与关键词组成部分匹配的百分比,但是通常我们说的 relevance 是我们用来计算全文本字段的值相对于全文本检索词相似程度的算法。

Elasticsearch 的相似度算法 被定义为检索词频率/反向文档频率, TF/IDF ,包括以下内容:

检索词频率 检索词在该字段出现的频率?出现频率越高,相关性也越高。 字段中出现过 5 次要比只出现过 1 次的相关性高。 反向文档频率 每个检索词在索引中出现的频率?频率越高,相关性越低。检索词出现在多数文档中会比出现在少数文档中的权重更低。 字段长度准则 字段的长度是多少?长度越长,相关性越低。 检索词出现在一个短的 title 要比同样的词出现在一个长的 content 字段权重更大。

单个查询可以联合使用 TF/IDF 和其他方式,比如短语查询中检索词的距离或模糊查询里的检索词相似度。

相关性并不只是全文本检索的专利。也适用于 yes|no 的子句,匹配的子句越多,相关性评分越高。

如果多条查询子句被合并为一条复合查询语句 ,比如 bool 查询,则每个查询子句计算得出的评分会被合并到总的相关性评分中。

提示

我们有一️整章着眼于相关性计算和如何让其配合你的需求 控制相关度

理解评分标准

当调试一条复杂的查询语句时, 想要理解 _score 究竟是如何计算是比较困难的。Elasticsearch 在 每个查询语句中都有一个 explain 参数,将 explain 设为 true 就可以得到更详细的信息。

GET /_search?explain 
{
   "query"   : { "match" : { "tweet" : "honeymoon" }}
}

explain 参数可以让返回结果添加一个 _score 评分的得来依据。

注意

增加一个 explain 参数会为每个匹配到的文档产生一大堆额外内容,但是花时间去理解它是很有意义的。 如果现在看不明白也没关系 — 等你需要的时候再来回顾这一节就行。下面我们来一点点的了解这块知识点。

首先,我们看一下普通查询返回的元数据:

{
    "_index" :      "us",
    "_type" :       "tweet",
    "_id" :         "12",
    "_score" :      0.076713204,
    "_source" :     { ... trimmed ... },

这里加入了该文档来自于哪个节点哪个分片上的信息,这对我们是比较有帮助的,因为词频率和 文档频率是在每个分片中计算出来的,而不是每个索引中:

    "_shard" :      1,
    "_node" :       "mzIVYCsqSWCG_M_ZffSs9Q",

然后它提供了 _explanation 。每个 入口都包含一个 description 、 value 、 details 字段,它分别告诉你计算的类型、计算结果和任何我们需要的计算细节。

"_explanation": { 
   "description": "weight(tweet:honeymoon in 0)
                  [PerFieldSimilarity], result of:",
   "value":       0.076713204,
   "details": [
      {
         "description": "fieldWeight in 0, product of:",
         "value":       0.076713204,
         "details": [
            {  
               "description": "tf(freq=1.0), with freq of:",
               "value":       1,
               "details": [
                  {
                     "description": "termFreq=1.0",
                     "value":       1
                  }
               ]
            },
            { 
               "description": "idf(docFreq=1, maxDocs=1)",
               "value":       0.30685282
            },
            { 
               "description": "fieldNorm(doc=0)",
               "value":        0.25,
            }
         ]
      }
   ]
}

honeymoon 相关性评分计算的总结

检索词频率

反向文档频率

字段长度准则

警告

输出 explain 结果代价是十分昂贵的,它只能用作调试工具 。千万不要用于生产环境。

第一部分是关于计算的总结。告诉了我们 honeymoon 在 tweet 字段中的检索词频率/反向文档频率或TF/IDF, (这里的文档 0 是一个内部的 ID,跟我们没有关系,可以忽略。)

然后它提供了权重是如何计算的细节:

检索词频率:

检索词 `honeymoon` 在这个文档的 `tweet` 字段中的出现次数。

反向文档频率:

检索词 `honeymoon` 在索引上所有文档的 `tweet` 字段中出现的次数。

字段长度准则:

在这个文档中, `tweet` 字段内容的长度 -- 内容越长,值越小。

复杂的查询语句解释也非常复杂,但是包含的内容与上面例子大致相同。 通过这段信息我们可以了解搜索结果是如何产生的。

提示

JSON 形式的 explain 描述是难以阅读的, 但是转成 YAML 会好很多,只需要在参数中加上 format=yaml 。

理解文档是如何被匹配到的

当 explain 选项加到某一文档上时, explain api 会帮助你理解为何这个文档会被匹配,更重要的是,一个文档为何没有被匹配。

请求路径为 /index/type/id/_explain ,如下所示:

GET /us/tweet/12/_explain
{
   "query" : {
      "bool" : {
         "filter" : { "term" :  { "user_id" : 2           }},
         "must" :  { "match" : { "tweet" :   "honeymoon" }}
      }
   }
}

不只是我们之前看到的充分解释 ,我们现在有了一个 description 元素,它将告诉我们:

"failure to match filter: cache(user_id:[2 TO 2])"

也就是说我们的 user_id 过滤子句使该文档不能匹配到。








<think>好的,我现在要处理用户关于“相关性处理”的提问。首先,我需要明确用户的问题是什么。用户可能是在数据分析、统计学或者机器学习等领域遇到这个概念,需要了解其基本含义和应用。 首先,我应该从定义入手。相关性处理通常指的是分析或处理变量之间相关关系的过程。这里的“相关性”指的是变量之间的统计关系,比如线性相关。可能需要解释相关性的类型,比如正相关、负相关,或者无相关。 接下来,用户可能想知道为什么要进行相关性处理。这里需要说明应用场景,比如在数据分析中去除冗余变量,或者在特征工程中选择重要特征,或者在回归分析中避免多重共线性问题。此外,在数据预处理阶段,相关性分析可以帮助识别和处理共线性,提高模型性能。 然后,可能需要介绍常见的相关性处理方法。例如,计算相关系数,如皮尔逊相关系数、斯皮尔曼秩相关系数。还有可视化方法,比如散点图、热力图。另外,处理高相关性的方法,如主成分分析(PCA)、变量剔除或合并变量等。 同时,需要注意区分相关性和因果性。用户可能容易混淆这两者,所以需要强调相关性不等于因果关系,处理时需谨慎。 还要考虑不同领域的应用,比如金融中的风险管理,市场营销中的客户行为分析等,相关性处理在这些领域的具体应用案例。 需要检查是否有遗漏的关键点,比如如何处理非线性相关性,或者使用互信息等其他方法。此外,可能需要提到一些注意事项,比如样本量对相关性分析的影响,异常值的处理等。 最后,确保语言通俗易懂,结构清晰,分点说明,帮助用户逐步理解。同时,按照系统要求,数学公式使用正确的LaTeX格式,行内公式用$...$,独立公式用$$...$$并单独成段。 现在把这些思路组织成连贯的解释,分步骤阐述相关性处理的概念、目的、方法和注意事项,确保覆盖用户可能关心的各个方面。</think>相关性处理是指通过分析、调整或利用变量之间的相关关系,来优化数据分析结果或解决特定问题的过程。以下是逐步解释: ### 一、核心概念:什么是相关性? - **定义**:两个或多个变量之间的统计关联程度。数学上常用相关系数(如皮尔逊系数)衡量: $$ \rho_{X,Y} = \frac{\text{cov}(X,Y)}{\sigma_X \sigma_Y} $$ 其中$-1 \leq \rho \leq 1$,值越大线性相关性越强。 - **类型**: - 正相关(如气温与空调销量) - 负相关(如降水量与户外活动量) - 零相关(无显著关联) ### 二、为什么要进行相关性处理? 1. **数据降维** 去除高度相关的冗余变量(如身高和脚掌长度),降低计算复杂度。 2. **避免多重共线性** 在回归模型中,若自变量高度相关会导致系数估计不稳定。可通过方差膨胀因子(VIF)检测: $$ \text{VIF}_i = \frac{1}{1-R_i^2} $$ 通常VIF>10时需处理。 3. **特征选择** 筛选与目标变量强相关的特征(如金融风控中选择与违约率相关的指标)。 ### 三、常用处理方法 #### 步骤1:计算相关系数矩阵 示例代码输出: ``` Age Income Spending Age 1.00 0.15 -0.08 Income 0.15 1.00 0.76 Spending -0.08 0.76 1.00 ``` 发现Income与Spending强相关($\rho=0.76$)。 #### 步骤2:处理高相关性 - **剔除变量**:删除Spending或Income中的一个 - **合并变量**:创建新特征如`Income/Spending` - **主成分分析(PCA)**:将相关变量转换为线性无关的主成分 #### 步骤3:验证效果 处理后重新计算VIF或观察模型性能变化(如AUC提升、RMSE下降)。 ### 四、注意事项 1. **非线性关系** 皮尔逊系数只检测线性相关。对于非线性关系可使用互信息量: $$ I(X;Y) = \sum_{x \in X} \sum_{y \in Y} p(x,y) \log\left(\frac{p(x,y)}{p(x)p(y)}\right) $$ 2. **因果谬误** 相关≠因果。如冰淇淋销量与溺水事故正相关,实因二者均与夏季高温相关。 3. **领域特异性** - 金融:处理资产收益率相关性以分散风险 - 生物医学:分析基因表达相关性寻找致病因素 ### 五、典型案例 **电商场景**: 发现“浏览时长”与“购买转化率”强相关($\rho=0.68$),但进一步分析显示: - 因果关系:优质商品→长浏览时间→高转化 - 处理:优化商品详情页质量,而非单纯增加用户停留时间。 通过相关性处理,可更精准地制定运营策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值