Нормализация с использованием 2-кратной гауссовой функции для отрицательных и положительных чисел данных в кадре данных - PullRequest
0 голосов
/ 23 января 2019

Я пытаюсь прочитать набор данных из текстового файла и извлечь 3 основных параметра, поместить их в отдельный список и применить нормализацию к спискам параметров, которые (A, B, C) после назначения функции распределения Гаусса.Для получения хорошего результата я разделяю положительные и отрицательные числа из списка каждого параметра и применяю к ним функцию гауссовского распределения отдельно и выбираю:

среднее значение отрицательные числа как действительное Минимум

среднее значение положительных чисел как действительное Максимум

вместо непосредственного поиска значений Min Max в основном списке этих параметров, которые могут повторяться несколько раз из-за того, что они не находятся в желаемом доверительном интервале .Все может быть сделано за 4 шага, как видно на рисунке ниже, включает в себя 2 графика в форме матрицы 24x20 относительно одного из столбцов в кадре данных, который так неясен из-за огромной регрессии и рассеяния данных и нежелательного шума, которые делают его не интерпретируемым:picture

Учитывая, что нет определенного ответа для нормализации между определенными интервалами, как [a, b], я определяю функцию на основе ее формулы:

def normalize(value, min_value, max_value, min_norm, max_norm):
    new_value = ((max_norm - min_norm)*((value - min_value)/(max_value - min_value))) + min_norm
return new_value

Итак, мои сценарии приведены ниже:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import scipy
import warnings
warnings.filterwarnings("ignore",category =RuntimeWarning)

dft = pd.read_csv('D:/me.txt', header=None)
id_set = dft[dft.index % 4 == 0].astype('int').values
A = dft[dft.index % 4 == 1].values
B = dft[dtf.index % 4 == 2].values
C = dft[dft.index % 4 == 3].values
data = {'A': A[:,0], 'B': B[:,0], 'C': C[:,0]} # arrays
#main_data contains all the data
df = pd.DataFrame(data, columns=['A','B','C'], index = id_set[:,0]) 
df  = df.replace([np.inf, -np.inf], np.nan).astype(np.float64) 
df  = df.fillna(0.012345)


def normalize(value, min_value, max_value, min_norm, max_norm):
new_value = ((max_norm - min_norm)*((value - min_value)/(max_value - min_value))) + min_norm
return new_value

def createpositiveandnegativelist(listtocreate):
l_negative = []
l_positive = []
for value in listtocreate:
    if (value < 0):
        l_negative.append(value)
    elif (value > 0):
        l_positive.append(value)
#print(t_negative)
#print(t_positive)
return l_negative,l_positive

def calculatemean(listtocalculate):
return sum(listtocalculate)/len(listtocalculate)

def plotgaussianfunction(mu,sigma):
s = np.random.normal(mu, sigma,1000)
abs(mu - np.mean(s))<0.01
abs(sigma - np.std(s,ddof=1))<0.01
#count, bins, ignored = plt.hist(s,30,density=True)
#plt.plot(bins, 1/(sigma * np.sqrt(2 * np.pi)) * np.exp(-(bins-mu)**2/(2*sigma**2)),linewidth=2, color= 'r')
#plt.show()
return


def plotboundedCI(s, mu, sigma, lists):
plt.figure()

count, bins, ignored = plt.hist(s,30,density=True)
plt.plot(bins, 1/(sigma * np.sqrt(2 * np.pi)) * np.exp(-(bins-mu)**2/(2*sigma**2)),linewidth=2, color= 'r')
#confidential interval calculation
ci = scipy.stats.norm.interval(0.68, loc = mu, scale = sigma)
#confidence interval for left line
one_x12, one_y12 = [ci[0],ci[0]], [0,3]
#confidence interval for right line
two_x12, two_y12 = [ci[1],ci[1]], [0,3]

plt.title("Gaussian 68% Confidence Interval", fontsize=12, color='black', loc='left', style='italic')
plt.plot(one_x12, one_y12, two_x12, two_y12, marker = 'o')
plt.show()

#get sure about avoiding the outliers of CI 
results = []
for value in lists:
    if(ci[0]< value <ci[1]):
        results.append(value)
    else:
        #print("NOT WANTED: ",value)
        pass

return results



c_negative, c_positive = createpositiveandnegativelist(C)
b_negative, b_positive = createpositiveandnegativelist(B)
a_negative, a_positive = createpositiveandnegativelist(A)

#get max and min values
a_min = main_data['A'].min()
a_max = main_data['A'].max()
b_min = main_data['B'].min()
b_max = main_data['B'].max()
c_min = main_data['C'].min()
c_max = main_data['C'].max()

print ("\ntmp Negative Min",c_min)
print ("\n tmp Positive Max",c_max)

#calculating the mean value
c_p_mean = calculatemean(c_positive)
b_p_mean = calculatemean(b_positive)
a_p_mean = calculatemean(a_positive)
c_n_mean = calculatemean(c_negative)
b_n_mean = calculatemean(b_negative)
a_n_mean = calculatemean(a_negative)
print ("\ntmp Negative Mean",c_n_mean)
print ("\n tmp Positive Mean",c_p_mean)

#calculating the sigma value
c_sigma_Negative = np.std(c_negative)
c_sigma_Positive = np.std(c_positive)
b_sigma_Negative = np.std(c_negative)
b_sigma_Positive = np.std(c_positive)
a_sigma_Negative = np.std(c_negative)
a_sigma_Positive = np.std(c_positive)

