原标题:干货入门:几行 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余位本硕博和青年老师参与公益运营。
科研是一场美丽的冒险,
《百纳》愿做大家冒险路程中最真诚的陪伴者。返回搜狐,查看更多
责任编辑: