Программирование на Python - numpy polyfit, говорящий NAN

У меня возникли проблемы с довольно простым кодом, который я написал. У меня есть 4 набора данных, и я хочу сгенерировать полиномиальные линии наилучшего соответствия, используя numpy polyfit. 3 из списков дают числа при использовании полифита, но третий набор данных дает NAN при использовании полифита. Ниже приведен код и распечатка. Любые идеи?

Код:

все 'ind_#' являются списками данных. Ниже преобразует их в массивы numpy, которые затем могут генерировать полиномиальную линию наилучшего соответствия.

ind_1=np.array(ind_1, np.float)

dep_1=np.array(dep_1, np.float)

x_1=np.arange(min(ind_1)-1, max(ind_1)+1, .01)

ind_2=np.array(ind_2, np.float)

dep_2=np.array(dep_2, np.float)

x_2=np.arange(min(ind_2)-1, max(ind_2)+1, .01)

ind_3=np.array(ind_3, np.float)

dep_3=np.array(dep_3, np.float)

x_3=np.arange(min(ind_3)-1, max(ind_3)+1, .01)

ind_4=np.array(ind_4, np.float)

dep_4=np.array(dep_4, np.float)

x_4=np.arange(min(ind_4)-1, max(ind_4)+1, .01)

Ниже выводятся сгенерированные выше массивы, а также содержимое списка полифитов, которые обычно являются коэффициентами полиномиального уравнения, но для третьего случая ниже все содержимое полифитов выводится как NAN.

print(ind_1)

print(dep_1)

print(np.polyfit(ind_1,dep_1,2))

print(ind_2)

print(dep_2)

print(np.polyfit(ind_2,dep_2,2))

print(ind_3)

print(dep_3)

print(np.polyfit(ind_3,dep_3,2))

print(ind_4)

print(dep_4)

print(np.polyfit(ind_4,dep_4,2))

Распечатка:

[ 1.405  1.871  2.713 ...,  5.367  5.404  2.155]

[ 0.274  0.07   0.043 ...,  0.607  0.614  0.152]

[ 0.01391925 -0.00950728  0.14803846]

[ 0.9760001  2.067      8.8       ...,  1.301      1.625      2.007    ]

[ 0.219      0.05       0.9810001 ...,  0.163      0.161      0.163    ]

[ 0.00886807 -0.00868727  0.17793324]

[ 1.143      0.9120001  2.162     ...,  2.915      2.865      2.739    ]

[ 0.283  0.3    0.27  ...,  0.227  0.213  0.161]

[ nan  nan  nan]

[ 0.167  0.315  1.938 ...,  2.641  1.799  2.719]

[ 0.6810001  0.7140001  0.309     ...,  0.283      0.313      0.251    ]

[ 0.00382331  0.00222269  0.16940372]

Почему константы полифита из третьего случая указаны как NAN? Все наборы данных имеют одинаковый тип данных, и весь код согласован. Пожалуйста помоги.


person user1871337    schedule 03.12.2012    source источник
comment
Не могли бы вы показать нам все массивы, для которых он терпит неудачу? Пример также недостаточно сужает его, вы знаете, что ind_1 и dep_1 работают, поэтому не могли бы вы использовать polyfit(ind_1, dep_3, 2) и polyfit(ind_3, dep_1,2)? Не могли бы вы также нанести данные, чтобы мы могли видеть, как это выглядит?   -  person will    schedule 03.12.2012
comment
У вас должно быть неверное значение данных в ind_3 или dep_3. Не могли бы вы разместить данные где-нибудь, чтобы люди могли попробовать? Я использовал значения ind_3 и dep_3, которые вы напечатали, и проблем не возникло. Кроме того, в интересах ясности, возможно, вы можете отбросить все остальные примеры и сосредоточиться только на том, который не работает.   -  person tiago    schedule 03.12.2012
comment
Я попробовал то, что будет сказано, и обнаружил, что полифит NAN является результатом массива dep_3. Набор данных содержит несколько тысяч записей. Как я могу получить его для вас? А пока не могли бы вы порекомендовать что-нибудь, что я мог бы попробовать, например, поиск проблем с типом или, может быть, что-то, о чем я не подумал, чтобы найти в массиве недопустимую запись? Спасибо   -  person user1871337    schedule 03.12.2012
comment
Я загрузил оба набора данных (так что вы можете использовать приведенный выше код, если удалите код набора 1,2,4). набор данных ind_3 находится здесь: filedropper.com/baddatasetind3 набор данных dep_3 находится здесь: filedropper.com/baddatasetdep3   -  person user1871337    schedule 03.12.2012


Ответы (1)


Только что посмотрел ваши данные. Это происходит потому, что у вас есть NaN в dep_3 (элемент 713). Вы можете убедиться, что используете только конечные значения в подгонке следующим образом:

idx = np.isfinite(ind_3) & np.isfinite(dep_3)
print(np.polyfit(ind_3[idx], dep_3[idx], 2))

Что касается поиска неверных значений в больших наборах данных, numpy делает это очень просто. Вы можете найти такие индексы:

print(np.where(~np.isfinite(dep_3)))
person tiago    schedule 03.12.2012
comment
Спасибо тиаго. Я использовал ваши первые две строки, и теперь он работает правильно. Я вручную исправлю файл nan. - person user1871337; 04.12.2012
comment
@ user1871337, не беспокойтесь. Вы можете принять ответ, если он работает для вас :-) - person tiago; 05.12.2012