使用numpy的参数方程

6 投票
1 回答
10187 浏览
提问于 2025-04-18 05:18

我现在正在用Python实现一个叫做回声状态网络(Echo State Network,简称ESN)的递归神经网络,目的是进行时间序列分类(Time Series Classification,TSC)。

我想用参数方程生成一些轨迹,然后训练我的神经网络来分类这些轨迹,就像这篇文章中提到的那样,作者是Mickael Hüsken 和 Peter Stagge,标题是《递归神经网络用于时间序列分类》。最后,我想比较一下我的ESN和他们的RNN的表现。
不过,我在生成其中一条轨迹时遇到了麻烦。

根据这篇文章,这里有三种类别:

enter image description here
我应该生成类似这样的东西: enter image description here

我为每个类别生成了50条轨迹,alpha是固定的浮点数0.7,beta和t0是随机选择的,范围在0到2*pi之间。每条轨迹包含30个点,所以时间步长是(2*pi)/30。

这是我的代码,我知道这不是最符合Python风格的写法,但对于第一类和第三类来说是有效的。不过,第二类的部分还是有问题 :(

import numpy as np
import sys, getopt, random

timestep = 2.0*np.pi / 30.0
alpha = 0.7

def class1(t, beta):
    return alpha*np.sin(t+beta)*np.abs(np.sin(t)), alpha*np.cos(t+beta)*np.abs(np.sin(t))

def class2(t, beta):
    return alpha*np.sin(t/2.0+beta)*np.sin(3.0/2.0*t), alpha*np.cos(t+beta)*np.sin(2.0*t)

def class3(t, beta):
    return alpha*np.sin(t+beta)*np.sin(2.0*t), alpha*np.cos(t+beta)*np.sin(2.0*t)

def generate():
    clazz = {
            '1' : class1,
            '2' : class2,
            '3' : class3
            }

    for classID in clazz :
        for i in xrange(50):
            fd = open("dataset/%s_%s"%(classID, i+1), 'w')
            beta = 2*np.pi*np.random.random()
            t = 2*np.pi*np.random.random()
            for _ in xrange(30):
               fd.write("%s %s\n"%clazz[classID](t, beta))
               t += timestep
            fd.close()  

当我用matplotlib绘制第二类的轨迹时,结果很奇怪……比如说:

enter image description here

1 个回答

4

第二个方程让我觉得有点奇怪,实际上看起来并没有生成所显示的图形

看看1类和3类的方程,我们很容易就能猜出一个参数方程,可以生成一个有三个“花瓣”的图形:

def class2(t, beta):
    return alpha*np.sin(t+beta)*np.sin(3*t), alpha*np.cos(t+beta)*np.sin(3*t)

然后进行:

for beta in [0, np.pi/3, np.pi/2]:
    pylab.plot(*class2(np.linspace(0, np.pi, 100), beta),
               label='$\\beta={:.3f}$'.format(beta))
pylab.legend()

就会得到:

3-petals figure

撰写回答