机器学习二维系统相变

本文基于凝聚态物理中Ising模型的相变理论,利用机器学习技术(如卷积网络)对其相变进行分类。通过蒙特卡洛模拟生成数据集,区分有序(有磁性,序参量非零)与无序(无磁性,序参量为零)状态,完成数据集处理、模型组网、训练及验证,实现对Ising模型相变的有效区分。

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

机器学习二维系统相变 - 创想鸟

机器学习二维系统相变 - 创想鸟        

Abstract

凝聚态物理是研究诸如电子、原子核、原子、磁偶极子、量子比特等组成的复杂系统。其复杂性体现在随粒子数指数增长的相空间,让人想到了机器学习中的纬度诅咒。尽管存在这样的诅咒,机器学习依然可以在数据集上体现出很好的分类、回归性质。这里,我们用现代的机器学习技术(全链接、卷积网络),用以分类众多不同的哈密顿体系相与相变。通过调用库,神经网络可以训练用于区分序参量。

这是2017年Nature phsics上的一篇文献,其证明了机器学习方法可以在凝聚态物理中处理相变问题。区别于高能物理,凝聚态物理是研究多体系统的物理,也是公认研究人数最多,范围最广的物理分支。相变理论又因其存在临界现象,又是凝聚态物理中最有趣的一个分支。二阶朗道相变理论给出了自发对称性,让人感到物理美的地方。文献里主要是在研究二维铁磁系统,也就是Ising model。对Ising model做了二分类,分为有磁性和无磁性。方法简单暴力,而且精度很高。文献里的模型,没啥特殊的物理意义(复现最大的意义就是让我复习一下统计物理+paddle……)。接下来介绍一些Ising model的基本理论,随后对其进行分类。(项目中不给出任何公式,大家是非科班生,不必执迷于物理意义的部分。这里仅仅给出定性的描述。要给出一个很好的物理图像,需要掌握很多么门物理专业的课程。作者自己都不敢说自己这些基础的物理图像做得多好。)

一 相变理论

系综理论Ising Model蒙特卡洛模拟

系综理论

由概率理论为基础的统计力学,完全不同于经典力学方法。这种引入统计手段为描述力学性质的方法,为20世纪初量子力学的诞生埋下伏笔。正是这样的背景,统计力学和经典理论、量子理论不同,却又相同,量子物理结合电动力学发展出的量子电动力学,非常好得描述了单粒子系统的性质。量子物理结合统计力学,也就是我们的凝聚态物理。分析力学中大家寻找哈密顿量,又或者是构造拉格朗日函数,就得到了系统含时演化的所有信息。量子力学中大家解薛定谔方程,也是为了找到一个波函数,用于完全描述系统。统计物理里也一样,这次我们寻找的函数叫做配分函数。配分函数代表了每一个state在整个phase space里出现的概率。

举个栗子:抛硬币

一个硬币

0000000000000000000000000000000000000000000000000000000000000(手动分割线)

机器学习二维系统相变 - 创想鸟        

0000000000000000000000000000000000000000000000000000000000000(手动分割线)

假如你手里有一个硬币,显而易见,其state有俩种:正面朝上和反面向下。那么你咋能知道每一个state出现的概率呢?其一种思路是拿着这个硬币一直抛,最终得到俩个state出现的频率,最终趋于概率(大数定律)。还有一种思路,拿一箱子硬币,然后晃箱子。开箱后开始计数,一次性得到概率。我们假设俩种方法得到的结果一致,也就是含时平均等于系综平均,又称为各态遍历假说。这是统计理论的支柱,靠着这一条基本假设,解决了多粒子系统力学耦合无法描述的问题。

我们就假设,手上有一百个这样相同边界条件的系统。那么其中某一个特定state出现了几次,就是这个state在space里的概率密度。上文的硬币,明显就是1/2。

Ising Model

