CompModCogPsy
  • 全书介绍和写作计划
  • 第一章 计算认知科学导论
    • 前言
    • 1.1 交叉学科三角
    • 1.2 认知科学的特点
    • 1.3 认知科学的发展历史
    • 1.4 我们为什么需要计算认知
      • 1.4.1 认知科学的基础假设:信息处理理论
      • 1.4.2 挑战与“诞生”
      • 1.4.3 计算认知的必要性
  • 第二章 计算模型基础
    • 2.1 什么是计算模型?
    • 2.2 模型选择
    • 2.3 模型拟合
    • 2.4 模型准确度
    • 2.5 模型可信度
  • 第三章 概率推断和贝叶斯理论
    • 3.1 概率基础
    • 3.2 概率推断
      • 3.2.1 似然函数
      • 3.2.2 最大似然估计
    • 3.3 贝叶斯理论
    • 3.4 拓展阅读:p值
    • 3.5 编程练习-最大似然估计
  • 第四章 心理物理学和信号检测论
    • 心理物理学基础
    • 心理物理曲线
      • 几种常见的心理物理曲线
      • 拟合心理物理曲线
    • 信号检测论
      • dprime
      • 决策标准
      • receiver operating curve (ROC)曲线和area under curve (AUC)
      • dprime和AUC的关系
      • 2AFC的应用
      • Page
    • 展望
  • 第五章 近似推断
    • 马尔科夫链蒙特卡洛采样
      • Metropolis-Hasting算法
    • 变分推断
    • 展望
  • 第六章 知觉决策
    • 模拟一个简单知觉决策
    • 模拟决策和反应时
    • 权衡反应时和正确率
    • 6.4 经典漂移扩散模型
    • 漂移扩散模型的应用
      • 基于价值的决策
      • 精神疾病的应用
      • 社会认知
    • 展望
  • 第七章 价值决策
    • 人类决策基础
    • 前景理论
    • 风险决策
    • 展望
  • 第八章 强化学习
    • 机器学习强化学习基础
      • 动态规划
      • 时间差分学习
      • 基于模型和无模型强化学习
    • 心理学的强化学习
    • 强化学习的交叉关系
    • 强化学习模型和参数估计
    • Rescorlar-wagner模型
    • 二阶段任务
    • 展望
  • 第九章 社会决策和社会学习
    • 社会决策
    • 社会学习
    • 展望
  • 第十章 神经网络
    • 神经网络和心理学引言
    • 神经网络基础
      • 多层感知机
      • 卷积神经网络
      • 循环神经网络
    • 神经网络和人脑加工的关系
      • 感知觉的编解码
      • 工作记忆
      • 长时记忆
      • 学习和决策
    • 展望
由 GitBook 提供支持
在本页
  1. 第六章 知觉决策

权衡反应时和正确率

在上一节中,我们已经介绍了知觉决策中的漂移扩散模型,漂移扩散模型可以很好的解释知觉选择和反应时的数据。接下来在本节中,我们进一步探讨,这个模型是否可以解释认知心理学中常见的反应时-正确率权衡(speed-accuracy trade-off)问题。

思考这样一个问题:如何漂移扩散模型成立的话为什么会有speed-accuracy trade-off呢?

我们做出这样的假设:

激进的人,倾向于快点反应,侧重反应时,决策边界降低,正确率下降;

保守的人,倾向于慢点反应,侧重正确率,决策边界升高,反应时升高。

也就是说,speed-accuracy trade off并不体现证据积累的速度快慢,而是体现了不同个体的不同决策边界。我们首先重复上一节中模拟多次知觉决策的函数:

from scipy.stats import bernoulli
import numpy as np
import matplotlib.pyplot as plt

# 重复ddm的函数
def ddm1(D=10, f=0.55, B=40):
    # <D>: 总点数
    # <f>: 正确点所占的比例
    # <B>: 决策边界
    i = 0
    N_correct = 0
    N_wrong = 0
    delta = [] # 设置delta为一个列表
    delta.append(N_correct - N_wrong)

    while np.abs(delta[i]) < B:
        for j in range(D):
            # 采样这个点的运动方向
            dir = bernoulli.rvs(f, size=1)[0] 
            # update the counts
            N_correct = N_correct + dir
            N_wrong = N_wrong + (1-dir)
        
        # 增加一帧
        i = i + 1
        # 计算差异
        delta.append(N_correct - N_wrong)

    correct = (delta[-1]>0) # 判断正确与否
    RT = i # 反应时
        
    return correct, RT, delta 

接下来,我们设置不同的决策边界来进行实验,来看看假如使用不同的决策边界会发生什么:

# 设制不同的决策边界
B = [2, 4, 8, 16, 32] 

nTrial = 100 # 总试次数

meanACC = np.empty(len(B)) # 记录每个决策边界的平均正确率
meanRT = np.empty(len(B)) # 记录每个决策边界的平均反应时
choice = np.empty(nTrial) # 记录每个试次中的选择
RT = np.empty(nTrial) # 记录每个试次的反应时

for idx, val in enumerate(B): # 循环每个决策边界
    for i in range(nTrial): # 循环每个试次
        choice[i], RT[i],_ = ddm1(B=val)
    meanACC[idx] = choice.mean()
    meanRT[idx] = RT.mean()

让我们可视化出决策边界、反应时和正确率之间的关系:

fig, ax = plt.subplots(1,3, figsize=(12, 4))

# 将正确率画为决策边界的函数
plt.sca(ax[0])
plt.plot(B, meanACC, '-o') 
plt.ylim([0.5, 1])
plt.ylabel('Accuracy')
plt.xlabel('Decision boundary')

# 将反应时画为决策边界的函数
plt.sca(ax[1])
plt.plot(B, meanRT, '-o')
plt.ylabel('Reaction time')
plt.xlabel('Decision boundary')

# 将正确率画为反应时的函数
plt.sca(ax[2])
plt.plot(meanRT, meanACC, '-o')
plt.ylim([0.5, 1])
plt.xlabel('Reaction time')
plt.ylabel('Accuracy')

通过可视化结果,我们可以看到,反应时和正确率都会随着决策边界的提高而增加,这与我们的经验相符合。接下来我们进一步理解conherence,也就是任务的难度,如何影响反应时和正确率:

coh = np.array([0.032, 0.064, 0.128, 0.256, 0.52])
f = (coh+1)/2 # 将coh转换为f

B = 5 # 决策边界

nTrial = 100 

meanACC = np.empty(len(f))
meanRT = np.empty(len(f))
choice = np.empty(nTrial)
RT = np.empty(nTrial)

for idx, val in enumerate(f): # 循环coherence
    for i in range(nTrial): # 循环试次
        choice[i], RT[i],_ = ddm1(D=5, f=val, B=B)
    meanACC[idx] = choice.mean()
    meanRT[idx] = RT.mean()

可视化出coherence和反应时、正确率之间的关系:

fig, ax = plt.subplots(1, 2, figsize=(8, 3))

# 将正确率画为coherence的函数
plt.sca(ax[0])
plt.plot(coh, meanACC, '-o') 
plt.ylim([0.5, 1])
plt.ylabel('Accuracy')
plt.xlabel('Coherence')
plt.xscale('log')

# 将反应时画为coherence的函数
plt.sca(ax[1])
plt.plot(coh, meanRT, '-o')
plt.xscale('log')
plt.ylabel('Reaction time (# of frames)')
plt.xlabel('Coherence')

我们可以看到,随着任务难度的降低,正确率会随之增加,反应时会随之降低,这也与我们的经验相符合,这说明我们的假设很好的模拟出了真实的知觉决策现象。

最后更新于8个月前