ValueError: масштабируйте ‹0 во время нормализации с помощью функции распределения Гаусса

Я пытаюсь прочитать свой текстовый файл и извлечь 3 основных параметра, поместить их в отдельный список и применить нормализацию к спискам параметров (температура, скорость, ускорение) после назначения функции распределения Гаусса. Для получения хорошего результата я разделяю положительные и отрицательные числа каждого списка параметров и применяю функцию распределения Гаусса и выбираю среднее значение отрицательных чисел в качестве реального минимума и выбираю среднее значение положительных чисел в качестве реального максимума вместо прямого нахождения минимума и максимума. значения в основном списке этих параметров, которые могут повторяться несколько раз из-за того, что они не находятся в желаемом доверительном интервале. Проблема в том, что я столкнулся с ошибкой RunTimeWarning, которой я уже избежал, но у меня все еще есть ошибки, которые я не знаю, как их решить, включая ValueError: scale ‹0, надеюсь, что кто-то имеет хорошее представление о решении для ошибок или лучший способ применить нормализацию с помощью функции распределения Гаусса. Спасибо за внимание:

File "c:\Users\majm\.vscode\extensions\ms-python.python-2018.11.0\pythonFiles\experimental\ptvsd_launcher.py", line 45, in <module>
main(ptvsdArgs)
File "c:\Users\majm\.vscode\extensions\ms-python.python-2018.11.0\pythonFiles\experimental\ptvsd\ptvsd\__main__.py", line 265, in main
wait=args.wait)
File "c:\Users\majm\.vscode\extensions\ms-python.python-2018.11.0\pythonFiles\experimental\ptvsd\ptvsd\__main__.py", line 258, in handle_args
debug_main(addr, name, kind, *extra, **kwargs)
File "c:\Users\majm\.vscode\extensions\ms-python.python-2018.11.0\pythonFiles\experimental\ptvsd\ptvsd\_local.py", line 45, in debug_main
run_file(address, name, *extra, **kwargs)
File "c:\Users\majm\.vscode\extensions\ms-python.python-2018.11.0\pythonFiles\experimental\ptvsd\ptvsd\_local.py", line 79, in run_file
run(argv, addr, **kwargs)
File "c:\Users\majm\.vscode\extensions\ms-python.python-2018.11.0\pythonFiles\experimental\ptvsd\ptvsd\_local.py", line 140, in _run
_pydevd.main()
File "c:\Users\majm\.vscode\extensions\ms-python.python-2018.11.0\pythonFiles\experimental\ptvsd\ptvsd\_vendored\pydevd\pydevd.py", line 1925, in main
debugger.connect(host, port)
File "c:\Users\majm\.vscode\extensions\ms-python.python-2018.11.0\pythonFiles\experimental\ptvsd\ptvsd\_vendored\pydevd\pydevd.py", line 1283, in run
return self._exec(is_module, entry_point_fn, module_name, file, globals, locals)
File "c:\Users\majm\.vscode\extensions\ms-python.python-2018.11.0\pythonFiles\experimental\ptvsd\ptvsd\_vendored\pydevd\pydevd.py", line 1290, in _exec
pydev_imports.execfile(file, globals, locals)  # execute the script
File "c:\Users\majm\.vscode\extensions\ms-python.python-2018.11.0\pythonFiles\experimental\ptvsd\ptvsd\_vendored\pydevd\_pydev_imps\_pydev_execfile.py", line 25, in execfile
exec(compile(contents+"\n", file, 'exec'), glob, loc)
File "p:\Desktop\correctt\news.py", line 142, in <module>
plotgaussianfunction(t_p_mean, t_sigma_Positive)
File "p:\Desktop\correctt\news.py", line 58, in plotgaussianfunction
s = np.random.normal(mu, sigma,1000)
File "mtrand.pyx", line 1656, in mtrand.RandomState.normal
ValueError: scale < 0

Итак, мой код:

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

df = pd.read_csv('D:/me.txt', header=None)
id_set = df[df.index % 4 == 0].astype('int').values
speed = df[df.index % 4 == 1].values
acceleration = df[df.index % 4 == 2].values
temperature = df[df.index % 4 == 3].values

m_data={'p_Speed': s_p_results[:,0],'n_Speed': s_n_results[:,0], 'p_Acceleration': a_p_results[:,0],'n_Acceleration': a_n_results[:,0], 'p_Temperature': t_p_results[:,0],'n_Temperature': t_n_results[:,0]}
m_main_data = pd.DataFrame(data, columns=['Speed','Acceleration','Temperature'], index = id_set[:,0])

data = {'Speed': speed[:,0], 'Acceleration': acceleration[:,0], 'Temperature': temperature[:,0]}
main_data = pd.DataFrame(data, columns=['Speed','Acceleration','Temperature'], index = id_set[:,0])
main_data = main_data.replace([np.inf, -np.inf], np.nan)

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()


results = []
for value in lists:
    if(ci[0]< value <ci[1]):
        results.append(value)
    else:
        #print("NOT WANTED: ",value)
        pass

return results