Ising Model是最简单又好用的统计模型。其存在量子物理中的自旋,可又是建立在经典系统理论上。那ta到底讲了个啥?来做一个小实验。拿起一个磁铁,然后用打火机烧一烧。随后发现,磁铁的磁性竟然消失了!!?这其中到底发生了什么??

我们的Ising model正是在说这样的事情。我们说有磁性的磁铁,变成了没有磁性的废铁,这一过程发生了相变。引入物理量,磁化强度作为序参量,描述这一现象。当温度低于临界值,磁化强度不为0,当高于某一温度,磁化强度恒为0。我们称这一过程,发生了相变。Ising Model,把所有原子视为固定的。(固体活动范围小,忽略)。那么电子也是固定的。但是电子存在自旋,每一个电子都贡献一个磁场强度,最后就是一个大磁铁了。

机器学习二维系统相变 - 创想鸟        

这是数据集中的一张有序的图片。

机器学习二维系统相变 - 创想鸟        

这是无序的图片

黑色代表自旋向上,白色代表自旋向下,每一个像素点代表一个电子。 有序(序参量不为0)、无序给人的映像很直观,就是字面意思。有序代表秩序,无序则代表混沌。无序情况下熵值高,不确定性大。有序表现为聚集,自旋向下的聚成一块,自旋向上的聚为一块。对于论文复现,我们知道到这就够了。下面贴上Ising Model的蒙特卡洛模拟代码,用以生成这样的图片。值得一提的是,我们假设2.269度为相变临界点。高于2.269则无序(顺磁),低于则有序(铁磁)。

交代清楚任务,我们便要开始进行机器学习。首先的任务是进行蒙特卡洛仿真,模拟二维Ising model。运行这一段代码生成数据集,但时间过长,至少需要一个星期才能跑完。我把自己运行好的数据集上传到了data里,想要自己生成数据集的可以运行代码观察一下热容在临界点附近的突变。时间来不及可以直接略过。

#这一段代码是从网上直接copy的,原网址:https://rajeshrinet.github.io/blog/2014/ising-model/from __future__ import divisionimport numpy as npfrom numpy.random import randimport matplotlib.pyplot as plt#----------------------------------------------------------------------def initialstate(N):       ''' generates a random spin configuration for initial condition'''    state = 2*np.random.randint(2, size=(N,N))-1    return statedef mcmove(config, beta):    '''Monte Carlo move using Metropolis algorithm '''    for i in range(N):        for j in range(N):                a = np.random.randint(0, N)                b = np.random.randint(0, N)                s =  config[a, b]                nb = config[(a+1)%N,b] + config[a,(b+1)%N] + config[(a-1)%N,b] + config[a,(b-1)%N]                cost = 2*s*nb                if cost < 0:                    s *= -1                elif rand() 1.2) & (T<3.8)];   #筛选出在温度范围内的温度点nt = np.size(T)             #计算出剩余温度点数量Energy       = np.zeros(nt);   Magnetization  = np.zeros(nt)SpecificHeat = np.zeros(nt);   Susceptibility = np.zeros(nt)#用以统计能量、磁化强度、相变潜热、磁化率四个物理量#---------------------------------------------------------------------for m in range(len(T)):    E1 = M1 = E2 = M2 = 0    config = initialstate(N)    iT=1.0/T[m]; iT2=iT*iT;        for i in range(eqSteps):         # equilibrate        mcmove(config, iT)           # Monte Carlo moves        #从非平衡态过度到平衡态    for i in range(mcSteps):        mcmove(config, iT)                           Ene = calcEnergy(config)     # calculate the energy        Mag = calcMag(config)        # calculate the magnetisation        E1 = E1 + Ene        M1 = M1 + Mag        M2 = M2 + Mag*Mag         E2 = E2 + Ene*Ene        Energy[m]         = n1*E1        Magnetization[m]  = n1*M1        SpecificHeat[m]   = (n1*E2 - n2*E1*E1)*iT2        Susceptibility[m] = (n1*M2 - n2*M1*M1)*iT#计算四张图f = plt.figure(figsize=(18, 10)); # plot the calculated values    sp =  f.add_subplot(2, 2, 1 );plt.plot(T, Energy, 'o', color="#A60628");plt.xlabel("Temperature (T)", fontsize=20);plt.ylabel("Energy ", fontsize=20);sp =  f.add_subplot(2, 2, 2 );plt.plot(T, abs(Magnetization), 'o', color="#348ABD");plt.xlabel("Temperature (T)", fontsize=20);plt.ylabel("Magnetization ", fontsize=20);sp =  f.add_subplot(2, 2, 3 );plt.plot(T, SpecificHeat, 'o', color="#A60628");plt.xlabel("Temperature (T)", fontsize=20);plt.ylabel("Specific Heat ", fontsize=20);sp =  f.add_subplot(2, 2, 4 );plt.plot(T, Susceptibility, 'o', color="#348ABD");plt.xlabel("Temperature (T)", fontsize=20);plt.ylabel("Susceptibility", fontsize=20);

   

