首页 > 软件资讯 > 机器学习二维系统相变

机器学习二维系统相变

时间:2026-02-15 10:30:35

本文基于凝聚态物理中的Ising模型相变理论,运用机器学习技术,包括卷积网络等方法,对Ising模型的相变进行分类。通过模拟生成数据集,并在数据处理阶段确保有序(磁性)与无序(非磁性)状态的有效区分,实现对Ising模型相变的有效识别和分类。

Abstract

凝聚态物理研究复杂系统如电子、原子核、原子和量子比特的组成及其相互作用。其特性在于随粒子数量指数增长的相空间结构,这让人联想到机器学习中的“纬度诅咒”。尽管存在这样的难题,但机器学习却在数据集上展现了良好的分类和回归性能。这里,我们采用现代机器学习技术(全连接、卷积网络),对众多不同的哈密顿体系进行分类与相变研究。通过调用相关库,神经网络可以用于区分序参量,为凝聚态物理的研究提供了新的视角和方法。

机器学习在凝聚态物理中的应用:Ising模型的二分类研究,自然-物理杂志上的一篇文献详细介绍了机器学习方法在处理凝聚态物理中相变问题时的强大能力。凝聚态物理学是研究多体系统的复杂相互作用,同时也是物理领域中最活跃和研究人数最多的一个分支之一。这一领域的另一个重要特点是存在临界现象,这使得它成为最具启发性的分支。相较于其他物理学科,凝聚态物理学拥有一个特别的特点:二阶朗道相变理论。这一理论不仅展示了自发对称性,还提供了一个直观的视角去理解和预测相变过程中的复杂行为。在这篇文章中,研究者们专注于二维铁磁系统Ising模型。通过简单的分类方法,他们能够有效地处理和解决这个问题。这种方法的核心在于二分类:有磁性和无磁性状态。这种分类方式使得问题变得清晰易懂,并且可以实现高精度的预测结果。研究人员不仅提供了详细的分析过程,还强调了统计物理学和机器学习在这一领域的共同作用。在这篇文章中,研究者们并没有提供任何具体的物理公式或复杂的数学模型。相反,他们更侧重于通过简单的分类来展示机器学习方法的有效性。这种做法使得这篇文章具有很高的可读性和吸引力,能够吸引非专业背景的读者。尽管文章中的模型看似没有任何特殊的意义,但它展示了凝聚态物理学中相变问题的基本理论框架。为了理解这些复杂的物理现象,研究者们需要掌握丰富的物理知识和相关的数学技能,包括统计物理学、概率论等。作者自己也承认,在描述这些基本概念时可能会显得有些粗糙或不专业。这种简化的解释方式虽然可能导致一些读者产生误解,但正是这种对物理基础的深刻理解和直观展示,使得这篇文章能够成为一个重要的参考资料。

一 相变理论

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

系综理论

在物理学的发展历程中,概率理论作为重要的基础工具之一,在统计力学领域发挥了重要作用。与经典力学方法不同,统计力学采用了引入统计手段来描述力学性质的方法。这种策略在当时为量子力学的诞生奠定了坚实的基础。正是由于这样的背景,统计力学与经典理论和量子理论之间存在差异性的同时,又展现出了某种相似之处。例如,在统计物理学中,我们寻找的函数称为配分函数,它代表了单粒子系统在整个相空间中出现的概率。这在量子物理中也有所体现,当我们结合统计力学和凝聚态物理时,这种方法能够很好地描述单粒子系统的性质。在经典力学中,人们通常通过寻找哈密顿量或构造拉格朗日函数来获取系统的含时演化信息。同样,在量子力学中,求解薛定谔方程也为了找到一个波函数,以全面描述系统。而统计物理领域则有所不同,我们在寻找的函数叫做配分函数。配分函数提供了单个状态在整个相空间中的概率信息。总之,统计力学、经典力学和量子力学在不同程度上都展示了它们之间的联系与差异,其中结合统计物理学和凝聚态物理学的方法成为了现代物理学的重要组成部分。

举个栗子:抛硬币

一个硬币

- 手动分割线)

- 手动分割线)

