[PYTHON] Génération artificielle de données avec numpy

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)

circles.png cinc.png xor_like.png rings.png sphere_in_sphere.png

twistedrings.png rossler.png

lorenz.png

Recommended Posts

Génération artificielle de données avec numpy
Génération d'ensembles de données
Lire le fichier de données de caractères avec numpy
Convertissez les données avec la forme (nombre de données, 1) en (nombre de données,) avec numpy.
J'ai essayé DBM avec Pylearn 2 en utilisant des données artificielles
Analyse de données avec python 2
Moyenne mobile avec numpy
Lecture de données avec TensorFlow
Visualisation des données avec les pandas
Manipulation des données avec les Pandas!
Mélangez les données avec les pandas
Augmentation des données avec openCV
Premiers pas avec Numpy
[Python] Tri des données Numpy
Apprenez avec Chemo Informatics NumPy
Concaténation de matrices avec Numpy
Code de bourdonnement avec numpy
Normariser les données avec Scipy
Effectuer une analyse de régression avec NumPy
Analyse de données avec Python
Étendre NumPy avec Rust
CHARGER DES DONNÉES avec PyMysql
[Python] Créer un tableau structuré (stocker des données hétérogènes avec NumPy)
Apprentissage des données relationnelles avec numpy et NetworkX (clustering spectral)
Génération automatique de quiz avec COTOHA
Régression du noyau avec Numpy uniquement
Exemple de données créées avec python
J'ai écrit GP avec numpy
Incorporer des données audio avec Jupyter
Graphique des données Excel avec matplotlib (1)
Implémentation CNN avec juste numpy
Prédire les cuisses de bougie avec l'intelligence artificielle
Extraire les données Twitter avec CSV
[Python] Méthode de calcul avec numpy
Essayez l'opération matricielle avec NumPy
Obtenez des données Youtube avec python
Animation de l'équation de diffusion avec NumPy
Simulation de remboursement de dette avec numpy
Implémentation de SMO avec Python + NumPy
Génération de phrases avec GRU (keras)
Coller les chaînes avec Numpy
Apprenez de nouvelles données avec PaintsChainer
Binariser les données photo avec OpenCV
Graphique des données Excel avec matplotlib (2)
Utilisez Django pour enregistrer les données de tweet
Gérez les tableaux numpy avec f2py
Génération de légende d'image avec Chainer
Utilisez OpenBLAS avec numpy, scipy
Conseils de traitement des données avec Pandas
Ensemble de données artificielles (fonction sinus)
Implémentation de la régression logistique avec NumPy
Lire des données json avec python
Enregistrer et charger des données avec joblib, pickle
Effectuez un ajustement carré minimum avec numpy.
Génération de requêtes plus rapide avec SQLAlchemy ORM
Comment gérer les données déséquilibrées