Варианты взвешенной интерполяции LOWESS в Python 3.7

Вопрос или проблема

У меня есть набор данных x, y и ошибки по y, для которых я хочу выполнить взвешенную интерполяцию LOWESS. К сожалению, я застрял на Python 3.7.

Я пробовал пакет lowess из statsmodels.api.nonparametric, но он не поддерживает взвешивание.

Я пробовал пакет loess из skmisc.loess, который поддерживает взвешивание, но, судя по всему, он просто отсутствует в skmisc-0.1.4. То есть, skmisc.loess похоже существует, но функции loess внутри него нет? Я получаю ошибку отсутствия DLL.

Есть ли еще какой-то вариант, который я пропустил, или я застрял, пытаясь создать свой собственный алгоритм регрессии LOWESS с весами вручную? Или, может быть, я просто что-то упускаю, когда дело доходит до skmisc?

Traceback (most recent call last):
  File "c:/Users/atomg/OneDrive - Thermochron Systems LLC/heman_code/Pro/misc_tools/asdf.py", line 2, in <module>
    from skmisc.loess import loess
  File "C:\Users\atomg\OneDrive - Thermochron Systems LLC\heman_code\Pro\.venv\lib\site-packages\skmisc\loess\__init__.py", line 51, in <module>
    from ._loess import (loess, loess_model, loess_inputs, loess_control,
ImportError: DLL загрузка не удалась: Указанный модуль не найден.

Ответ или решение

Для выполнения взвешенной LOWESS интерполяции в Python 3.7, вы можете рассмотреть несколько альтернативных подходов, так как statsmodels и skmisc могут не удовлетворять вашим требованиям. В данной ситуации можно попробовать следующие методы:

  1. Использование библиотеки pygam:
    Библиотека pygam предоставляет методы для работы с обобщёнными аддитивными моделями и поддерживает взвешенные функции. Установите её с помощью команды:

    pip install pygam

    Пример кода для взвешенной LOWESS интерполяции:

    import numpy as np
    import matplotlib.pyplot as plt
    from pygam import LinearGAM, s
    
    # Ваши данные
    x = np.array([...])  # ваши значения x
    y = np.array([...])  # ваши значения y
    weights = np.array([...])  # ваши ошибки или веса
    
    # Подгонка GAM, используя s() для сигмоидальных (или LOWESS-подобных) функций
    gam = LinearGAM(s(0, n_splines=10)).fit(x, y, weights=weights)
    
    # Прогнозирование
    x_pred = np.linspace(min(x), max(x), 100)
    y_pred = gam.predict(x_pred)
    
    # Визуализация
    plt.scatter(x, y, c='blue', label='Данные')
    plt.plot(x_pred, y_pred, color='red', label='LOWESS интерполяция')
    plt.legend()
    plt.show()
  2. Использование библиотеки numpy для реализации LOWESS:
    Можно настроить свою собственную версию LOWESS с использованием базовых библиотек numpy и scipy. Вот пример реализации:

    import numpy as np
    import matplotlib.pyplot as plt
    from statsmodels.nonparametric.smoothers_lowess import lowess
    
    # Ваши данные
    x = np.array([...])  # ваши значения x
    y = np.array([...])  # ваши значения y
    errors = np.array([...])  # ваши ошибки
    
    # Вычисление весов, основанных на ошибках
    weights = 1 / errors**2  # инверсные квадраты ошибок
    
    # Выполнение LOWESS с весами
    lowess_result = lowess(y, x, frac=0.3, weights=weights)
    
    # Визуализация
    plt.scatter(x, y, c='blue', label='Данные')
    plt.plot(lowess_result[:, 0], lowess_result[:, 1], color='red', label='LOWESS интерполяция')
    plt.legend()
    plt.show()
  3. Переопределение функции loess из skmisc:
    Если у вас возникают ошибки DLL, убедитесь, что все зависимости установлены корректно. Попробуйте переустановить skmisc:

    pip uninstall skmisc
    pip install skmisc

    Если проблема сохраняется, рассмотрите возможность использования виртуального окружения с другой версией Python или обновите свою текущую библиотеку, если это возможно.

Каждый из предложенных методов имеет свои особенности. Выбор подхода зависит от конкретных требований вашего проекта и данных, с которыми вы работаете.

Оцените материал
Добавить комментарий

Капча загружается...