python动力学_干货入门:几行 Python 代码实现复杂社会动力学

原标题:干货入门:几行 Python 代码实现复杂社会动力学

我们将对同一群体内两种文化特征(cultural traits)的相互竞争进行建模。这是典型的文化动力学(cultural dynamics)场景:个体必须在两个或多个的互斥(mutually exclusive)项(诸如宗教信仰,选举,足球比赛)中选择一个。在本例中,我们对个体必须抉择(例如你不能信仰两个宗教)的情况十分感兴趣,当然,更复杂的情况:个体可以有多个选择,也不难实现。

随着时间的推移,个体会改变原有的选择。最终的决定取决于每种文化特征的输出(payoff)。输出是对特征相关影响(relative interest)的衡量,根据:

a)有多少人呈现出这种特征,以及

b)特征的吸引力(attractiveness)。

类似这种动力学的例子可以是两个不同宗教间的竞争。某些信仰因为有人信仰而变得更有吸引力。但是另一些信仰本质上对群体中的部分个体更有吸引力,即使他们只是小众。最后,因为社会准则不是静止不变的,所以特定信仰的吸引力也会随时间发生改变。

假定时间是离散的,从 t = 0 开始。

在每个时刻 t,两个群体 At 和 Bt 按照个体从 A 到 B 以及 B 到 A 的流动进行更新。这里值可以为负数,那就代表从 B 流动到 A 的人更多。

让我们想想这些怎么用代码实现。

[Python] 纯文本查看 复制代码

# 时间维度 MAX_TIME = 100 t = 0

# 初始时刻

# 初始种群 N = 100

# 群体数量 A = 65

# 群体中信众 A 的初始值 B = N-A

# 群体中信众 B 的初始值

# 附加参数 Ta = 1.0

# 文化特征 A 初始吸引力 Tb = 2.0

# 文化特征 A 初始

吸引力 alpha = 0.1

# 流动过程的强度

# 初始化列表用以绘图

believersA = [ ]

believersB = [ ]

# 添加初始群体

believersA.append(A)

believersB.append(B)

def payoff(believers, Tx,Ty): proportionBelievers = believers/N

attraction = Tx/(Ty + Tx)

return proportionBelievers * attraction

while t < MAX_TIME:

# 计算当前时刻信众 A 与 B 改变后的输出差异 variationBA = payoff(A, Ta, Tb)

variationAB = payoff(B, Tb, Ta)

difference = variationBA - variationAB

# B -> A

if difference > 0:

variation = difference*B

# A -> B

else:

variation = difference*A

# 利用 α 参数控制改变速度

variation = alpha*variation

# 更新群体

A = A + variation

B = B - variation

# 将值存入列表中用以绘图 believersA.append(A)

believersB.append(B)

# 进入到下一个迭代

t = t + 1

import matplotlib.pyplot as plt

# 导入绘图库

plt.style.use('ggplot')

# 让图片看起来更美观

# 绘制结果

plt.plot(believersA)

plt.plot(believersB)

结果如下图:

你可以看到随着时间变化两类信众的增减。吸引力 Tb 高于 Ta 并不十分意外。然而,你是否能想象出怎样的参数配置不会对群体产生影响?试着设置不一样的初始值来观察什么样的组合能打破(counteract)这种模式。

把 A 的初始值分别设置为 5,10,25,50,75,

把 MAX_TIME 设置为 1000,

把 Ta 和 Tb 设置为 1.0,10.0,0.1,0.01 等等,

把 α 分别设置为 0.01 和 1.0

你可以尝试所有可能的参数配置来观察群体间的流动有多快,也可以看看每个变量妨碍流动的最小值是多少。

然而,如果我们让每次流动时的吸引力随时间改变,那这个模型就更有趣了。让我们定义一些函数来实现这个想法。把下面的函数添加到 While 循环的开始处(记得缩进!)。

Ta, Tb = attractiveness(Ta, Tb)

Ta 和 Tb 将按照我们所期望的模型动力进行改变。让我们定义“attractiveness”函数。我们已经在写过“payoff”函数了,所以这应该只是小菜一碟。在每个时刻,我们都会用我们定义的内核(kernel) K 来细微改每个文化特性的吸引力。如下表达:

