SPSS+AMOS数据分析案例教程-关于中介模
SPSS视频教程内容目录和跳转链接
Mplus中介和调节教程
大学生问卷互填群
Meta分析辅导+代找数据
SPSS+AMOS数据分析案例教程-关于中介模
SPSS视频教程内容目录和跳转链接
R语言快速入门视频教程
LCA潜在类别分析和Mplus应用
Amos结构方程模型数据分析入门教程
倒U关系回归分析中介效应和调节效应分析SPSS视频教程
统计咨询(图文问答)

jupyter notebook 扩展开发之 Custom bundler extensions

这是jupyter notebook 插件开发的系列文档之一, 文章最末尾列出了这个系列的所有博客连接.

Read More

jupyter notebook扩展开发之前端插件开发

这是jupyter notebook 插件开发的系列文档之一, 文章最末尾列出了这个系列的所有博客连接.

Read More

jupyter notebook 扩展开发之内容API

这是jupyter notebook 插件开发的系列文档之一, 文章最末尾列出了这个系列的所有博客连接.

Read More

jupyter notebook 扩展开发之自定义请求处理程序

这是jupyter notebook 插件开发的系列文档之一, 文章最末尾列出了这个系列的所有博客连接.

Read More

求取最小二范数解的具体过程

推导一遍案例中求取最小二范数解的具体过程

Read More

Q-learning人工智能玩推箱子小游戏

基本已知条件

1, 舞台情景: 16x16的方格, 游戏中用一个16x16的矩阵表示, 如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 第一关的数据
levels[0]=[
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0],
[0,0,0,0,0,0,1,2,1,0,0,0,0,0,0,0],
[0,0,0,0,0,0,1,0,1,1,1,1,0,0,0,0],
[0,0,0,0,1,1,1,3,0,3,2,1,0,0,0,0],
[0,0,0,0,1,2,0,3,4,1,1,1,0,0,0,0],
[0,0,0,0,1,1,1,1,3,1,0,0,0,0,0,0],
[0,0,0,0,0,0,0,1,2,1,0,0,0,0,0,0],
[0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]];

//...

下图是第一关真实场景.

看这个数据, 对照实际图, 可以知道各个单元格数字代表的意义:

  • 0 代表空格
  • 1 代表树, 是推不动的
  • 2 代表目标位置
  • 3 代表箱子
  • 4 代表悟空

游戏的规则就是控制悟空, 推动箱子, 最终把所有箱子放置到目标位置.

设计思路

不知道Qlearning的请自行搜索相关理论, 我这里假设你已经知道了Qlearning.

Qlearning中最重要的两个概念: State和Action. State表示游戏状态, Action表示可能采取的动作.

Qlearning种的两个最重要的矩阵: R矩阵和Q矩阵.

先来说Q矩阵:

在推箱子游戏中, State有多少种? 计算过程如下:

- 游戏场地的方格数: 16x16
- 每个方格可能的情况: 5
- 假设每个方格的情况是相互独立的(不考虑一个游戏只可能有一个悟空等情况)
- count(state) = 5^(16x16)

这是个很大的数字, 显然这种方法不合适构建Q矩阵. 但是我们知道, 这种算法是不严谨的, 不可能有这么多情况, 还有很多已知条件没有考虑. 但是我并不想考虑那么多, 怎么办?

我们建立一个State和Action的映射字典Q = {state->actions}. 遇到一种state的时候, 先去Q中查找有没有这种情况出现过, 如果没有, 我们假设actions={上:0, 下:0, 左:0, 右:0}, 也就是假设所有的行为都等价. 并把state->actions作为一个键值对存入字典. 下次再遇到这种情况, 就可以更新里面的值了. 所以初始的Q字典只是一个空字典而已.

那么R矩阵怎么得到? 也就是说怎么决定悟空的每一步奖励值.

我们不妨设默认初始值都是-1, 因为我们不管悟空往哪里走, 我们不想让悟空移动太多. 同时每次action总会有产生一些后果, 每种后果都会有不同的奖励值.

- 如果悟空推树, 奖励值是-10, 树怎么能推动呢?
- 如果什么都没有推, 只是移动了一下, 奖励值是默认值-1
- 如果推箱子奖励值是-2, 因为移动箱子是很危险的, 要谨慎
- 如果把箱子推到了目标位置, 奖励10
- 如果任务成功, 所有箱子都达到了目标位置, 奖励是1000
- 如果任务失败(箱子不能推/或被困住), 奖励是-1000

前5条都好办, 但是我们如何识别任务失败呢? 为了思考简单些, 我们定义失败为:
- 有一个箱子不能再推动, 但是所在位置又不是目标位置;
- 所有箱子不能再被推动(箱子的对面都是空的才能被推动)
- 走了1w步还没有完成任务.

那么怎么定义一个箱子无法被推动呢? 我们简单的认为两个挨着的面都是树, 也就是卡在角落里了. 这种定义不太严谨, 有时候一堆箱子堆在一起不能动也算失败, 但是我们程序写起来就难了, 所以不能这么定义.

所以我们这样来计算任务是否失败:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function failed(matrix){
// 找到所有箱子及其坐标
boxes=[]
for (let i=0;i<matrix.length;i++){
row = matrix[i];
up_row = matrix[i-1] or []
below_row = matrix[i+1] or []
for(let j=0;j<row.length;j++){
me = row[j]
around=[below_row[j], row[j-1], up_row[j], row[j+1], below_row[j]]
if (me==3){
// 有一个箱子不能再推动, 但是所在位置又不是目标位置;
for(let c=0;c<4;c++){
if(around[c]==1 or around[c]==3)
}
}
}
}
}

psychopy设置window和显示器参数

有时候我们会发现, 做好的程序放到不同的电脑上会有不同的显示效果, 图形的位置和大小会发生变化, 这是因为我们不懂得psychopy对图形的尺寸和位置的控制方式. 通常来说, 换一个电脑你都要设置显示器和窗口属性, 以便刺激能够正确显示.

psychopy的windows(窗口)和monitor(显示器)的设置很重要, 直接关系到你的整个实验的各种刺激尺寸(size). 下面我们用图文的方式介绍一下需要设置的参数以及如何设置他们.

Read More

psychopy免安装版设置方法

摘要: 无

Read More

psychopy绿色免安装版下载

很多人反映无法安装psychopy, 安装过程总是出现这种那种问题, 所以我特地制作了一个免安装的版本. 在文末有下载地址.

Read More

Q-learning实现flappyBird永不坠落

这篇文章用于展示我自己学习Q-learning算法的一个成果. 简单来说, 使用机器学习算法Q-learning 来让电脑自己学会玩flappyBird这款游戏. 下面展示的是一个真正的游戏, 你点点击鼠标可以出发小鸟的飞行动作, 不过, 在恰当的时机, 电脑会自己触发动作.

Read More