- 博客(59)
- 收藏
- 关注
原创 LTR入门:从 Ranknet 到 LambdaMart 原理与 lgb 实战
我们的任务是这样的:有一堆搜索引擎拿到的 query,我们标注了他们对购买商品的需求等级,即这个 query 的搜索者有多希望看到搜索结果里出现电商或者直播等内容来满足购买需求,我们希望搞一个 rank 任务来学习这个任务。doc 的特征以数值类特征为主,我们使用 lightgbm 来完成这个任务。
2023-01-09 01:01:51
1712
原创 理解 ROC 和 PRC
前两天看到了一篇关于 ROC 的推送文章,突然发现这块上学时的知识已经逐渐开始忘却了,顺便复习一下这部分知识顺手记录下来。
2022-11-24 23:45:35
1449
原创 RL 从敲门到入门
回报(其中R的单步奖励、gamma是折扣系数,表示有多重视未来的收益):价值函数 v:表示一个状态下期望获得的总收益。动作价值函数 q:表示一个状态下采取动作 a 期望获得的总收益。回溯图:贝尔曼方程:策略p(a|s) 和 环境动态特性 p(s’,r|s,a)举例子:其中 s到sa节点是依据策略决定的;sa到s是依据环境决定的。我们要学习的是策略。
2022-11-16 12:07:03
690
原创 分享:互信息在对比学习中的应用
对比学习常见的loss,但是为什么是这样?比如softmax或者lr这样的模型,其问题假设与目标存在清晰的推导关系。即,为什么使用这样的激活,这样的loss函数,最终我们都能在GLM理论中找到依据。正例比较近,负例比较远,那这个呢(refer DGI;2019 ICLR)?
2022-11-13 20:35:31
2349
原创 On the Factory Floor: ML Engineering for Industrial-Scale Ads Recommendation Models笔记
对于工业规模的广告系统来说,广告点击率(CTR)的预测是一个核心问题。广告点击率构成了用户参与的一个重要类别,并经常被用作广告对用户有用性的主要信号。此外,在按点击率收费的广告系统中,广告商按点击率收费,点击率预期直接反馈到价值评估中。因此,对于大多数互联网广告公司来说,点击率模型的开发是一项重大投资。针对这些问题的工程需要许多适合在线学习的机器学习(ML)技术,这些技术远远超出了传统的准确性改进,特别是关于效率、可重复性、校准和信用归属。我们提出了一个部署在谷歌搜索广告CTR模型中的实用技术的案例研究。
2022-11-13 14:04:18
441
原创 Detecting Topic Authoritative Social Media Users: a Multilayer Network Approach
在过去几年中社交媒体和微博网站的迅速普及之后,识别具有影响其他用户选择能力的用户是一项重要的研究课题,因为它可以为许多商业公司提供机会。但是,大多数现有方法都是通过依靠在连接具有不同类型相互关系的用户的网络上计算的中心性度量来检测影响者的。在本文中,我们提出了一种能够利用三层网络对这些用户的内容进行建模的方法,该方法通过利用他们发布的消息的内容来表达对项目的意见,从而找到有影响力的用户。层代表用户,项目和关键字,以及同一层的参与者之间的层内交互。
2022-11-10 00:22:46
130
原创 Generate Label from Click
给定该矩阵的值,我们可以通过计算第(K − 1)行的最大值来找到针对具有K类的分段的最佳净协议。也就是说,对于最优分区L∗,我们有我们将使用动态编程来填充计算 OPT 矩阵。我们定义了另一个二维矩阵B,其中,如果我们在位置i处插入最后一个断点的分段中的新断点,则B [j,i]是净协议的附加收益。对于k> 1,很容易看到对于k = 1,我们有OPT [1,i] = B [0,i]。现在,我们可以使用公式2以自下而上的方式填充矩阵OP T。算法的计算复杂度为O(Kn2)。
2022-11-09 23:59:08
225
原创 Perameter estimation for text analyse (下)
潜在Dirichlet分配(LDA)是一种概率生成模型,可用于通过无监督学习来估计多项式观测的性质。关于文本建模,LDA是一种执行所谓的潜在语义分析(LSA)的方法。 LSA背后的直觉是在文本语料库中找到“主题”或“概念”的潜在结构,它捕获了被“单词选择”噪声所掩盖的文本的含义。LSA分析由Deerwester提出,Deerwester凭经验证明文本文档中术语的共现结构可用于恢复这种潜在的主题结构,特别是没有任何背景知识的使用。反过来,文本的潜在主题表示允许对同义词和多义词等语言现象进行建模。这允许信息检索
2022-11-05 00:23:21
486
原创 Parameter estimation for text analysis (上)
我们面临两个推论问题,(1)一组分布参数的估算值 θ 能最好的解释一组观察 X 和(2)在已有观测结果 X 的前提下,得到新观测 x~\tilde xx~ 的概率,即计算 P(x~∣X)P(\tilde x|X)P(x~∣X) 。我们将前一个问题称为估计问题,后一个问题称为预测或回归问题。数据集X可以看作是一个随机变量的独立的、同分布的(i.i.d)序列。参数θ是依赖于你所考虑的分布,对于高斯分布,θ={μ,σ}\theta=\{ \mu, \sigma \}θ={μ,σ}。对于这些数据和参数,贝叶斯统计中
2022-11-05 00:21:59
393
原创 《Effective C++》第三部分:资源管理
所谓资源就是,我们可以向系统申请并使用的东西,但是将来必须归还给系统。说到这类东西,我们最容易想到的就是动态内存了,除此之外还包括文件描述器(file descriptors)、互斥锁(mutex locks)、数据库连接以及网络套接字。另外提到内存,不仅仅是 new 的基本对象,一些 new 出来的对象或者通过工厂方法得到的对象指针都是属于“内存资源”的范畴。
2022-10-17 17:56:07
439
原创 《Effective C++》第二部分:构造、析构、赋值运算
如果你自己没声明,编译器会为你声明拷贝构造函数、拷贝赋值运算符、默认构造函数和一个析构函数,所有这些函数都是 public 且 inline 的。首先对于默认构造函数和析构,编译器生成他们其实主要是为了自己使用。比如类含有虚函数时,自身的虚表要初始化,因此当程序员不写的时候,编译器需要自己弄出一个默认构造函数完成虚表的初始化。(其实在四种情况下编译器会声明默认构造函数,能不声明是编译器是不会干活的,比如当这些函数不会被调用的话,编译器就不会生成。但是这四种情况在这里不细说了,这个属于更高级的东西,我自己也没
2022-10-17 17:03:28
428
原创 《Effective C++》第一部分:让自己习惯C++
C 是一种简单的语言。它真正提供的只有有宏、指针、结构、数组和函数。不管什么问题,C 都靠宏、指针、结构、数组和函数来解决。而 C++不是这样。
2022-10-11 21:39:34
724
原创 Alias Method采样算法
采样的本质是随机现象的模型,根据给定的概率分布,来模拟产生一些随机时间。另一方面,采样得到的样本集也可以看作是是一种非参数模型。即用较少量的样本点(经验分布)来近似总体分布,并刻画总体分布中的不确定性。从这个角度来说,采样其实也是一种信息降维,可以起到简化问题的作用。对当前的数据集进行重采样,可以充分利用已有的数据集,挖掘更多信息,如Bootstrap法和jackknife法,通过对严格不能多次重采样来估计统计量的偏差、方差等。
2022-10-11 21:35:53
363
原创 Weight Initialization in Deep Neural Networks
了解神经网络中不同的权重初始化方法权重和偏置是神经网络的可调参数,在训练阶段,使用梯度下降算法改变它们,以最小化网络的成本函数。然而,在开始训练网络之前,必须对它们进行初始化,这个初始化步骤对网络训练有重要影响。在这篇文章中,我将首先解释weight初始化的重要性,然后讨论可用于此目的的不同方法。
2022-10-09 21:39:28
342
原创 形式语言与自动机基础
这个过程完成之后可以把所有的状态对标记为可区分或不可区分,由于不可区分是一种等价关系,具有传递性,所以不可区分关系可以完成对状态的划分。文法 G 的不含非终结符的句子形式称为 G 生成的句子。由文法 G 生成的语言,记作 L(G),指 G 生成的所有句子的集合。若 G 是一个正则文法, 则存在一个有限自动机nfa,使得:T(M) = L(G)。,这里的最小指的是它是所有接受L(M)的dfa中状态数最少的。定理:设L是正则语言,那么总存在正则表达式r使得L=L®。一些特殊类型的符号串为文法 G=(N,
2022-10-07 11:17:29
718
原创 采样算法小结
区间内进行均匀采样可以说是采样算法的基石,比如说逆变换采样就是针对CDF函数的值域上进行采样,对离散分布的轮盘赌算法同理是一种离散分布的逆变换采样,拒绝采样中判断对于一个采样是否被接受需要均匀采样,等等等等,不一而足。对于高斯分布,可以使用逆变换采样,但是高斯分布的CDF函数不容易表示,所以,一种常用的数学技巧就是使用二维高斯分布转换为极坐标表示,通常可以得到好的形式。上述是实用指数分布进行拒绝采样的过程,实际上有更为高效的针对高斯分布的拒绝采样方法,即Ziggurat方法,作为补充参考。
2022-10-07 11:04:51
963
原创 Git 原理备忘录
如果你从这里克隆,Git 的 clone 命令会为你自动将其命名为 origin,拉取它的所有数据,创建一个指向它的 master 分支的指针,并且在本地将其命名为 origin/master。你在查看一个经过变基的分支的历史记录时会发现,尽管实际的开发工作是并行的,但它们看上去就像是串行的一样,提交历史是一条直线没有分叉。Git 的分支实质上仅是包含所指对象校验和(长度为 40 的 SHA-1 值字符串)的文件,所以它的创建和销毁都异常高效。而集中式的VCS只是只是取出最新的文件或者快照。
2022-10-01 22:52:33
652
原创 《这就是搜索引擎》——链接分析
常见的有两大类算法:链接分析和子集传播(作者自己提出的分类);前者最典型的是pr,后者典型的是hilltop和hits主流算法之间的演进关系。
2022-10-01 21:54:15
527
原创 python源码剖析—— python中的Frame对象初探
而作用域是嵌套的,这就使得名字空间也是嵌套的,一个赋值语句引入的名字在赋值语句所在的作用域内生效,在其内部嵌套的每个作用域内都生效。这实际上是在模拟真实机器上的栈帧,在普通的x86机器上,当发生函数调用的时候,系统会在地址空间中创建新的栈帧并保存上一个栈帧的栈指针esp和帧指针ebp,这两个变量用于恢复上下文环境。我在文章中也屡次强调过,python的作用域是静态作用域,就是说,一个约束在程序正文中的某个位置是否起作用,是由该约束在代码中的位置唯一决定的。是不同的,这个信息需要动态的体现在上下文环境中。
2022-09-25 20:17:44
647
原创 python源码剖析—— python中的字节码对象初探
这个编译出的字节码是静态分析的结果,因此只要代码相同编译出的字节码就会相同,因此如果对于同样的字节码,重复编译是没有必要的,因此python会对符合一定规则的python文件(通常可以认为是被import的文件)编译出字节码并缓存下来,这个就是pyc文件。模块是反汇编工具,这个工具是python自己用不到的,因为反汇编是面向程序员的,机器只需要读取字节码的字节表示的数字就可以,程序员才需要将其转换为可读的指令名称。在下面展示的结果中,第一列是源码对应的行号,第二列是字节码的偏移量,然后是字节指令的名称。
2022-09-25 20:15:19
544
原创 python源码剖析—— python中的字典对象
C++的 STL 中的 map 就是一种关联容器,map 的实现基于 RB-tree(红黑树),理论上,其搜索的复杂度为 O(logN)。Python 中同样提供关联式容器,即对象。与 map 不同的是,对搜索的效率要求及其苛刻,这也是因为在 Python 本身的实现中被大量地采用,比如会通过来建立符号表。因此,采用了散列表(hashtable)。理论上,在最优情况下,散列表能提供 O(1)复杂度的搜索效率。
2022-09-25 20:13:47
1118
原创 python源码剖析—— python中的列表对象
这个操作是常数时间代价。对象可以有效地支持插入,添加,删除等操作,在 Python 的列表中,无一例外地存放的都是。函数则是实现了切片功能,当传入的v是NULL时,实际效果就是将被切的部分删除。没啥可说了,就是注意里面对索引的处理步骤,使得任意的索引值都可以处理,直接可以试试。函数中,这个函数会在当前空间的后面继续扩展,但是是否真的是这样,等待后续更新。而且与想象中不一样的是,该方法仅仅制定了元素的个数而没有指定元素的具体内容。指针放到指定的位置,然后将这个位置原来存放的对象的引用计数减 1。
2022-09-23 22:42:36
980
原创 python源码剖析—— python中的字符串对象
该机制规定:当两个或以上的字符串变量它们的值相同且仅由数字字母下划线构成而且长度在20个字符以内,或者值仅含有一个字符时,内存空间中只创建一个对象来让这些变量都指向该内存地址。不同的是,在 Python 的整数对象体系中,小整数的缓冲池是在 Python runtime 初始化时被创建的,而字符串对象体系中的字符缓冲池则是“按需使用”。上面的这个表述经过在 python 终端中的尝试,应该是正确无误的,但是我在Python源码中没有发现对大于一个字符的字符串的 intern 处理代码。
2022-09-21 19:53:18
753
原创 快速平方根倒数计算
对于计算机中的数值计算来说,很多情况我们认为简单的运算对于计算机来说可能并没有那么简单。对于计算机体系结构和底层的实现,我了解的非常浅薄,这里只是为了引出Q_rsqrt算法谈谈自己的理解。首先可以知道的是,目前来说,对于加法和移位,计算机可以高效的完成,因为这两种操作对于CPU的计算单元会有高效的硬件实现。对于减法同样可以以和加法差不多的指令周期内完成,因为数值在计算机内以补码形式形式存放,加法和减法的操作具有高度一致性。对于乘法来说,就要比加法慢上很多,因为乘法在计算机内是通过多次移位与相加组合完成的。
2022-09-16 23:27:30
682
原创 python源码剖析—— 初识 PyIntObject 对象
其次,Python内部也大量的使用整数对象,我们在自己的代码中也会有大量的创建销毁整型对象的操作,因此单独的维护整形对象并对其申请内存和释放内存是不现实的。另一个是干啥的稍微一想就能想到:这个 block 链表维护的是一整块block,是block级别的,我要使用的是。构成了一个整数系统,其下有两个“部门”,一个是静态对象池,一个是动态缓冲池,两个池的管理使用两个不同级别的指针。注意,新申请的 block 在链表头,这样做的原因是考虑到链表的插入效率。的操作,像前面说的,定义在该类型对象的函数指针中。
2022-09-16 23:01:12
345
原创 python源码剖析(1)—— PyObject
1. Python中的对象Python中一切皆是对象。————Guido van Rossum(1989)这句话只要你学过python,你就很有可能在你的Python学习之旅的前30分钟就已经见过了,但是这句话具体是什么意思呢?一句话来说,就是面向对象中的“类”和“对象”在Python中都是对象。类似于int对象的类型对象,实现了“类的概念”,对类型对象“实例化”得到的实例对象实现了“对象”这个概念。通常的说法是,对象是数据以及基于这些数据的操作的集合。在计算机上,一个对象实际上就是一片被分配
2021-05-13 20:08:15
530
2
原创 基数估计:FM算法
LogLog算法参考《大数据——互联网大规模数据挖掘与分布式处理一书》中所提到的FM算法,下面给出简单的python实现。代码中比较重要的就是testFM函数。重要的参数是each_group_k,表示了LogLog中用后多少位表示桶号,然后对所有元素求平均进行估计。group_num是参考《大数据》书上提到的中位数方法的小改进,就是不只是使用平均进行估计,而是使用不同的哈希函数LogLog算法重复多遍,然后每个LogLog算法内求平均,多个LogLog算法内求中位数。结果改进的并不多,索性直接用一组
2021-04-26 01:01:23
461
原创 浅析Bloom Filter与java实现
概述布隆过滤器实际上对外表现为一个set类型,可以实现添加元素/判断元素是否存在/并集等操作。需要注意的是布隆过滤器不提供元素的删除功能,这一点特点使得他不能作为常规的集合类型使用,那么它的使用场景是保存大量固定元素的集合,并判断一个新到来的元素是否已经存在在这个集合中,s所谓“过滤器”也是因此得名。他以一定误报率(不在的元素判断为在)为代价,减少了大量存储空间。原理BF主要需要包含一个长度为m位的位图,和k个相互独立的哈希函数,哈希函数的值域在0到m-1之间。如果希望加入一个元素,那么将该元素输
2021-04-26 00:55:29
160
原创 EM算法原理与推导(续)
关于更新参数关于参数如何更新,其实有多种解释都一样,但是为了理清思路,我们要明确一点就是我们即使不对混合模型的对数似然进行任何变化,也是可以做MLE估计的,只是得到的参数最优值不是一个解析式,而是一个涉及到“隐变量”的式子,这才导致我们后续的EM算法并通过迭代方式来最大化似然。用GMM举例子,我们希望极大化:l(θ)=∑i=1mlog∑zP(x(i),z(i);θ)(1) l(\theta)=\sum_{i=1}^mlog\sum_zP(x^{(i)},z^{(i)};\theta)\qquad(1)l
2021-04-26 00:40:15
198
原创 EM算法原理与推导
layout: posttitle: EM算法原理与推导date: 2018-05-27category: 机器学习tags:generativealgorithmmathstoolsmachinelearningkeywords:description:EM算法Jensen不等式对于凸函数,有\(E[f(X)]\ge f(E[X])\)。如果\(f\)是一个严格凸函数,那么只有当\(X=E[x]\)成立的时候,Jensen不等式中的等号才会满足。向上图演示的一样,如.
2021-04-25 00:50:33
382
原创 SICP5——迭代器与数据处理管道
一、python中的迭代器首先要区分开迭代器和可迭代对象,前者是指实现了__next__和StopIteration迭代器协议的python对象,后者是指可以使用iter得到其迭代器的对象。比如,iter(range(n))可以获得range对象的迭代器,实际上使用iter可以从任何可迭代对象中获得迭代器,迭代器唯一能做的就是next直到StopIteration。所有的迭代器都是可迭代对象,意思是你可以从一个迭代器中得到一个迭代器,因此你可以遍历一个迭代器。通常对迭代器使用iter方法返回的是该迭代器.
2021-04-25 00:34:19
237
原创 SICP3——使用python制作logo解释器
一、计算机程序的构造和解释简陋的计算器解释器典型的解释器拥有简洁的通用结构:两个可变的递归函数,第一个求解环境中的表达式,第二个在参数上调用函数。这些函数都是递归的,因为它们互相定义:调用函数需要求出函数体的表达式,而求出表达式可能涉及到调用一个或多个函数。对于嵌套的表达式可以解析为表达式树,表达式树可以使用树形结构编程表示,例如计算Fibonacci数的过程实际上可以表示为一棵树,树的节点中存放了计算结果。使用函数(闭包构建偏序对),使用偏序对构建递归列表,使用偏序对构成的列表构建字典,这意味着
2021-04-25 00:03:39
550
原创 SICP2——Python中使用函数构建对象
一、使用对象构建抽象1.1 数据抽象现在到了数学抽象中最关键的一步:让我们忘记这些符号所表示对象。…根本不必考虑它们到底代表着什么东西。上一篇文章主要强调的是对数据的操作以及这些操作之间的组合与抽象,这个过程中使用到的主要工具是函数。对于数据自身,我们同样可以应用组合与抽象的基本技巧。数据抽象类似于函数抽象。当我们创建函数抽象时,函数如何实现的细节被隐藏了,而且特定的操作序列本身可以被任何具有相同行为的函数替换。换句话说,我们可以构造抽象来使函数的使用方式和函数的实现细节分离。与之相似,数据抽象是
2021-04-24 22:18:44
162
原创 SICP1——Python中的函数机制
一、使用函数构建抽象1.1 基本元素程序必须为人类阅读而编写,并且仅仅碰巧可以让机器执行编程语言都应该具有基本的元素,即表达式和语句,数据和函数是这两种基本元素的代表。有了基本元素之后,还要有合适的方式将他们进行组合以完成简单到复杂的构造。最后,可以对内容进行抽象,已完成复杂到简单的指代。首先要区分代码中的语句和表达式,这两者分别负责执行某个操作或者计算某个值。最简单的语句就是赋值语句了,赋值语句的执行作用就是负责将某个值和某个名字相关联,即“名称被绑定到了值上”,并将这种绑定存放在环境中。而表
2021-04-24 22:17:50
209
原创 Python Cookbook3 (12) 并发编程
并行计算环境中的正确性有两个标准。第一个是,结果应该总是相同。第二个是,结果应该和串行执行的结果一致。当一个进程在程序的临界区影响另一个进程时,并行计算中就会出现问题。这些都是需要执行的代码部分,它们看似是单一的指令,但实际上由较小的语句组成。一个程序会以一系列原子硬件指令执行,由于处理器的设计,这些是不能被打断或分割为更小单元的指令。为了在并行的情况下表现正确,程序代码的临界区需要具有原子性,保证他们不会被任何其他代码中断。为了强制程序临界区在并发下的原子性,需要能够在重要的时刻将进程序列化或彼此同步。
2021-04-24 01:03:44
137
翻译 Why Python is Slow: Looking Under the Hood [译]
翻译自Why Python is Slow: Looking Under the Hood我们以前都听说过 : Python很慢。当我在Python上讲授关于科学计算的课程时,我在课程的早期就提出了这个观点,并告诉学生们为什么:它归结为Python是一种动态类型的解释语言,它的值不是存储在密集的缓冲区中,而是存储在分散的对象中。然后我将讨论如何通过使用NumPy、SciPy和相关工具对操作进行矢量化并调用到编译后的代码,然后继续。但最近我意识到一些事情:尽管上面的陈述相对准确,“动态类型-解释-缓存-
2021-04-24 01:03:01
224
原创 Python Cookbook3 (9)元编程
1. 在函数上添加装饰器2. 创建装饰器时保留函数元信息3. 解除一个装饰器前面好好的看的话,装饰器这个内容现在已经算比较简单了。@wraps 有一个重要特征是它能让你通过属性__wrapped__直接访问被包装函数。__wrapped__ 属性还能让被装饰函数正确暴露底层的参数签名信息。直接访问未包装的原始函数在调试、内省和其他函数操作时是很有用的。但是我们这里的方案仅仅适用于在包装器中正确使用了 @wraps 或者直接设置了 __wrapped__ 属性的情况。如果有多个包装器,那么访问 __wr
2021-04-24 01:00:48
121
原创 Python Cookbook3 (8)类与对象
1. 改变对象的字符串显示自定义__repr__() 和__str__()通常是很好的习惯,因为它能简化调试和实例输出。例如,如果仅仅只是打印输出或日志输出某个实例,那么程序员会看到实例更加详细与有用的信息。repr()生成的文本字符串标准做法是需要让eval(repr(x))==x为真。如果__str__()没有被定义,那么就会使用__repr__()来代替输出。2. 自定义字符串的格式化如果format时传入对象,会默认执行对象的__format__方法,如果在__format__函数中提供参
2021-04-24 00:59:59
269
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人