决策树与信息增益的算法细节[下]

上一章中介绍了 scikit-learn 实现决策树时涉及的几个类以及着重介绍 split 的算法细节。本篇着重介绍 criterion 的算法细节,即如何(快速)计算特征规则的信息增益值。一般的教程在实现决策树时主要考虑到代码的易读性,但在真实应用环境或者说像 scikit-learn 这样的库之所以广为使用,其算法的高效性也是令我们值得学习的地方。另外主流上决策树模型一般用在分类模型,那么回归模型我们该如何“改变”信息增益的计算?公式给出的定义是一回事,但实际操作起来则是另一回事。比如:样本的权重如何体现在信息熵的计算之中、如何避免数组的创建、如何减少冗余的计算等等。

Read More

决策树与信息增益的算法细节[上]

决策树是非常经典的机器学习算法,单独使用时决策树仍然是至今少数可以解释的模型之一,许多决策树一同构建的整体模型,如经典的随机森林模型仍然是目前广泛使用的“传统机器学习算法”,其在化学信息学的出场频率绝不逊色于支持向量机以及神经网络这种较为复杂的模型。决策树的理论基础以及大致的算法其实不难理解,但若我们仔细关注 scikit-learn 的原码时,就会发现那些开发者在一些细节上进行了很多优化,使得模型训练更加快,也支持许多超参供选择。本篇先介绍 scikit-learn 中实现决策树所需要用到的重要的,然后着重介绍 Splitter 的作用以及算法细节。

Read More

波峰识别算法介绍

最近的一个项目是研究钙离子信号强度的变化波形。研究方法是得到这些波的一些重要参数,比如波峰的数量、周期等。如何让计算机算法识别我们人眼一看便知的波峰则是第一个需要解决的问题。而且我们还让要让计算机知道哪些是“真正”的波峰,哪些是噪音导致的“小波”。简单的说涉及两个问题:1.波峰的本质是什么?2.真正的波和噪音的波的区别到底是什么?

Read More

SMILES 标准化算法 - CANGEN

SMILES 是化学信息学中最常见的分子形式,其因为可读性强、体积小且“表格友好”而广受应用。但由于同一个分子可以有多种不同的 SMILES 形式导致我们不能将它用作化合物的匹配与去重操作。于是将 SMILES 标准化(Canonicalise)的需求就产生,如果可以通过某个算法保证一个化合物只会有一种 SMILES 自然可以增加 SMILES 在化学信息学中的作用。其实不难想象,SMILES 之所以可以出现不同是因为我们可以随意修改原子的“出场顺序”以得到不同的 SMILES,比如苯甲酸,我们可以先写苯环再写羧基,也可以先写羧基再写苯环,即使先写苯环也可以考虑以不同的原子为起点,可以顺时针或者逆时针。所以如果我们能通过某个算法给这些原子排序,谁序号大则优先出场,SMILES 自然就可以保证唯一。

Read More

化学信息学中的立体化学

由于大多数化学信息学的应用模型(如 QSAR)都不考虑化合物的手性信息,因此大家在构建模型时也常常有意或无意地忽视它,甚至在建模之前直接将化合物的手性信息去掉。该过程无可厚非,毕竟既然对应异构体的分子指纹如果是一样的,若其活性也一样就没有必要作为重复数据出现在训练或测试集中,若其活性有很大
区别,则不仅无法利用,反而增加模型训练的难度,试想同一个 X 怎么能得到两个 Y 呢?

Read More

QSAR 模型中应用域的定义方法

使用统计学或机器学习方法构建的 QSAR(定量构效关系)模型需要定义应用域才能使模型更有意义。一来这符合 OECD 对 QSAR 的指导原则,二来从机器学习角度应用域的设定可以防止因为待测试样本的特征范围与训练集样本区别太大而导致的预测偏差过大的情况,就像用亚洲人种做的调查所构建的模型可能并不适合其他人种。从另一个角度,若通过合适的应用域可以在评估前将不适合的化合物样本踢出在外,便同样是在提高模型的准确性。当然此时也得引入另一个评价指标,即该应用域的范围有多大,我们并不希望一个模型虽然很好但仅适用于很小的化合物空间。