二 模型实现

数据集处理模型组网模型训练模型验证

1.数据集处理

从非平衡态过度到平衡态需要走很多蒙特卡罗步,耗时极长。为了方便大家复现,我把自己生成的数据也打包上传到了项目里。

In [1]

!unzip /home/aistudio/data/data110989/dataset.zip -d /home/aistudio/work/data

   In [2]

import osimport numpy as npfrom PIL import Imageimport matplotlib.pyplot as pltimport paddle# 生成图像列表################################################################拿出来保存数据的路径data_path = '/home/aistudio/work/data'character_folders = os.listdir(data_path)###############################################################################################################################当已经存在图像列表时,把图像列表删掉,以便于重新写一个列表。if(os.path.exists('./train_data.txt')):    os.remove('./train_data.txt')if(os.path.exists('./test_data.txt')):    os.remove('./test_data.txt')###############################################################################################################################character_folders是列表,是data_pathfor character_folder in character_folders:    with open('./train_data.txt', 'a') as f_train:        with open('./test_data.txt', 'a') as f_test:            if character_folder == '.DS_Store':                continue     #continue 跳出本次循环            character_imgs = os.listdir(os.path.join(data_path,character_folder))            count = 0             for img in character_imgs:                if img == '.DS_Store':                    continue                if count%10 == 0:                    f_test.write(os.path.join(data_path,character_folder,img) + 't' + character_folder + 'n')                else:                    f_train.write(os.path.join(data_path,character_folder,img) + 't' + character_folder + 'n')                count +=1print('列表已生成')###############################################################

   In [3]

 with open('train_data.txt',"r") as f:            path_sample=f.readline()         #拿出来train_data里保存的第一个路径。            sample=path_sample.split("t")   #t是空格,这里的文本默认有一个空格 以区分路径与标签             label=sample[1]              sample=sample[0]                 #刚才取出来的列表,第一个元素是路径。(python是从0开始)第二个是标签。我们拿前一个            img=Image.open(sample)            plt.imshow(img)            img=np.array(img)            print(img)            plt.show()            print(label)                     #打印标签

   In [4]

import numpy as npfrom paddle.io import Datasetclass MyDataset(Dataset):    """    数据集类的定义    """    def __init__(self, mode='train_data',transform=None):        """        初始化函数        """        super(MyDataset,self).__init__()        self.data = []        self.transform=transform        with open(f'{mode}.txt') as f:            for line in f.readlines():                info = line.strip().split('t')     #t指缩进   strip是去掉字符串前后的一些特殊符号                if len(info) > 0:                    self.data.append([info[0].strip(), info[1].strip()])                           def __getitem__(self, index):        """        根据索引获取单个样本        """        image_file, label = self.data[index]        img = Image.open(image_file)          img = np.array(img)                                  if self.transform is not None:               img=self.transform(img)        if label=="有序":            label=1        else:            label=0                return img, label    def __len__(self):        """        获取样本总数        """        return len(self.data)

   In [6]

