Python和MATLAB自旋玻璃投资组合神经网络广义方程

105 篇文章 5 订阅
28 篇文章 0 订阅

🎯要点

  1. 投资者根据多个目标和风险承受能力找到最佳分配权重,获得更高夏普比率。
  2. 模拟自旋玻璃模型,绘制模型测量热图以及量子近似优化算法
  3. 神经网络广义方程对免疫库分类学习

🍁三种广义方程结构

在这里插入图片描述

🍪语言内容分比

在这里插入图片描述
在这里插入图片描述

🍇Python自旋玻璃

在凝聚态物理学中,自旋玻璃是一种以随机性为特征的磁态,此外在称为“冻结温度”的温度下自旋冻结时具有协同行为。 T f T_{ f }{ } Tf 在铁磁固体中,组成原子的磁自旋都沿同一方向排列。与铁磁体相比,自旋玻璃被定义为“无序”磁态,其中自旋随机排列或没有规则模式,耦合也是随机的。

“玻璃”一词源于自旋玻璃中的磁无序与传统化学玻璃(例如窗玻璃)的位置无序之间的类比。在窗玻璃或任何非晶态固体中,原子键结构非常不规则。相反,晶体具有均匀的原子键模式。在铁磁固体中,磁自旋都沿同一方向排列,这类似于晶体的晶格结构。

自旋玻璃主要有两个方面。在物理方面,自旋玻璃是具有独特性质的真实材料。在数学方面,受真实自旋玻璃启发的简单统计力学模型得到了广泛的研究和应用。自旋玻璃及其内部产生的复杂内部结构被称为“亚稳态”,因为它们“卡”在除最低能量配置(对齐和铁磁性)之外的稳定配置中。这些结构的数学复杂性很难,但通过实验或模拟进行研究很有成效;可应用于物理学、化学、材料科学和计算机科学中的人工神经网络。

让我们采用蒙特卡洛模拟,看看当我们改变 p p p 时会发生什么。我们将取一个大小为 N × N N \times N N×N 的数组,并根据上面的概率开始填充旋转。首先,我们必须引入一个额外的概率 p 0 p_0 p0,即第一个(假设左上角)旋转为 ↑ \uparrow 的概率。一旦我们设置了第一个旋转,我们就可以设置第一行中的其余旋转。一旦我们到达第二行,我们就会遇到困难。它上面的旋转已经设置好了,所以这些旋转有 2 个已设置的邻居。我们需要以与 p p p 的基本定义一致的方式,给定 2 个邻居 n 1 n_1 n1 n 2 n_2 n2,计算条件概率 P ( s = ↑ ∣ n 1 = . , n 2 = . ) P\left(s=\uparrow \mid n_1=., n_2=.\right) P(s=↑∣n1=.,n2=.)。利用贝叶斯定理,对于 P ( s = ↑ ∣ n 1 = ↑ , n 2 = ↑ ) P\left(s=\uparrow \mid n_1=\uparrow, n_2=\uparrow\right) P(s=↑∣n1=↑,n2=↑) 的具体情况:
P ( s = ↑ ∣ n 1 = ↑ , n 2 = ↑ ) = P ( s = ↑ , n 1 = ↑ , n 2 = ↑ ) P ( s = ↑ , n 1 ↑ ↑ , n 2 = ↑ ) + P ( s = ↓ , n 1 = ↑ , n 2 = ↑ ) P\left(s=\uparrow \mid n_1=\uparrow, n_2=\uparrow\right)=\frac{P\left(s=\uparrow, n_1=\uparrow, n_2=\uparrow\right)}{P\left(s=\uparrow, n_1 \uparrow \uparrow, n_2=\uparrow\right)+P\left(s=\downarrow, n_1=\uparrow, n_2=\uparrow\right)} P(s=↑∣n1=↑,n2=↑)=P(s=↑,n1↑↑,n2=↑)+P(s=↓,n1=↑,n2=↑)P(s=↑,n1=↑,n2=↑)
联合三元组概率很容易计算,我们可以考虑先以概率 p 0 p_0 p0 设置 s s s,然后以概率 p p p 设置左邻居和右邻居:
P ( s = ↑ , n 1 = ↑ , n 2 = ↑ ) = p 0 p 2 P\left(s=\uparrow, n_1=\uparrow, n_2=\uparrow\right)=p_0 p^2 P(s=↑,n1=↑,n2=↑)=p0p2
用 Python 代码表达,calculate_conditional_probs_for_1() 返回 P ( s = ↑ , n 1 = . , n 2 = . ) P\left(s=\uparrow, n_1=., n_2=.\right) P(s=↑,n1=.,n2=.) 的条件概率:

