import numpy as np import time import copy from AANN_Derivative import AANN_Derivative from AANN_Fit import AANN_Fit def AANN_SF_SBSRB(fault_sample, fault_magnitude, v1, v2, w1, w2, sigma, mindata, maxdata): """ 前向后向序列 :param fault_sample: :param fault_magnitude: :param model: :return: """ # print(type(fault_sample)) a = 0 [m, n] = fault_sample.shape isolated = np.zeros((m, n)) delt_ff=np.zeros((m, n)) detected = 0 # 检测出故障样本数量 rod_n = 0 mdata = (2*fault_sample-np.tile(maxdata, (m, 1))-np.tile(mindata, (m, 1)))/(np.tile(maxdata, (m, 1))-np.tile(mindata, (m, 1))) time1 = int(round(time.time()*1000)) confidence = 2*sigma index = [] nodenum_record = np.zeros(m) spe = np.zeros(m) for sample_id in range(m): # output = model(mdata[sample_id,:]) if sample_id==225: print(1) output = AANN_Fit(mdata[sample_id, :], v1, v2, w1, w2) index.append(np.sum((mdata[sample_id, :]-output)*(mdata[sample_id, :]-output))) spe[sample_id] = index[sample_id] if index[sample_id] > sigma: vnum = 1 detected += 1 node_num = 0 # 前向序列 variables = [i for i in range(n)] selected = np.zeros((n, 1)) selected_v_num = -1 while selected_v_num <= n: selected_variables = [variables[i] for i in (np.where(selected == 1)[0])] unselected_variables = [variables[i] for i in (np.where(selected == 0)[0])] cur_rbindex = np.zeros(len(unselected_variables)) for v_id in range(len(unselected_variables)): cur_fault_variables = copy.deepcopy(selected_variables) cur_fault_variables.append(unselected_variables[v_id]) cur_fault_variables = np.array(cur_fault_variables).astype(np.float64) cur_rbindex[v_id], B, C, SPE = AANN_Derivative(v1.astype(np.float64), v2.astype(np.float64), w1.astype(np.float64), w2.astype(np.float64), mdata[sample_id, :], cur_fault_variables) node_num += node_num min_rbindex, op_vc_id = min(cur_rbindex), np.argmin(cur_rbindex) selected[unselected_variables[op_vc_id]] = 1 if min_rbindex < confidence: isolated_variable = [variables[i] for i in (np.where(selected == 1)[0])]#有问题 isolated[sample_id, isolated_variable] = 1 break else: selected_v_num += 1 # 后向序列 remained_v_num = len(np.where(selected == 1)[0]) while remained_v_num > 1: remained_variables = [variables[i] for i in (np.where(selected == 1)[0])] cur_rbindex = np.zeros(len(remained_variables)) for v_id in range(len(remained_variables)): cur_fault_variables = copy.deepcopy(remained_variables) cur_fault_variables = np.delete(cur_fault_variables, v_id) cur_fault_variables = np.array(cur_fault_variables).astype(np.float64) cur_rbindex[v_id], B, C, SPE = AANN_Derivative(v1, v2, w1, w2, mdata[sample_id, :], cur_fault_variables) node_num += node_num min_rbindex, op_vc_id = min(cur_rbindex), np.argmin(cur_rbindex) if min_rbindex > confidence: isolated_variable = [variables[i] for i in (np.where(selected == 1)[0])] # 有问题 isolated[sample_id, :] = 0 isolated[sample_id, isolated_variable] = 1 isolated_variable = np.array(isolated_variable).astype(np.float64) A, delt_ff[sample_id,:], C, D = AANN_Derivative(v1, v2, w1, w2, mdata[sample_id, :], isolated_variable) # spe[sample_id] = min_rbindex break else: selected[remained_variables[op_vc_id], :] = 0 remained_v_num -= 1 # 后向序列结束 nodenum_record[sample_id] = node_num false_alarm = np.where((((fault_magnitude[sample_id, :]>0).astype('int')-isolated[sample_id, :]) == -1) == True) print('sample_id-->{};false alarm:{}'.format(sample_id, false_alarm)) maxvalue1, maxindex1 = max(isolated[sample_id, :]), np.argmax(isolated[sample_id, :]) maxvalue2, maxindex2 = max(abs(fault_magnitude[sample_id, :])), np.argmax(abs(fault_magnitude[sample_id, :])) if maxindex1 == maxindex2: rod_n +=1 time2 = int(round(time.time()*1000)) tc = time2-time1 real_fault = (abs(fault_magnitude) > 0).astype('int') fdr = np.sum(((real_fault-(isolated == 0).astype('int')) == 1).astype('int'))/np.sum(real_fault) far = np.sum(((real_fault-isolated) == -1).astype('int'))/np.sum((real_fault == 0).astype('int')) #fdr_variable, far_variable # fdr_variable = [] # far_variable = [] # for i in range(real_fault.shape[1]): # if np.sum(real_fault[:,i]) != 0: # fdr_variable.append(np.sum(((real_fault[:,i]-(isolated[:,i] == 0).astype('int')) == 1).astype('int'))/np.sum(real_fault[:,i]))*100 # else: # fdr_variable.append(0) # if np.sum((real_fault[:,i] == 0).astype('int')) != 0: # far_variable.append(np.sum(((real_fault[:,i]-isolated[:,i]) == -1).astype('int'))/np.sum((real_fault[:,i] == 0).astype('int')))*100 # else: # far_variable.append(0) fdr_variable = fdr far_variable = far delt_ff=delt_ff/2*(np.tile(maxdata, (m, 1))-np.tile(mindata, (m, 1))) #对偏差值进行反归一化 Reconstruction_precision=np.sum(np.average(abs(fault_magnitude-delt_ff), axis=0)) #为AANN_test_offline准备,2021-6-16 rsj&lf Data_origin=fault_sample errorData = delt_ff #测量值-重构值 reconData = Data_origin-errorData SPE_list = np.sum(errorData ** 2) R = 0 for index in range(0, reconData.shape[1]): vector1 = Data_origin[:, index] vector2 = np.array(reconData)[:, index] R += np.dot(vector1, vector2.T) / (np.sqrt(np.sum(vector1 ** 2)) * np.sqrt(np.sum(vector2 ** 2))) R /= reconData.shape[1] items = [('reconData', reconData.tolist()) , ('errorData', errorData.tolist()), ('R', R.tolist()), ('SPE', SPE_list), ('FAI', SPE_list), ('paraState', paraState.tolist())] ReconRes=json.dumps(dict(items)) # json.dumps(result) # 为AANN_test_offline准备 dr = detected/np.sum((np.sum(real_fault, axis=1) > 0).astype('int'))*100 rod = rod_n/detected*100 nodes = np.mean(nodenum_record) return delt_ff,fdr,far,fdr_variable,far_variable,Reconstruction_precision,spe,ReconRes