t_negative, t_positive = createpositiveandnegativelist(temperature)
a_negative, a_positive = createpositiveandnegativelist(acceleration)
s_negative, s_positive = createpositiveandnegativelist(speed)

#calculating the mean value
t_p_mean = calculatemean(t_positive)
a_p_mean = calculatemean(a_positive)
s_p_mean = calculatemean(s_positive)
t_n_mean = calculatemean(t_negative)
a_n_mean = calculatemean(a_negative)
s_n_mean = calculatemean(s_negative)

#calculating the sigma value
t_sigma_Negative = np.std(t_negative)
t_sigma_Positive = np.std(t_positive)
a_sigma_Negative = np.std(t_negative)
a_sigma_Positive = np.std(t_positive)
s_sigma_Negative = np.std(t_negative)
s_sigma_Positive = np.std(t_positive)

#plot the gaussian function with histograms
plotgaussianfunction(t_p_mean, t_sigma_Positive)
plotgaussianfunction(t_n_mean, t_sigma_Negative)
plotgaussianfunction(a_p_mean, a_sigma_Positive)
plotgaussianfunction(a_n_mean, a_sigma_Negative)
plotgaussianfunction(s_p_mean, s_sigma_Positive)
plotgaussianfunction(s_n_mean, s_sigma_Negative)

#normalization
t_p_s = np.random.normal(t_p_mean, t_sigma_Positive,1000)
t_n_s = np.random.normal(t_n_mean, t_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)
s_p_s = np.random.normal(s_p_mean, s_sigma_Positive,1000)
s_n_s = np.random.normal(s_n_mean, s_sigma_Negative,1000)

#histograms minus the outliers
t_p_results = plotboundedCI(t_p_s, t_p_mean, t_sigma_Positive, t_positive)
t_n_results = plotboundedCI(t_n_s, t_n_mean, t_sigma_Negative, t_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)
s_p_results = plotboundedCI(s_p_s, s_p_mean, s_sigma_Positive, s_positive)
s_n_results = plotboundedCI(s_n_s, s_n_mean, s_sigma_Negative, s_negative)

Примечание. В моем списке значений есть отсутствующие данные (nan или inf), которые уже заменены нулем! но учитывая, что когда у меня нет пропущенных значений в моем списке параметров, код работает!


person Mario    schedule 17.12.2018    source источник
comment
Вам не нужно искать дисперсию, если вас интересует только среднее значение распределения.   -  person BlackBear    schedule 17.12.2018
comment
На самом деле меня интересовал доверительный интервал [Среднее-сигма, Среднее + Сигма] --- ›68% или [Среднее-2xSigma, Среднее + 2xSigma] ---› 95% данных путем вычисления стандартного отклонения, чтобы я пропустил эти отвлекающие данные, которые находятся за пределами этих 68% данных, и уменьшают их влияние при нахождении Max и Min для формулы нормализации! поэтому, найдя доверительный интервал, я проверю все данные в списке, если они находятся внутри этого интервала, я сохраню его, если нет, я пренебрежу ими   -  person Mario    schedule 17.12.2018


Ответы (1)


из документации numpy.random.normal:

Параметры:

loc: float или array_like чисел с плавающей запятой

Среднее («центр») распределения.

scale: float или array_like of float Стандартное отклонение (спред или «ширина») распределения.

размер: целое число или кортеж целых чисел, необязательная форма вывода. Если заданная форма, например, (m, n, k), то отрисовывается m * n * k выборок. Если размер равен None (по умолчанию), возвращается одно значение, если loc и scale являются скалярами. В противном случае отрисовываются образцы np.broadcast (loc, scale) .size.

масштаб - это стандартное отклонение распределения, поэтому оно не может быть отрицательным. Следовательно, вы получаете ошибку: ValueError: scale < 0

вы можете проверить знак этого параметра. попробуйте:

s = np.random.normal(mu, np.abs(sigma),1000)
person Frayal    schedule 17.12.2018
comment
Спасибо за подсказку, но я получил эту ошибку C:\Users\xxxxxxx\Anaconda3\lib\site-packages\matplotlib\axes\_base.py:3124: UserWarning: Attempting to set identical left==right results in singular transformations; automatically expanding. left=0, right=0 'left=%s, right=%s') % (left, right)). Есть идеи для решения? - person Mario; 17.12.2018
comment
это предупреждение, а не ошибка. Это вооружает результат? - person Frayal; 18.12.2018
comment
Нет, насколько я заметил, я пока могу распечатать свой сюжет! Интересно, избавиться от этого или нет? - person Mario; 18.12.2018
comment
ну, было бы лучше, но в этом нет необходимости ... если у вас есть время и желание сделать это, настоятельно рекомендуется выяснить, почему он поднимает эту проблему и как ее решить. Тут ничем помочь не могу, я не знаю этой ошибки. - person Frayal; 18.12.2018
comment
человек, я столкнулся с этой ошибкой: 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, поскольку у меня была аналогичная ошибка, вы помните! Есть идеи с вашей стороны? - person Mario; 27.01.2019
comment
человек сделает мне одолжение и взглянет на это вопрос У вас есть идея? - person Mario; 03.02.2019