import paddle.nn.functional as Ffrom paddle.vision.transforms import Compose, Resize, ToTensor, Normalize #compose的功能是,把要做的预处理以列表组合起来。#这里用了图像归一化处理和调整图像大小,还可以调用其他的。transform = Compose([ToTensor("CHW")]) #CHW可以理解为BGR格式。           #ToTensor是将输入的numpy数据转为paddle的数据类型,暂时可以不管这个。

   In [7]

train_dataset = MyDataset(mode='train_data',transform=transform)test_dataset = MyDataset(mode='test_data',transform=transform)

   

2.模型组网

In [8]

class MyModel(paddle.nn.Layer):    def __init__(self):        super(MyModel, self).__init__()        #(1)加一个卷积层。四个参数分别是(输入图像通道,卷积后输出图像通道数,卷积核大小,卷积步长)        #一个filter经过一次抓取,生成一个feature map.不同的filter抓取不同特征。这里有2个filter        #输出的尺寸:输入数据的大小-卷积核大小+2×边界填充0的数量)/移动步长+1        #[(256-5+2*0)/1]+1=252                 self.conv1 = paddle.nn.Conv2D(in_channels=1,                                         out_channels=6,                                      kernel_size=5,                                      stride=1)        #(2)加一个池化层。         #输出的尺寸:(输入数据的大小-过滤器大小)/移动步长+1        #[(252-4)/2]+1=125        self.pool1 = paddle.nn.MaxPool2D(kernel_size=4,                                         stride=2)        #(3)        #这一层的功能是把张量拉平成一维向量。输入是多少,输出就是多少,改变的仅仅是形状。        self.flatten=paddle.nn.Flatten(start_axis=1,stop_axis=-1)        #(4)加一个线性层。        #线性层的输入是6*125*125  6是因为我们的conv1有6个out_channels         self.fc1=paddle.nn.Linear(6*125*125,100)        #再叠一个relu        self.relu1=paddle.nn.ReLU()        self.fc2=paddle.nn.Linear(100,50)        self.fc3=paddle.nn.Linear(50,10)        self.fc4=paddle.nn.Linear(10,2)    #正向传播过程    def forward(self, x):     #调用之前的网络        x = self.conv1(x)        x = self.pool1(x)        x = self.flatten(x)             x = self.fc1(x)            x = self.relu1(x)        x = self.fc2(x)        x = self.fc3(x)        x = self.fc4(x)        return x

   In [9]