#plot the gaussian function with histograms
plotgaussianfunction(c_p_mean, c_sigma_Positive)
plotgaussianfunction(c_n_mean, c_sigma_Negative)
plotgaussianfunction(b_p_mean, b_sigma_Positive)
plotgaussianfunction(b_n_mean, b_sigma_Negative)
plotgaussianfunction(a_p_mean, a_sigma_Positive)
plotgaussianfunction(a_n_mean, a_sigma_Negative)

#normalization
c_p_s = np.random.normal(c_p_mean, c_sigma_Positive, 1000)
c_n_s = np.random.normal(c_n_mean, c_sigma_Negative, 1000)
b_p_s = np.random.normal(b_p_mean, b_sigma_Positive, 1000)
b_n_s = np.random.normal(b_n_mean, b_sigma_Negative, 1000)
a_p_s = np.random.normal(a_p_mean, a_sigma_Positive, 1000)
a_n_s = np.random.normal(a_n_mean, a_sigma_Negative, 1000)

#histograms minus the outliers
c_p_results = plotboundedCI(c_p_s, c_p_mean, c_sigma_Positive, c_positive)
c_n_results = plotboundedCI(c_n_s, c_n_mean, c_sigma_Negative, c_negative)
b_p_results = plotboundedCI(b_p_s, b_p_mean, b_sigma_Positive, b_positive)
b_n_results = plotboundedCI(b_n_s, b_n_mean, b_sigma_Negative, b_negative)
a_p_results = plotboundedCI(a_p_s, a_p_mean, a_sigma_Positive, a_positive)
a_n_results = plotboundedCI(a_n_s, a_n_mean, a_sigma_Negative, a_negative)



#next iteration create all plots, change the number of cycles
for i in df:
    if 'C' in i:
        min_nor = -40
        max_nor = 150
        #Applying normalization for C between [-40,+150]
        new_value3 = normalize(df['C'].iloc[j:j+480], c_n_mean, c_p_mean, -40, 150)
        n_cbar_kws = {"ticks":[-40,150,-20,0,25,50,75,100,125]}
        df3 = print_df(mkdf(new_value3))
        df3.to_csv(f'{i}/norm{i}{count}.csv', header=None, index=None)  
    else:
        #Applying normalizayion for A,B between    [-1,+1]
        new_value1 = normalize(df['A'].iloc[j:j+480], a_n_mean, a_p_mean, -1, 1)
        new_value2 = normalize(df['B'].iloc[j:j+480], b_n_mean, b_p_mean, -1, 1)
        n_cbar_kws = {"ticks":[-1.0,-0.75,-0.50,-0.25,0.00,0.25,0.50,0.75,1.0]}
        df1 = print_df(mkdf(new_value1))
        df2 = print_df(mkdf(new_value2))
        df1.to_csv(f'{i}/norm{i}{count}.csv', header=None, index=None) 
        df2.to_csv(f'{i}/norm{i}{count}.csv', header=None, index=None)     

'''
for i in df:

if i=='C':
    #Applying normalizayion for C between [-40,+150]
    data['C']  = normalize(df[i].values, c_n_mean, c_p_mean, -40, 150)
elif i=='A':
    #Applying normalization for A , B between [-1,+1]
    data['A'] = normalize(df[i].values, a_n_mean, a_p_mean, -1, 1)
else:
    data['B'] = normalize(df[i].values, b_n_mean, b_p_mean, -1, 1)
'''


norm_data = pd.DataFrame(data, index = id_set[:,0])
print(norm_data)
norm_data.to_csv('norm.csv')

Проблемы:

ّ Проблема I: Я столкнулся с ошибкой RunTimeWarning, которую я уже избежал, но все же у меня есть ошибки ниже, которых я не делаюПонятия не имею, как я могу их решить, включая ValueError: scale <0 </strong>, вероятно, из-за разделения отрицательных и положительных чисел.

ّ Проблема II: После нормализации, котораяэто может произойти более чем за 10 циклов (каждый цикл имеет 480 значений), я понял, рассматривая применение гауссовского для обоих чисел - / +, а затем использовать минимальную, максимальную нормуalization между [a, b] все еще существуют числа значений вне диапазона, в этом случае вы можете видеть на рисунке ниже или в столбце «C» из [-40, + 150], что так странно и превосходит мои ожидания!out-range Надеюсь, что у кого-то есть хорошее представление о решении для ошибок или о лучшем способе применения нормализации с помощью функции распределения Гаусса. Спасибо за ваше внимание.

Примечание1: У меня есть некоторые пропущенные данные (nan или inf) в моем списке значений, которые уже заменены на ноль (точно = 0.012345)!но учитывая, что в моем списке параметров нет пропущенных значений, код работает!

Примечание 2: Я столкнулся с этой ошибкой: ValueError: max must be larger than min in range parameter. для count, bins, ignored = plt.hist(s,30,density=True) иplotgaussianfunction(t_p_mean, t_sigma_Positive), который, я думаю, касается этого условия на деле: abs(sigma - np.std(s,ddof=1)) < 0.01, поскольку у меня была похожая ошибка ValueError: scale < 0 для s = np.random.normal(mu, np.abs(sigma) ,1000) Я уже спрашивал здесь

Я предоставил образецнабор данных для 3 циклов: набор данных

Я также предоставил еще один набор данных для 11 циклов: набор данных

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...