Read More

Pytorch 实现 multi-head self-attention 逆合成预测

相比于传统的 RNN 方法构建的翻译模型,使用 Google 提出的 multi-head self attention 方法可以更好的捕捉长距离的词与语词之间的关系。北大裴剑锋课题组最近在 arXiv 发布了其利用该方法应用于逆合成的研究,本问尝试利用该论文提供的先做进行重复试验。虽然谷歌已经提供了“非官方”的 TensorFlow 扩展 tensor2tensor 以实现这种 Transformer 模型的构建,本文则基于一个 NLP 社区贡献者提供的 Pytorch 版本。

Read More

如何写科技论文

写科技论文往往是大家比较头痛的一件事情,做实验已经很辛苦,可把这些实验整理成一篇完整的稿子也一样特别痛苦,期间充满着纠结、心累与无奈。下面根据我写论文的经验,给大家分享下我写论文的一些心得。也许不适合所有情况,也许也不是最佳的方式,但不妨先根据下面的经验进行尝试,避免自己走一些弯路。

写论文的顺序

最初写论文时都是从头开始写,即背景、方法、结果、讨论、结论的顺序,最后再写摘要。虽然这种方法并非不行,但根据自己这些年来写文章的体验,这种从头写的方法其实并不值得推荐,下面给出我个人的一些建议。

Read More

扩展连通性指纹(ECFP/Morgan Fingerprint)介绍

扩展连通性指纹(Extended Connectivity Fingerprints,ECFP)是当下最广受使用用于构建化合物
定量构效关系(QSAR)模型的分子指纹。在 RDKit 中,ECFP 指纹又叫 Morgan 指纹,正因为 ECFP
的核心想法来自于 Morgan 算法,该算法可以为每个原子分配一个唯一的识别符,该标识符会经过几轮迭代。

Read More

使用 K-means 方法对化合物库进行聚类

在药物筛选过程中,我们时常面临一个问题:我有太多有意思的分子,但资源或预算有限,我该如何挑选最合适的分子去进一步测活等?如果全选择理论最优(如对接打分最高、QSAR 预测结果最好等),那么很有可能由于缺乏多样性,测试结果差不多,意义不大。此时我们可以通过聚类的方法减少待测样本的同时尽可能大的保留化合物的多样性。K-means 是一个古老却又最常用的一种聚类方法,速度非常快。Patrick Walter 博士写了一篇博客介绍了使用 K-means 聚类方法的环境、目的与具体实现方法。由于谷歌的 Blogspot 在国内无法正常访问,我就在下面附上原文。Patrick 将它的工具放在了 Github,我们可以直接使用命令行对化合物进行聚类。

Read More

用于博客上传图片的图床网站汇集

之前本博客的图床都采用七牛云,可惜现在可能由于国家的管控,必须使用备案的域名才可以绑定,
否则只给一个为期30天的测试域名,显然是不能用这个域名作为图床的,无奈之下只能另辟蹊径。

网上看到一些介绍 Hexo 上传图片的方法,比如可以使用本身的插件post_asset_folder
可我仍然偏好使用图床,可能觉得源码就应该是纯粹的源码吧。

Read More

使用强化学习生成模型产生新的分子

在药物设计、化学信息学领域,深度学习并不一定能比传统机器学习领域有更好的表现,尤其是在学术界,由于有标签的数据很少,数据噪音较大,往往用深度学习只会导致过拟合降低模型的预测能力。但是,生成学习用于药物设计却完全发挥了当前深度神经网络的优势。虽然有标签的数据很少,但是药物设计数据库诸如CHEMBL不乏质量较高的“化合物信息”。这里说的质量较高指的是他们的类药性较强,往往此类数据库中的化合物都是早期药物设计中已经合成出且具有一定生物活性的分子。这些化合物可以统统拿来构建一个模型用于生成新的小分子。

Read More

使用Python或Bash统计文件行数方法与性能测试