model=paddle.Model(MyModel())model.prepare(paddle.optimizer.Adam(parameters=model.parameters()),    #指定优化方法,这里选择了Adam              paddle.nn.CrossEntropyLoss(),                            #选择损失函数,这里是交叉熵              paddle.metric.Accuracy())                                #评估,计算正确率

   In [10]

model.summary((1,1,256,256))

   

3.模型训练

In [11]

model.fit(train_dataset,    #使用的数据          epochs=10,         #训练的轮数          batch_size=50,   #单次送进多少个数据                   verbose=1)        #用进度条的形式打印日志

   

4.模型验证

In [ ]

model.evaluate(test_dataset,verbose=1)

   

以上就是机器学习二维系统相变的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/46939.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月7日 20:56:41
下一篇 2025年11月7日 20:57:29

相关推荐

  • 美团 LongCat 团队发布 LongCat-Video 探索世界模型

    美团longcat团队近日正式推出全新视频生成模型longcat-video,致力于通过视频生成技术路径深入探索“世界模型”的构建,为自动驾驶、具身智能等前沿应用场景提供坚实的技术支撑。 该模型基于DiT(Diffusion in Time)架构设计,创新性地以“条件帧数量”作为任务区分标准,原生支…

    2025年12月6日 行业动态
    000
  • 如何在Linux中查看服务的状态和日志?

    使用systemctl status查看服务状态,journalctl -u查看日志;通过list-units可列出运行或所有服务,is-enabled检查开机自启;journalctl支持按行数、时间、级别过滤日志,排查问题需结合状态与日志分析,并定期用–vacuum-time清理日志…

    2025年12月6日 运维
    000
  • 如何在mysql中排查并发写入冲突

    首先通过系统表和日志定位锁冲突,再结合索引优化与事务设计降低争用。具体步骤包括:查询INNODB_TRX和INNODB_LOCK_WAITS确定阻塞关系;启用innodb_print_all_deadlocks分析死锁日志;确保写操作条件字段有索引以减少间隙锁;缩短事务长度并考虑使用READ COM…

    2025年12月6日 数据库
    000
  • VS Code内存管理:大文件处理与缓存

    调整文件大小限制、禁用非必要扩展、优化缓存设置可显著改善VS Code处理大文件时的内存问题。 VS Code 在处理大文件或大型项目时,内存使用可能显著上升,影响编辑器响应速度甚至导致崩溃。虽然 VS Code 基于 Electron,本质上是运行在浏览器环境中的应用,其内存管理受限于架构设计,但…

    2025年12月6日 开发工具
    000
  • 抖音健康分12扣完会封号吗?多久恢复一次?深度解析平台规则

    在短视频内容爆发的当下,抖音健康分系统如同一道无形的“行为标尺”,实时评估着每位用户账号的合规程度。当创作者突然收到“您的健康分已被扣除”的提示时,最关心的问题莫过于:抖音健康分12分扣完会不会直接封号?被扣的分数多久才能恢复? 本文将深入解析抖音健康分的运行逻辑,并提供切实可行的账号管理建议。 一…

    2025年12月6日 自媒体
    000
  • 如何在mysql中创建单列索引

    创建单列索引可提升查询效率,使用CREATE INDEX或建表时添加INDEX关键字,如CREATE INDEX idx_email ON users(email),建议合理命名并避免频繁更新列。 在 MySQL 中创建单列索引是为了提升针对某一列的查询效率,尤其是在 WHERE、ORDER BY …

    2025年12月6日 数据库
    000
  • 豆包Ai网页端官网链接_豆包Ai官方网页版地址

    豆包AI网页端官网链接是https://www.doubao.com/chat/,用户可通过该网址进行智能对话、内容生成、信息提炼和网页速读等操作。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 豆包Ai网页端官网链接在哪里?这是不少网友都…

    2025年12月6日 科技
    000
  • 快手官方网页版入口

    快手官方网页版入口 官网地址:www.kuaishou.com 快手作为国内领先的短视频与直播平台,致力于打造一个真实、多元的普通人生活记录空间。它不仅是一个内容展示窗口,更构建了一个互动频繁、情感连接紧密的社交生态圈。 平台主要特色 1、普惠理念与去中心化推荐机制 快手坚持“人人皆可被看见”的理念…

    2025年12月6日 软件教程
    000
  • VS Code生产力手册:插件生态与代码片段终极指南

    答案:通过合理配置插件与代码片段可大幅提升VS Code开发效率。核心在于选用语言支持、主题、格式化、Git辅助等插件,结合自定义代码片段实现高频结构快速生成,再通过插件与片段协同提升编码速度,最后定期维护并共享配置以保障长期高效开发。 Visual Studio Code(简称 VS Code)已…

    2025年12月6日 开发工具
    000
  • laravel Jetstream和Breeze的对比和选择_Laravel Jetstream与Breeze对比指南

    Laravel Jetstream功能全面,适合需团队管理及API支持的中大型项目;Breeze轻量简洁,提供基础认证,便于自由扩展和深度定制,适合小型项目或学习使用。 Laravel Jetstream 和 Laravel Breeze 都是官方提供的应用脚手架,用于快速搭建包含用户认证功能的项目…

    2025年12月6日 PHP框架
    000
  • 如何在Linux中使用rsync备份文件系统?

    rsync通过仅传输文件变化部分实现高效备份,支持本地与远程同步;2. 常用选项包括-a(归档)、-v(详细输出)、-z(压缩)、–delete(删除多余文件)等;3. 路径末尾斜杠决定是否同步目录内容;4. 远程备份可通过SSH推送或拉取,需配置密钥免密登录;5. 结合脚本与cron可…

    2025年12月6日 运维
    000
  • 豆包Ai在线网页版官网_豆包Ai官方网页访问平台

    豆包AI在线网页版官网是https://www.doubao.com/chat/,用户可通过该平台使用智能对话、多模式服务切换、历史记录管理及跨设备同步等功能。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 豆包Ai在线网页版官网在哪里?这…

    2025年12月6日 科技
    000
  • 如何在mysql中开发在线考试系统数据库

    答案是设计在线考试系统数据库需明确用户、科目、试题、试卷、考试记录等核心模块,通过MySQL建立users、subjects、questions、options、exams、exam_questions、exam_attempts和user_answers等表,利用外键约束保证数据完整性,采用JSO…

    2025年12月6日 数据库
    000
  • VSCode智能补全:配置基于AI的代码建议与自动完成功能

    首先安装 GitHub Copilot 插件并登录账号,启用内联建议与快捷设置,通过清晰命名和注释提升补全准确率,审查生成代码并提交反馈以优化模型,从而显著提升编码效率。 VSCode 的智能补全功能可以通过集成基于 AI 的工具显著提升编码效率。目前最成熟且广泛使用的 AI 驱动代码补全是 Git…

    2025年12月6日 开发工具
    000
  • laravel Eloquent如何处理JSON字段的查询_Laravel Eloquent JSON字段查询处理方法

    Laravel Eloquent支持JSON字段查询与更新,使用->操作符访问键值,如profile->age;支持嵌套查询如profile->address->province;可用whereJsonContains查询数组内容;结合$casts属性自动转换JSON字段为数…

    2025年12月6日 PHP框架
    000
  • AIGC检测官网入口 知网免费查重链接直达

    知网AIGC检测官方入口为https://cx.cnki.net,基于大模型算法提供中英文论文AI生成内容识别服务。该平台结合知识增强与语义分析技术,生成可视化报告,适用于毕业、职称等学术文本自查。检测服务需注册账号并付费使用,官方不提供永久免费查重。第三方“免费查重”存在数据泄露或结果不准风险,建…

    2025年12月6日 科技
    000
  • mysql中如何查看启动错误信息

    首先通过错误日志定位MySQL启动问题,1. 查找日志路径:检查配置文件my.cnf/my.ini中的log_error项,或执行SHOW VARIABLES LIKE ‘log_error’;,或查看默认路径如/var/log/mysqld.log;2. 使用tail -f…

    2025年12月6日 数据库
    000
  • mac怎么更改电脑的网络名称_Mac更改电脑网络名称方法

    可通过系统设置修改Mac网络名称:进入“系统设置-通用-关于”,更改“名称”字段即可;2. 建议同步在“共享”中更新“电脑名称”以确保一致性;3. 高级用户可用终端命令分别设置ComputerName、HostName和LocalHostName实现精确控制,三项建议统一。 如果您希望在局域网中让您…

    2025年12月6日 系统教程
    000
  • Laravel中高效过滤未来事件:使用查询构建器避免显示过期活动

    本文将指导您如何在laravel应用中高效地过滤数据库中的事件,确保只显示尚未开始的未来活动。通过利用laravel查询构建器的`where`子句和`now()`辅助函数,可以直接在数据库层面进行日期比较,从而避免获取所有数据后在应用层进行低效的循环过滤,显著提升性能并简化代码逻辑。 在Web应用程…

    2025年12月6日 后端开发
    000
  • Next.js 13+ 动态路由中构建相对路径链接的最佳实践

    next.js 13+ 中,当在动态路由下使用 “ 组件进行相对路径导航时,直接使用相对路径可能导致错误重定向。本文将深入探讨此问题,并提供基于 `usepathname` 钩子的解决方案,指导开发者如何正确地构建和拼接动态 url,确保 “ 组件在复杂路由结构中实现预期行为…

    2025年12月6日 web前端
    000

发表回复

登录后才能评论
关注微信