假如你手里有一个硬币,显而易见,其state有俩种:正面朝上和反面向下。那么你咋能知道每一个state出现的概率呢?一种思路是通过不断抛掷这个硬币来观察状态的频率,最终这两个状态出现的频率会趋于它们各自的概率(大数定律)。另一种方法则是通过晃动一个箱子里的硬币并计数,这种方法也可以用来计算概率。假设这两种方法得到的结果是一致的,即含时平均等于系综平均,也就是所谓的各态遍历假说。这种假设是统计理论的基石之一,它解决了多粒子系统力学耦合无法描述的问题。

我们设想手里有具有相同初始条件的系统。在这种情况下,某一特定状态出现的频率即代表该状态在空间中的概率分布。比如,一枚均匀硬币掷出正面或反面的概率是。

Ising Model

Ising模型是最简单且实用的统计模型之一,在量子物理学中代表了自旋这一概念,并基于经典的系统理论构建。它究竟讲了什么呢?让我们来做个小实验:拿起一个磁铁,然后用打火机烧一烧,你会发现这个磁铁的磁性竟然消失了!这是因为Ising模型揭示了温度变化对物质性质的影响,即经典物理中的自发相变现象。通过简单的实验观察和理论解释,我们可以更深入地理解这一重要概念在自然界和技术应用中的作用。

我们的Ising模型正是在阐述这样一个现象。当我们提到有磁性的磁铁变成了没有磁性的废铁时,这一过程确实发生了相变。引入物理量,磁化强度作为序参量来描述这种现象。当温度低于临界值时,磁化强度保持不为零的状态;而当温度高于某一特定点时,磁化强度会恒定为零。我们称之为这一过程发生了相变。Ising模型将所有原子视为固定的(固体的活动范围较小,忽略)。电子是另一个例子,它们被看作是固定在空间位置上的粒子。每个电子都贡献一个磁场强度,最终形成了一个巨大的磁铁。

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

这是无序的图片

在物理学中,黑色像素表示自旋向上,白色像素代表自旋向下,每一个像素代表一个电子。这种可视化方法直观地展示出了量子物质的有序和无序状态。有序状态是稳定的、规律性的;反之,无序状态则是混乱且不确定的。熵值越高,意味着系统的无序程度越高,而熵值越低则表示系统更加有序。在无序情况下,粒子倾向于分散,但当它们被聚集成块时,在有序状态下,自旋向下的电子聚集在一起形成一个区域,而自旋向上的电子也形成了另一个区域。对于论文的复现研究来说,我们已经掌握了这一基础知识,下面将展示如何通过Monte Carlo模拟生成上述图像。值得注意的是,我们在处设定了相变临界点,高于此温度则表现出无序状态(顺磁性),而低于该温度则显示出有序状态(铁磁性)。

进行机器学习的第一步是准备数据。首先,我们通过蒙特卡洛仿真来模拟二维Ising模型的数据。编写并执行这段代码将生成大量随机样本,为后续数据分析提供基础。如果需要观察热容在临界点附近的突变现象,可以自行运行这个过程。整个流程可能需要一至两个星期,务必根据具体情况调整时间安排。

#这一段代码是从网上直接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() < np.exp(-cost*beta): s *= -1 config[a, b] = s return configdef calcEnergy(config): '''Energy of a given configuration''' energy = 0 for i in range(len(config)): for j in range(len(config)): S = config[i,j] nb = config[(i+1)%N, j] + config[i,(j+1)%N] + config[(i-1)%N, j] + config[i,(j-1)%N] energy += -nb*S return energy/4.def calcMag(config): '''Magnetization of a given configuration''' mag = np.sum(config) return mag nt = 2**8 # 温度点数量N = 4**2 # 点阵尺寸, N x N eqSteps = 2**10 # MC方法平衡步数mcSteps = 2**4 # MC方法计算步数n1, n2 = 1.0/(mcSteps*N*N), 1.0/(mcSteps*mcSteps*N*N) tm = 2.269; T=np.random.normal(tm, .64, nt) #设2.269为临界点T = T[(T>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.数据集处理

为解决从非平衡态过渡到平衡态的漫长过程和大量Monte Carlo步骤的问题,我已在GitHub上发布了数据,并将其整合进项目中以供复现。

!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]

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

这是一个数据集的初始化方法,包含图像和标签。通过读取指定文件中的数据,并对每一行进行处理以创建一个二维数组。然后使用transform对原始图像进行转换。最后将得到的图像与对应的标签结合在一起返回。此代码为后续的数据预处理提供了基础。

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 [

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)登录后复制

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

热门推荐