Vous pouvez générer une sortie au format csv et en nuage de points. J'utilise les opérateurs c_ et r_.
Données artificielles pouvant être créées Anneaux et leurs combinaisons (anneaux en cercles (2D), motifs de type xor (2D), cercles entrelacés (3D)) Bague torsadée et entrelacée (3D) Coque de sphère de toute dimension (coque de sphère à l'intérieur de la coque de sphère) Attracteur de Lorenz Attracteur de Rossler
référence Marsaglia's method http://stackoverflow.com/questions/15880367/python-uniform-distribution-of-points-on-4-dimensional-sphere
gendata.py
# -*- coding: utf-8 -*-
"""
Created on Wed May 07 21:17:21 2014
@author: xiangze
"""
import csv
import numpy as np
#from matplotlib.pyplot import *
import matplotlib.pyplot as plt
PI=np.pi
PI2=2*PI
def gencircle(rc,rr=0.1,offset=[0,0],num=100,label=0):
c=[]
for i in range(num):
r=rc+np.random.uniform(-rr,rr,1)
th=np.random.uniform(0,PI2,1)
c.append([r*np.sin(th)+offset[0],r*np.cos(th)+offset[1]])
return np.c_[np.array(c).reshape(num,2),np.repeat(label,num)]
def genring(rc,rr=0.1,offset=[0,0,0],num=100,label=0,normaldir='x'):
if(normaldir=='x'):
a=gencircle(rc,rr,[offset[1],offset[2]],num,label)
return np.c_[np.repeat(offset[0],num),a[:,0],a[:,1],a[:,2]]
elif(normaldir=='y'):
a=gencircle(rc,rr,[offset[0],offset[2]],num,label)
return np.c_[a[:,0],np.repeat(offset[1],num),a[:,1],a[:,2]]
else:
a=gencircle(rc,rr,[offset[0],offset[1]],num,label)
return np.c_[a[:,0],a[:,1],np.repeat(offset[2],num),a[:,2]]
def gentwistedring0(rc=[1,0.3],rr=0.1,offset=[0,0,0],num=100,label=0,twistratio=3.0,phase=0):
c=[]
for i in range(num):
r=rc[0]+np.random.uniform(-rr,rr,1)
th=np.random.uniform(0,PI2,1)
c1=[r*np.sin(th)+offset[0],r*np.cos(th)+offset[1],offset[2]]
c2=[rc[1]*np.sin(th*twistratio+phase)*np.sin(th) , rc[1]*np.sin(th*twistratio+phase)*np.cos(th) ,rc[1]*np.cos(th*twistratio+phase)]
c.append([c1[i]+c2[i] for i in range(len(c1))])
return np.c_[np.array(c).reshape(num,3),np.repeat(label,num)]
def gentwistedring(rc=[1,0.3],rr=0.1,offset=[0,0,0],num=100,label=0,normaldir='x',twistratio=5.0,phase=0):
a=gentwistedring0(rc,rr,offset,num,label,twistratio,phase)
if(normaldir=='x'):
return a
elif(normaldir=='y'):
return np.c_[a[:,1],a[:,2],a[:0],a[:3]]
else:
return np.c_[a[:,2],a[:,0],a[:1],a[:3]]
#http://stackoverflow.com/questions/15880367/python-uniform-distribution-of-points-on-4-dimensional-sphere
#Marsaglia's method
def gensphere(rc,rr=0.1,offset=[0,0,0],num=100,label=0,dim=3):
normal_deviates = np.random.normal(size=(dim, num))
r=rc+np.random.uniform(-rr,rr,1)
r = np.sqrt((normal_deviates**2).sum(axis=0))*r
p =normal_deviates/r
return np.c_[np.array(zip(*p)).reshape(num,dim),np.repeat(label,num)]
def gensphere0(rc,rr=0.1,offset=[0,0,0],num=100,label=0):
c=[]
n=int(np.sqrt(num))
for ph in np.random.uniform(-PI,PI,n):
for th in np.random.uniform(0,PI2,n):
r=rc+np.random.uniform(-rr,rr,1)
c.append([r*np.sin(th)*np.sin(ph)+offset[0],r*np.cos(th)*np.sin(ph)+offset[1],r*np.cos(ph)+offset[2]])
return np.c_[np.array(c).reshape(num,3),np.repeat(label,num)]
def gensphere1(rc,rr=0.1,offset=[0,0,0],num=100,label=0):
c=[]
n=int(np.sqrt(num))
for ph in np.random.uniform(-PI,PI,n):
p=0
if(p>=n):
break
else:
m=int(np.abs(np.sin(ph)*n))
if(m!=0):
for th in np.random.uniform(0,PI2,m):
r=rc+np.random.uniform(-rr,rr,1)
c.append((r*np.sin(th)*np.sin(ph)+offset[0],r*np.cos(th)*np.sin(ph)+offset[1],r*np.cos(ph)+offset[2]))
p=p+m
l=len(c)
return np.c_[np.array(c).reshape(l,3),np.repeat(label,l)]
def genlorenz(init=[0,0.1,0],offset=[0,0,0],rr=0.,num=100,p=10,r=28,b=2.66,label=0,dt=0.01):
cc=[]
x=init[0]
y=init[1]
z=init[2]
for t in range(num):
cc.append([x,y,z])
x=x+dt*(-p*x+p*y) +np.random.uniform(-rr,rr,1)
y=y+dt*(-x*z+r*x-y) +np.random.uniform(-rr,rr,1)
z=z+dt*( x*y-b*z) +np.random.uniform(-rr,rr,1)
return np.c_[np.array(cc).reshape(num,3),np.repeat(label,num)]
def genrossler(init=[0,5,0],offset=[0,0,0],num=100,a=0.2,b=0.2,c=5.7,label=0,dt=0.05):
cc=[]
x=init[0]
y=init[1]
z=init[2]
for t in range(num):
cc.append([x,y,z])
x=x+dt*(-y-z)
y=y+dt*( x+a*y)
z=z+dt*( b+z*(x-c))
return np.c_[np.array(cc).reshape(num,3),np.repeat(label,num)]
def cshow2(data):
cc=zip(*data)
plt.scatter(cc[0],cc[1],c=cc[2])
plt.draw()
plt.show()
def cshow3(data):
from mpl_toolkits.mplot3d import Axes3D
fig=plt.figure()
ax = Axes3D(fig)
cc=zip(*data)
ax.scatter(cc[0],cc[1],cc[2],c=cc[3])
plt.draw()
plt.show()
def test(data,dump=False,fname="test.csv"):
if(data.shape[1]==3):
cshow2(data)
else:
cshow3(data)
if(dump):
np.savetxt(fname,data,delimiter=",")
if __name__=="__main__":
num=200
circles=np.vstack([gencircle(1,0.1,num=num,label=0),gencircle(1,0.1,[-2,2],num=num,label=1)])
test(circles)
#circle in circle
cinc=np.r_[gencircle(1,0.1,num=num,label=0),gencircle(2,0.1,num=num,label=1)]
test(cinc)
#XOR-like pattern
xor0=np.r_[gencircle(0.5,num=num/2,offset=[0,0],label=0),gencircle(0.5,offset=[1,1],label=0)]
xor1=np.r_[gencircle(0.5,num=num/2,offset=[0,1],label=1),gencircle(0.5,offset=[1,0],label=1)]
xor=np.r_[xor0,xor1]
test(xor)
#3D ring
rings=np.r_[genring(1,0.1,num=num,offset=[0,0,0],label=0,normaldir='x'),\
genring(1,0.1,num=num,offset=[0,0,1],label=1,normaldir='y')]
test(rings)
num=400
#sphere in sphere
sins=np.r_[gensphere(1,num=num,label=0),gensphere(2,num=num,label=1)]
test(sins)
#twisted rings
test(np.vstack([gentwistedring(num=num,label=0),gentwistedring(num=num,label=1,phase=PI)]))
num=1000
rossler=genrossler(num=num,dt=0.1)
test(rossler)
lorenz=genlorenz(num=num,dt=0.05)
test(lorenz)
Recommended Posts