Browsed by
Category: ABCDEN

利用机器学习识别嵌段共聚物自组装的微观相结构

利用机器学习识别嵌段共聚物自组装的微观相结构

对浓度做傅里叶变换是识别微观相结构的极佳方法,由于快速傅里叶变换隐含的周期性,只要在做傅里叶变换时浓度矩阵是晶胞的整数倍,在做傅里叶变换之后可以消除相位的影响,即使是对浓度做了平移变换(即随机初始化跑出来的相),也不会改变傅里叶空间的形态。这一点可以在快速傅里叶变换的公式(以二维的傅里叶变换为例)中看出来,即使做了平移变换,由于周期性,对整个晶胞中所有的点求和后傅里叶空间中每个位置的值并不会发生改变。 在之前的识别中,为了简化运算而切割了矩阵的过中心的三个面做快速傅里叶变换,但现在看来是得不偿失的。三维快速傅里叶变换由于增加了一个轴,因此可以适当降低精度也可以得到较多的判断点;同时切面上做傅里叶变换由于只做了两次求和,只能消除两个方向的相位,如果相发生了平移变换,这个面的浓度和傅里叶矩阵的浓度都会发生变化,因此并不能很好地用于识别。因此仍然要靠三维快速傅里叶变换来获得相的特征。在这里傅里叶空间的大小选为128*128*128,由于傅里叶变换后主要值集中在八个角上,因此截取[0:8,0:8,0:8](最初为了加快计算选择了4*4*4的正方体,但是后来发现这样精度太低,对很多相的识别并不好)这个值比较集中的小正方体来作为相的特征来进行识别。通过验证,单纯地通过峰的位置来识别并不能行得通,因为随着嵌段比例的变化,峰的位置也会发生变化,导致判断出现问题。因此考虑把这个矩阵看作一个高维向量,用支持向量机的方法,来对这个三维矩阵进行分类和识别。 支持向量机(Support Vector Machine)是通过寻找一个超平面来对样本进行分割,并努力使分开的两个类别有最大的间隔,这样才能是的分隔具有更高的可信度。支持向量机通过让离分割面最近的数据点具有最大的距离。 利用支持向量机可以对已知标签的向量进行分类。利用Python的scikit-learn库可以很方便地进行训练和识别。同时为了处理偏离正常位置,即跑出来的相与初始化相不同的点,加入一个惩罚因子,它代表对离群点带来的损失的重视程度,它的值越大,对目标函数的损失越大,通过设置一个值来实现参数调优。经过调试,使用线性核函数有着最好的分类效果。经过调试,识别的精确率很高,并且在csHelix只有16个样本的情况下也能实现很好的识别,同时可以获取一个浓度是什么相的概率(根据点到超平面的距离来计算)。 另外,如果进行判断的相并不在训练过的相的范围内,支持向量机也会在被超平面分割出的区域中,因此也会判断出一个相,这样就发生了错误。为了判断跑出来的相是否在我们已知的范围内,需要进行异常检测,这有四种方法来实现,一类支持向量机(OneClassSVM),孤立森林(IsolationForest), 局部异常因子(LocalOutlierFactor),EllipticEnvelop,相对而言孤立森林算法效率比较高,可以指定样本的异常率来进行计算,因此选择了孤立森林算法。经过实验,在异常很少的样本中进行计算得到的包容性过强,很多其他相的相区都被包在了超平面以内从而达不到预期的效果,因此通过人工地在样本中加入一些异常值后进行计算可以得到较好的异常检测效果。 训练程序,训练后生成一个estimator.pkl和classifier.pkl两个文件,第一个是孤立森林算法计算的异常值检测数据,第二个是支持向量机计算的超平面数据。训练后会自动判断训练文件的相与识别结果是否相符,并打印出来,可以根据这个来调整训练的参数。 测试程序,可以判断是否是训练过的相,如果是,输出相的种类和概率

微观相结构的自动识别

微观相结构的自动识别

