Я пытаюсь прочитать набор данных из текстового файла и извлечь 3 основных параметра, поместить их в отдельный список и применить нормализацию к спискам параметров, которые (A, B, C) после назначения функции распределения Гаусса.Для получения хорошего результата я разделяю положительные и отрицательные числа из списка каждого параметра и применяю к ним функцию гауссовского распределения отдельно и выбираю:
среднее значение отрицательные числа как действительное Минимум
среднее значение положительных чисел как действительное Максимум
вместо непосредственного поиска значений Min Max в основном списке этих параметров, которые могут повторяться несколько раз из-за того, что они не находятся в желаемом доверительном интервале .Все может быть сделано за 4 шага, как видно на рисунке ниже, включает в себя 2 графика в форме матрицы 24x20 относительно одного из столбцов в кадре данных, который так неясен из-за огромной регрессии и рассеяния данных и нежелательного шума, которые делают его не интерпретируемым:
Учитывая, что нет определенного ответа для нормализации между определенными интервалами, как [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], что так странно и превосходит мои ожидания! Надеюсь, что у кого-то есть хорошее представление о решении для ошибок или о лучшем способе применения нормализации с помощью функции распределения Гаусса. Спасибо за ваше внимание.
Примечание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 циклов: набор данных