def calculate_conditional_probs_for_1(p0, p):
    q = 1 - p
    joint_probs = {
        '000': p0 * p * p,
        '111': p0 * p * p,
        '010': p0 * q * q,
        '101': p0 * q * q,
        '110': p0 * p * q,
        '011': p0 * p * q,
        '001': p0 * p * q,
        '100': p0 * p * q,
    }
    return {
        '00': joint_probs['010']/(joint_probs['010']+joint_probs['000']),
        '01': joint_probs['011']/(joint_probs['011']+joint_probs['001']),
        '10': joint_probs['110']/(joint_probs['110']+joint_probs['100']),
        '11': joint_probs['111']/(joint_probs['111']+joint_probs['101']),
    }

其余部分:

def make_unconditional_set(p0):
    return lambda: random() < p0

def make_conditional_set_one_neighbour(p):
    return lambda n: (n) if (random() < p) else (1 - n)

def make_conditional_set_two_neighbours(p0, p):
    conditional_probs_for_1 = calculate_conditional_probs_for_1(p0, p)
    return lambda n1, n2: random() < conditional_probs_for_1[str(int(n1))+str(int(n2))]

def create_grid(rows, cols, p0, p):
    unconditional_set = make_unconditional_set(p0)
    conditional_set_one_neighbour = make_conditional_set_one_neighbour(p)
    conditional_set_two_neighbours = make_conditional_set_two_neighbours(p0, p)
    grid = np.zeros([rows, cols], dtype=np.bool)    
    # first element
    grid[0, 0] = unconditional_set()
    # first row
    for j in range(1, cols):
        grid[0, j] = conditional_set_one_neighbour(grid[0, j-1])
    # remaining rows
    for i in range(1, rows):
        grid[i, 0] = conditional_set_one_neighbour(grid[i-1, 0])
        for j in range(1, cols):
            grid[i, j] = conditional_set_two_neighbours(grid[i-1, j], grid[i, j-1])
    return grid

def show(grid):
    plt.imshow(grid, cmap='hot', interpolation='nearest')
    plt.show()

让我们用 p 0 = 0.5 p_0=0.5 p0=0.5 p = 0.7 p=0.7 p=0.7 来运行它并看看结果:

show(create_grid(rows=10, cols=10, p0=0.5, p=0.7))

为了确保数学和逻辑是正确的。让我们用上述规则模拟一个大的 100 × 100 100 × 100 自旋玻璃,然后计数所有对,并确保原始条件概率成立:

num_simulations = 100
rows, cols, p0, p = 100, 100, 0.5, 0.70
same, total = 0, 0
for _ in range(num_simulations):
    grid = create_grid(rows, cols, p0, p)
    for i in range(0, rows-1):
        for j in range(0, cols-1):
            if grid[i, j] == grid[i+1, j]:
                same += 1
            if grid[i, j] == grid[i, j+1]:
                same += 1
            total += 2
measured_p = same/total
print(f'Ran {num_simulations} Monte Carlo simulations for grid size {rows}x{cols} with p={p}, measured p was {measured_p:.2}')

输出:

Ran 100 Monte Carlo simulations for grid size 100x100 with p=0.7, measured p was 0.7

👉更新:亚图跨际

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值