Sequential Synthetic Data

一. 前言

在MoSE论文中,作者人工生成了具有时序关系的多任务学习数据集,用于比较不同模型在时序多任务学习中的性能,如下所示:


作者提到这组数据集的生成参考了MMoE论文中的人工数据集:MMoE论文中Synthetic Data生成代码(控制多任务学习中任务之间的相关性)

文中作者给出了数据集生成的数学表达和符号解释:
但是作者并没有提及函数内的参数是如何得到的,同时也没有控制任务之间的相关性,于是我参考这篇文章和MMoE中数据集的生成方法,得到可以控制任务相关性的时间序列多任务学习数据集

二. 程序实现

1.生成正交单位向量

d = 10 #维度

'''生成两个单位向量'''
np.random.seed(10)
u1 = np.random.randn(d)
u1 = u1 / np.linalg.norm(u1)

np.random.seed(22)
u2 = np.random.randn(d)
u2 = u2 / np.linalg.norm(u2)

u = np.vstack((u1,u2)).T #(d,2)

'''向量正交化'''
o = orth(u)
u1 = o[:,0]
u2 = o[:,1]
print(np.linalg.norm(u1))
print(np.linalg.norm(u2))
print(np.matmul(u1.T,u2))
'u1,u2为一组正交单位向量'

2.生成权重系数矩阵

c = 1 #常数
p = 0.2 #相关系数 [-1,1]

w1 = c*u1
w2 = c*(p*u1 + np.sqrt(1-p*p)*u2)

3.生成自变量x

length = 30000 #数据长度
t = np.array([i for i in range(1,length+1,1)]).reshape(-1,1)

o = 3 #合成自变量x的正弦函数数量
x = 0
for i in range(o):
    np.random.seed(30+i)
    w = np.random.randn(d)
    x = x+np.sin(t*w)+np.random.normal(0,0.01,1)
print(x.shape) #(length,d)

4.随机生成生成m组正弦函数的参数

m = 10 #组合正弦的数量

np.random.seed(42)
ab = np.random.randn(2,m)
a = ab[0,:] #(m,)
b = ab[1,:] #(m,)

5. 生成因变量y1和y2

y1 = np.matmul(x,w1.T)
y2 = np.matmul(x,w2.T)
for j in range(m):
    y1 = y1+np.sin(a[j]*np.matmul(x,w1.T)+b[j])+np.random.normal(0,0.01,1)
    y2 = y2+np.sin(a[j]*np.matmul(x,w2.T)+b[j])+np.random.normal(0,0.01,1)
y = np.hstack((y1.reshape(-1,1),y2.reshape(-1,1))) #(length,2)

6.保存数据集

'''保存数据集'''
X_column_names = ["X"+str(i) for i in range(1,d+1,1)]
X_f = pd.DataFrame(x,columns=X_column_names)
Y_column_names = ["Y"+str(i) for i in range(1,2+1,1)]
Y_f = pd.DataFrame(y,columns=Y_column_names)
data = pd.concat([X_f,Y_f], axis=1)
data.to_csv('{}_{}_TimeSeriesSyntheticData({}_{}).csv'.format(length,d,m,p),index=False)
data.head()

7. 查看y1和y2的曲线及其相关系数

outputlen = 100
plt.plot(t[:outputlen],y1[:outputlen],y2[:outputlen])

'计算w1和w2的余弦相似度'
cos_sim = w1.dot(w2) / (np.linalg.norm(w1)*np.linalg.norm(w2))
print("cos(w1,w2)=",cos_sim)

'计算label之间的皮尔逊相关系数'
corr = np.corrcoef(y[:,0],y[:,1])
print("person(y1,y2)=",corr[0,1])

输出:
cos(w1,w2)= 0.2000000000000001
person(y1,y2)= 0.13585686308456674

至此可以控制任务相关性的时间序列多任务学习数据集就构建完成了,设置不同的参数p、o、m或随机种子即可生成截然不同的数据集。