上次我们提到利用浓度数据的极值点进行相结构的识别,但是这样会遇到几个问题:首先,对于较为复杂的相极值点的数目相当多,同时不同嵌段比例以及支链的不同都会使各个相区的形状和大小发生变化,从而使极值点的位置和数目发生变化,给识别带来极大的困难;其次,如果浓度数据并不是按我们初始化的浓度进行排列的,而是进行了一定的平移或旋转变换,即相位的变化,这样极值点的位置也将发生变化,并且平移或旋转矩阵很难确定,因此又让这种识别方法变得几乎不可能。 考虑到微观相结构的周期性,利用傅里叶变换可以剔除掉相位的变化,从而将不同空间相位的浓度数据简化为傅里叶空间内单一的周期数据。实际上,对浓度的傅里叶变换等价于散射光的振幅。 因此类似于实验中的X射线衍射的方法可以利用傅里叶变换得到不同的衍射花纹,来确定微观相结构。但在傅里叶变换过程中,三维的傅里叶变化计算量很大,为了加快计算,因此我考虑对三维的晶胞进行三个方向的切片处理,得到三个二维的浓度矩阵,再做二维的离散傅里叶变换得到衍射图案。 在衍射图案中,在(0,0)主峰的周围,对于不同的相结构会出现不同的衍射图案,并且衍射图案是与微观相结构的对称性有关的,因此利用主峰周围其他峰的位置可以很清晰地判断微观相结构。以下为几个微观相结构A组分的衍射图案,为了简便只截取衍射图案的1/4: σ相 BCC Gyroid FCC A15 csHelix 在这里为了识别的简便化,因此降低傅里叶空间矩阵的大小,即在傅里叶变换时选取较小的u和v,来使花纹粗粒化,以Gyroid相为例,粗粒化之后三个面上A组分的衍射花纹分别为 除去原点位置的衍射峰,三个面上都有很明显的特征峰,可以根据这三个特征峰,即最大最小值的位置来作为这个相的特征进行判断,同时还有B和C两个组分的数据可以作为备用判断,这样就可以很方便的完成微观相行为的特征识别。最后附上一个python的简单的识别代码。 下一步希望能够找到分析衍射图案和相结构对称性的关系,以从理论上解释这种判断方法的合理性。  

一个监视服务器运行程序的脚本

一个监视服务器运行程序的脚本

SCFT的计算往往需要很长的计算时间,为了提高效率,我们希望能够在程序计算完成之后通过邮件提醒我们来进行下一步的操作。课题组的服务器虽然不能连接外网,但是可以连接复旦邮箱的服务器通过复旦学邮进行邮件的发送。 该程序每5分钟检测一次正在运行中的程序并进行比较,如果有程序跑完了就自动发送邮件提醒。 如果你不想在服务器上运行,你也可以运行本地版,利用SSH服务检测。

配置ABCDEN的运行环境

配置ABCDEN的运行环境

本为以linux系统为例,讲解ABCDEN运行环境的配置 首先下载ABCDEN的程序 http://www.birfied.com/file/SCFT.zip 解压后,首先配置运行所需的库,在cmd中运行 下载一个文件http://www.birfied.com/file/array_source.py 替换到mayavi安装目录下的sources文件夹中 然后在matlab的安装目录下运行来安装MATLAB API for Python 接着生成一个.ssh密钥以配置免密登陆,这里以linux系统为例 打开main.py 找到 替换为 在SCFT的安装目录下运行 即可开始体验外表简约而功能强大的的ABCDEN

从SCFT获得的浓度结果自动识别相的种类

从SCFT获得的浓度结果自动识别相的种类

要自动识别相的种类,首先要确定的是各个嵌段的极值点所对应的位置,以及这些位置所对应的模式。为了获得一个浓度数据中各嵌段浓度极值点的位置,首先将计算获得的浓度数据转为三维矩阵。为了降低计算量,对三维矩阵进行三个方向的经过矩阵中心(为了防止无法分辨PS相和BCC相)的切片处理,获得三个二维矩阵。在二维向量中分别找出各个嵌段浓度的极值点,将极值点的值设为1,其他点设为0,获得三个二维点云矩阵。接下来就可以对这三个点云矩阵的模式进行识别,来获得该相的种类。点云矩阵的模式识别方法仍待解决。

两种新的螺旋结构

两种新的螺旋结构

第一种结构是一种变型的双螺旋,由外层半径较大的螺旋和每层半径较小的螺旋包裹而成,相邻的大螺旋相区相互嵌套,使得螺旋之间的空隙能够被填上,基质的厚度更加均一。 另一种螺旋结构是使用Gyroid初始化的时候跑出来的,这种结构由三组分别是xyz三个方向的螺旋构成,相比于其他螺旋,这个螺旋的结构在三个方向是等价的,且互不联通。

一个计算ABCDEN体系的GUI程序

一个计算ABCDEN体系的GUI程序

用python完成了图形化计算ABCDEN体系的全套流程。 1.使用paramiko连接服务器,使用SSH服务和SFTP服务上传文件并运行; 2.可以更改嵌段比例和周期同时运行多个程序; 3.自动优化周期 4.一步获得嵌段比例范围或周期范围的自由能数据; 5.利用Mayavi或者Matlab进行密度图绘制 6.简单的SSH Shell功能

Mayavi绘制等密度曲面

Mayavi绘制等密度曲面

Mayavi是Python中一个三维数据可视化的库,可以制isosurface即等密度图。在绘制嵌段共聚物自组装的相分离结构时,最好的解决方案就是绘制不同高分子在密度为0.5(即占支配地位)的等密度曲面,即可表示该相的区域。该程序是从当前目录下读取pha.dat文件中的浓度数据进行绘制,晶胞的长宽高都取自用户界面的输入。