当统计大文件的行数时,除了要考虑便捷性,自然也会想到要考虑其计算性能(主要是时间尺度)。网上搜了下有很多种方法可以实现,那么到底应该选择哪种?首先明确方向,需要统计结果的环境是python,那么除了使用python本身的方法外,利用bash也是个很不错的选择,毕竟bash里有很多快速处理文本的工具。

Read More

Facebook面试题-求硬币概率

无意中看到一个面试题,号称是Facebook出的(出处

You randomly draw a coin from 100 coins — 1 unfair coin (head-head), 99 fair coins (head-tail) and roll it 10 times. If the result is 10 heads, what is the probability that the coin is unfair?

Read More

Nodejs下使用gm圆形裁剪并合成图片

说到Nodejs下的图片处理可能第一想到就是gm,gm底层可以是GraphicsMagic(其实也是gm的由来),也可以是ImageMagick(其实GraphicsMagic本身也是从ImageMagic分割而来,现在独立了)。虽然这两个工具本身都不是js实现,所以需要额外安装,不过此工具非常常见,可能已经预装在linux系统下,而且安装也很方便,所以不用因为看到是“第三方”就放弃。虽然说这两个软件都只是底层,无需关心,可笔者在实践中发现必须得用GraphicsMagic,所以这里就只介绍GraphicsMagics的安装与使用。

Read More

使用flask + uwsgi + supervised 使用虚拟python环境搭建网站

flask是个轻量级的网站框架,如果网站仅仅是几个简单的页面与功能接口的话,使用它比其他诸如django等框架要方便很多。然而当网站构建好后,需要部署到服务器,此时需要另外两个工具:用于让python与网站服务器相连的uwsgi,以及用于自动启动并守护的supervisor。

flask和uwsgi都支持python2和python3,但supervisor只支持python2,所以如果网站app一定要用python3的话则一定会出现他们装在不同的虚拟环境下。不过不怕,这是可以解决的。

Read More

信息增益与主成分分析在化学信息学中的应用

摘要:信息增益一般用在数据挖掘中的决策树方法领域,它是指当前熵与两个新群组经加权平均后的熵之间的差值。
在化学信息学中,我们可以利用信息增益判断分子指纹的每个子结构对分子活性的影响程度。
主成分分析是数理统计中的一种技术,意在降低变量的维度,防止过拟合现象以提高模型的准确度。
在化学信息学中,我们可以利用主成分分析技术解决分子描述符太多且可能存在相关性的问题。
本文简单介绍上述两种方法的原理,并描述他们在化学信息学中的具体应用。

Read More

在Docker中使用GUI环境,解决cannot connect to X server问题

Docker 因为其部署、迁移方便而广为受到关注。我们使用 DockerFile 进行环境搭建与配置,用户只需要下载 Docker 并安装,下拉镜像docker pull TheImage即可仿佛下载了一个已经配置好的虚拟环境,然后docker run 即可实现程序。
可当它处理GUI程序的时候就不那么方便,如果直接执行GUI程序会得到“cannot connect to X server”错误。因为 Docker 程序也像在另一个虚拟机一样,无法直接输出图像到宿主的显示器,而是需要在某个隧道下进行 X 传输。

Read More

使用Python-RQ 构建前后端分离的任务队列应用

故事的起因是想要做一个有排队任务系统的webserver。
初步想的架构是这样,前端用一个web页面用来新建、查看任务,通过php存至MySQL数据库,并向Worker(用Python实现的一个程序)发起一个signal,如果Worker停止工作了,则开启工作,如果已经正在跑任务,则什么事都没有。Worker启动后会跑下一个state为0的任务,完成后将结果保存到result,并进行下一个任务,若没任务则进入休眠状态。然后web可以通过id查看任务状态和任务结果。

Read More

使用Cython实现斐波那契数列并与Python比较

Cython 是用 Python 的语法写C语言,原理其实就是解释器将 python 语言翻译成C语言然后再用编译器(比如 gcc 或者 vc++ )编译成可被 python 调用的动态链接库。是用 Cython 的好处自然就是快。最近想到一个问题,斐波那契数列可以用两种方法实现,一种是用迭代方法,即根据定义当前值等于前两个值的和。另一种是使用数列知识中的求通式法直接算出。哪种更快?

Read More