K 的几种情况如下:

确定的文化特性 Ka = Kb = 0

高斯随机过程 K = N(0,1)

组合以上两类(例如,Ka = N(0,1) and Kb = 1/3)

让我们在一些简单的场景中开始,例如 a)Ta 在每一时刻都将随固定的 Ka 增加, b)Kb 等于 0(所以 Tb 在整个模拟中都是固定的)。

def attractiveness(Ta, Tb):

Ka = 0.1

Kb = 0

Ta = Ta + Ka

Tb = Tb + Kb

return Ta, Tb

首先,我们定义函数并给出输入:

def attractiveness(Ta, Tb):

接着,我们确定每个文化特性的吸引力改变了多少(也就是定义 Ka 和 Kb)

Ka = 0.1

Kb = 0

加入等式中:

Ta = Ta + Ka

Tb = Tb + Kb

最后,返回新的值:

return Ta, Tb

这就是该函数的功能。主循环现在像下面这样:

while t < MAX_TIME:

# 更新吸引力

Ta, Tb = attractiveness(Ta, Tb)

# 计算当前时刻信众 A 与 B 改变后的输出差异

variationBA = payoff(A, Ta, Tb)

variationAB = payoff(B, Tb, Ta)

difference = variationBA - variationAB

# B -> A

if difference > 0:

variation = difference*B

# A -> B

else:

variation = difference*A

# 利用 α 参数控制改变速度

variation = alpha*variation

# 更新群体

A = A + variation

B = B - variation

# 将值存入列表中用以绘图

believersA.append(A)

believersB.append(B)

# 进入到下一个迭代

t = t + 1

如果进行绘图,你会得到和之前不一样的结果:

plt.plot(believersA)

plt.plot(believersB)

试着改变 Ka 和 Kb 的值,看看会发生什么。你能发现使两个文化特性共存(coexist)的均衡(equilibrium)吗?

这有些函数可以用来动态改变每个文化特性的“吸引力”,试着用一下:

import numpy as np # 这行紧跟在脚本开始处其它的“import”

[Python] 纯文本查看 复制代码

def attractiveness2(Ta, Tb):

# 随机时序自相关(temporal autocorrelation with stochasticity)(正态分布)

# 我们将得到正态分布 N(0,1)的两个采样

Ka, Kb = np.random.normal(0, 1, 2)

# 计算 Ks 的差

diff = Ka-Kb

# 将 Ks 的差与吸引力进行运算

Ta += diff

Tb -= diff

return Ta, Tb

def attractiveness3(Ta, Tb):

# 反盲从(anti-conformism)动力学(群体越多吸引力反而越小)

# 初始化都为 0

Ka = 0

Kb = 0

# 首先我们用 mean=last popSize(相关时刻下的群体 A)对 gamma 进行采样

diffPop = np.random.gamma(believersA[t])

# 我们用这个值减去经过相同计算的群体 B

diffPop = diffPop - np.random.gamma(believersB[t])

# 如果 B 更大,我们需要提高 A 的吸引力

if diffPop < 0:

Ka = -diffPop

# 否则如果 A 更大,我们需要提高 B 的吸引力

else:

Kb = diffPop

# 改变当前值

Ta = Ta + Ka

Tb = Tb + Kb

return Ta, Tb

利用上述函数(只修改“attractiveness”函数,例如改为“attractiveness2”),加入些微的动态变化时,观察将会发生什么改变。如果初始条件改变,会发生什么变化?如果迭代时间更长又会怎样呢?

本文来自百纳学术,经授权转载。

链接地址:http://www.icomsol.cn/portal.php?mod=view&aid=70

小编:老潘

欢迎个人转发到朋友圈

公众号、报刊等转载请联系授权

bainazhishi@163.com

▼点击查看百纳历史干货

《百纳知识》由百纳公益组织创办和运营,

由子斯月、王成禹、赵序茅3位博士担任主编,

60余位本硕博和青年老师参与公益运营。

科研是一场美丽的冒险,

《百纳》愿做大家冒险路程中最真诚的陪伴者。返回搜狐,查看更多

责任编辑:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值