aiops/AnomalyDetection/datas/GenerateSyncData.py (181 lines of code) (raw):

import numpy as np import math import random def generateSin(start,end,num,amplitude,frequency,phase,biase): time = np.linspace(start, end, num) sin_wave = amplitude * np.sin(2 * np.pi * frequency * time + phase)+biase return sin_wave def generateSin2(start,end,num,amplitude,frequencys,phase,biase): num*=10 sin_waves=[] step = 100 time = np.linspace(start, end, num) for i in range(0,num,step): frequency=np.random.uniform(frequencys[1],frequencys[2]) ntime=np.linspace(time[i],time[i+step-1],math.ceil(step*frequencys[0]/frequency)) sin_wave = amplitude * np.sin(2 * np.pi * frequencys[0] * ntime + phase)+biase sin_waves.append(sin_wave) sin_waves=np.concatenate(sin_waves,axis=0) return sin_waves def syntheticData2(clusterNum,length,fealen,noise=False): datas = [] componsitionNum=2 for i in range(clusterNum): waves = [] for j in range(fealen): frequency = random.randint(6, 10) # 1/24+random.gauss(0,0.005)#random.randint(6,10) amplitude = random.random() * 10 bias = random.randint(1, 10) phase = random.gauss(0, 1) * 2 * math.pi wave = generateSin(0, length, length, amplitude, random.uniform(1/100,1/200), phase, bias) + amplitude for k in range(componsitionNum): wave+=generateSin(0,length,length,amplitude*0.2,1/24,phase*random.random(),bias) # frequency=1/40+random.gauss(0,0.005)#random.randint(6,10) # wave2=generateSin(0,length,length,amplitude,frequency,phase,bias)+amplitude # wave=wave1+wave2 if noise: wave += np.random.normal(0, amplitude * 0.03, length) waves.append(wave) datas.append(waves) datas = np.array(datas) # batch,fealen,winlen dataSum = datas.sum(axis=-2) # batch,winlen datas = datas.transpose((1, 0, 2)) # fealen,batch,winlen datas /= dataSum datas = datas.transpose((1, 2, 0)) labels = np.zeros((datas.shape[0], datas.shape[1])) return datas, labels def syntheticData(clusterNum,length,fealen,noise=False,std=0.06): datas=[] for i in range(clusterNum): waves=[] for j in range(fealen): frequency=random.randint(6,10)#1/24+random.gauss(0,0.005)#random.randint(6,10) amplitude=random.random()*10 bias=random.randint(1,10) phase=random.gauss(0,1)*2*math.pi wave=generateSin(0,length,length,amplitude,frequency,phase,bias)+amplitude #frequency=1/40+random.gauss(0,0.005)#random.randint(6,10) #wave2=generateSin(0,length,length,amplitude,frequency,phase,bias)+amplitude #wave=wave1+wave2 if noise: wave+=np.random.normal(0,amplitude*std,length) waves.append(wave) datas.append(waves) datas=np.array(datas)#batch,fealen,winlen dataSum = datas.sum(axis=-2)#batch,winlen datas = datas.transpose((1, 0, 2)) # fealen,batch,winlen datas/=dataSum datas=datas.transpose((1,2,0)) labels=np.zeros((datas.shape[0],datas.shape[1])) return datas,labels def syntheticData3(clusterNum,length,fealen,noise=False,frequencyRatio=0.3): datas=[] for i in range(clusterNum): waves=[] for j in range(fealen): frequency=random.uniform(0.04,0.1)#1/24+random.gauss(0,0.005)#random.randint(6,10) frequencys=[frequency,frequency,frequency*(1+frequencyRatio)] amplitude=random.random()*10 bias=random.randint(1,10) phase=random.gauss(0,1)*2*math.pi wave=generateSin2(0,length,length,amplitude,frequencys,phase,bias)+amplitude wave=wave[:length] frequency = random.uniform(0.08, 0.1) # 1/24+random.gauss(0,0.005)#random.randint(6,10) frequencys = [frequency, frequency, frequency * (1 + frequencyRatio)] amplitude = random.random() * 10 wave+=(generateSin2(0,length,length,amplitude,frequencys,phase,bias)+amplitude)[:length] frequency = random.uniform(0.01, 0.04) # 1/24+random.gauss(0,0.005)#random.randint(6,10) frequencys = [frequency, frequency, frequency * (1 + frequencyRatio)] amplitude = random.random() * 10 wave+=(generateSin2(0,length,length,amplitude,frequencys,phase,bias)+amplitude)[:length] #wave=generateSin(0,length,length,amplitude,frequency,phase,bias)+amplitude #frequency=1/40+random.gauss(0,0.005)#random.randint(6,10) #wave2=generateSin(0,length,length,amplitude,frequency,phase,bias)+amplitude #wave=wave1+wave2 if noise: wave+=np.random.normal(0,amplitude*0.06,length) waves.append(wave) datas.append(waves) datas=np.array(datas)#batch,fealen,winlen dataSum = datas.sum(axis=-2)#batch,winlen datas = datas.transpose((1, 0, 2)) # fealen,batch,winlen datas/=dataSum datas=datas.transpose((1,2,0)) labels=np.zeros((datas.shape[0],datas.shape[1])) return datas,labels def insertNormality(datas,quickRatio,quickNumRatio,quickTimeRange,labels,exeTime,edges): exeTime=exeTime[1:] edges=edges[:-1] #exeTime = np.array([5, 15, 25, 35, 55, 90, 130, 170, 210, 255, 305, 355, 405]) #edges = [0,10, 20, 30, 40, 70, 110, 150, 190, 230, 280, 330, 380] for i, data in enumerate(datas): length, interval = data.shape changeNum = math.ceil(length * quickRatio) positions = [random.randint(0, length - 1) for i in range(changeNum)] labels[i, positions] = -1. for position in positions: quickNum = np.random.random(interval - 1) quickNum[0] = 0 quickNum /= quickNum.sum() quickNum *= quickNumRatio quickTime = np.random.randint(quickTimeRange[0], quickTimeRange[1], size=interval - 1) presTime = np.maximum(exeTime - quickTime,0) slowDur = random.randint(2, 5) for k in range(min(slowDur, length - position)): labels[i, position + k] = -1. for j in range(interval - 1): transfer = min(datas[i, position + k, j], quickNum[j]) datas[i, position + k, j] = max(datas[i, position + k, j] - quickNum[j], 0) target = len(edges)-1 for edge in reversed(edges): if presTime[j] >= edge: break target -= 1 datas[i, position + k, target] += transfer return datas,labels def insertAnomaly(datas,anomalyRatio,slowNumRatio,slowTimeRange,labels,exeTime,edges): #labels=np.zeros((datas.shape[0],datas.shape[1])) exeTime=exeTime[:-1] edges=edges[1:] #exeTime=np.array([5,15,25,35,55,90,130,170,210,255,305,355,405]) #edges=[10,20,30,40,70,110,150,190,230,280,330,380,430] for i,data in enumerate(datas): length,interval=data.shape anomalyNum=math.ceil(length*anomalyRatio) positions=[random.randint(0,length-1) for i in range(anomalyNum)] for position in positions: slowNum=np.random.random(interval-1) slowNum[-1]=0 slowNum/=slowNum.sum() slowNum*=slowNumRatio slowTime=np.random.randint(slowTimeRange[0],slowTimeRange[1],size=interval-1) presTime=exeTime+slowTime slowDur = random.randint(2, 5) for k in range(min(slowDur,length-position)): flag = True for j in range(interval - 1): transfer=min(datas[i,position+k,j],slowNum[j]) datas[i,position + k, j] = max(datas[i,position + k, j] - slowNum[j], 0) target = 0 if transfer>0: flag=False for edge in edges: if presTime[j] < edge: break target += 1 datas[i,position + k, target] += transfer if not flag: labels[i,position+k] = 1. return datas,labels def insertAnomaly2(datas,anomalyRatio,slowNumRatio,slowTimeRange,exeTime,edges): labels=np.zeros(datas.shape[0]) exeTime = exeTime[:-1] edges=edges[1:] #exeTime=np.array([5,15,25,35,55,90,130,170,210,255,305,355,405]) #edges=[10,20,30,40,70,110,150,190,230,280,330,380,430] length,interval=datas.shape anomalyNum=math.ceil(length*anomalyRatio) positions=[random.randint(0,length-1) for i in range(anomalyNum)] labels[positions]=1. for position in positions: slowNum=np.random.random(interval-1) slowNum[-1]=0 slowNum/=slowNum.sum() slowNum*=slowNumRatio slowTime=np.random.randint(slowTimeRange[0],slowTimeRange[1],size=interval-1) presTime=exeTime+slowTime slowDur=random.randint(2,8) for k in range(min(slowDur,length-position)): labels[position+k]=1. for j in range(interval-1): datas[position+k,j]=max(datas[position+k,j]-slowNum[j],0) target=0 for edge in edges: if presTime[j]<edge: break target+=1 datas[position+k,target]+=slowNum[j] return datas,labels