怎么计算BM25?
1. BM25是什么?
一种用来评价搜索词和文档之间相关性的算法
一种基于概率检索模型提出的算法
先对搜索词进行切分,得到单词集合,然后求每个单词的分数,最后求和
每个单词的得分计算公式如下,由3部分组成:
\sum_{i \in Q \cap D} \log \frac{\left(r_{i}+0.5\right) /\left(R-r_{i}+0.5\right)}{\left(n_{i}-r_{i}+0.5\right) /\left(N-n_{i}-R+r_{i}+0.5\right)} \cdot \frac{\left(k_{1}+1\right) f_{i}}{K+f_{i}} \cdot \frac{\left(k_{2}+1\right) q f_{i}}{k_{2}+q f_{i}}K=k_{1}\left((1-b)+b \cdot \frac{\mathrm{dl}}{\mathrm{avdl}}\right)1.查询词在文档中的权重,使用的BIM模型得分,在一定的情况下该部分等价于逆文档频率$IDF$($r_i$和$R$都为$0$);$ $2.查询词和文档之间 ...
信息熵(Entropy)、交叉熵(Cross Entropy)、sigmoid、softmax、逻辑回归
1. 信息熵、交叉熵、相对熵详细解释
如何通俗的解释交叉熵与相对熵? - Peiwen的回答 - 知乎
“熵”不起:从熵、最大熵原理到最大熵模型(一)By 苏剑林
信息熵
代表随机变量X或整个系统的不确定性。
熵越大,随机变量或系统的不确定性就越大。
也是要消除这个不确定性所要付出的最小努力。
公式:H(X)=H(p)=\sum_{x}p(x)\log \frac{1}{p(x)}=-\sum_{x}p(x)\log {p(x)},其中的\log \frac{1}{p(x)}也叫做自信息
交叉熵
用来衡量在给定的真实分布下,使用非真实分布所指定的策略消除系统的不确定性所需要付出的努力的大小。
这个值越小说明该非真实分布越接近真实分布。
这也是为什么在机器学习中的分类算法中,我们总是最小化交叉熵,因为交叉熵越低,就证明由算法所产生的策略最接近最优策略,也间接证明我们算法所算出的非真实分布越接近真实分布。
公式:H(p,q)=\sum_{x}p(x)\log \frac{1}{q(x)}=-\sum_{x}p(x)\log {q(x)}
相对熵
也称KL散度,用来衡量两个取值为正的 ...
day9-递归
1. 剑指 Offer 07. 重建二叉树123456789101112131415# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode: if not preorder:return None root = TreeNode(preorder[0]) root_index = inorder.index(preorder[0]) root.left = self.buildTree(preorder[1:root_index+1],inorder[:root_index]) ...
day8-位运算
1. 剑指 Offer 15. 二进制中1的个数
1234567class Solution: def hammingWeight1(self, n: int) -> int: res = 0 while n: res+=n&1 n>>=1 return res
1234567class Solution: def hammingWeight2(self, n: int) -> int: res = 0 while n: res+=1 n&=(n-1) return res
2. 剑指 Offer 16. 数值的整数次方12345678910class Solution: def myPow(self, x: float, n: int) -> float: if x==0:return 0 res = 1 if ...
day7-动态规划
1. 剑指 Offer 42. 连续子数组的最大和1234567class Solution: def maxSubArray(self, nums: List[int]) -> int: max_list=[nums[0]] for i in range(1,len(nums)): max_list.append(max(max_list[-1],0)+nums[i]) print(max_list) return max(max_list)
2. 剑指 Offer 46. 把数字翻译成字符串1234567class Solution: def translateNum(self, num: int) -> int: s = str(num) a = b = 1 for i in range(2, len(s) + 1): a,b = (b+a if '10'<=s[i-2:i]<= ...
day6-栈和队列
1. 剑指 Offer 06. 从尾到头打印链表12345678910111213# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution: def reversePrint(self, head: ListNode) -> List[int]: # return self.reversePrint(head.next)+[head.val] if head else [] res = [] while head: res.append(head.val) head = head.next return res[::-1]
2. 剑指 Offer 09. 用两个栈实现队列1234567891011121314class CQueue: def ...
day5-广度优先搜索BFS
1. 剑指 Offer 32 - I. 从上到下打印二叉树1234567891011121314151617# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: def levelOrder(self, root: TreeNode) -> List[int]: queue = [root] res = [] while queue: cur = queue.pop() if cur: res.append(cur.val ) queue = [cur.right,cur.left]+queue return res
2. 剑指 O ...
day4-深度优先搜索DFS
1. 剑指 Offer 12. 矩阵中的路径要点:
第一步确定是回溯算法,其实就是暴力解锁,一个个尝试,个人认为回溯算法有两类问题:一是找一个解,二是找所有解。像这题就是找一个解,找到了就可以结束,若是要求找所有正确路径,那就是第二类问题。两类问题区别在于返回值,单解问题遇到失败情况后撤销上一步选择回到上一步状态后同时返回一个失败标志,上一步利用此标志进行判断是否继续尝试;若遇到成功情况则直接返回成功标志,上一级判断为标志为成功后也返回一个成功标志,逐级退出程序,停止尝试。而所有解问题在遇到失败情况后撤销上一步选择回到上一步状态,继续尝试;若遇到成功情况则进行记录,然后返回到上一步状态继续尝试其他可能,直至遍历完所有可能性。
这道题有一个需要注意的地方是第一个值的候选列表和后面所有值的候选列表是不一样的,第一个值的候选列表是矩阵中所有元素,所以要行列循环,后面值的候选列表是周边的值,因此需要两部分要分开写代码,主函数里的两个循环是第一个的选择,backtrack函数里面是后面值的选择。
回溯算法核心1234567891011121314151617181920212223242526 ...
python3 不可变数据类型与可变数据类型
待更新https://www.cnblogs.com/operationhome/p/9642460.html