Логарифмический алгоритм приближения функции - PullRequest
0 голосов
/ 06 февраля 2019

Я создал функцию для вычисления параметров логарифм-функции.

Моя цель - предсказать будущие результаты точек данных, которые следуют функции логарифма.Но самое главное, что мой алгоритм соответствует последним результатам лучше, чем целые точки данных, так как важен прогноз.В настоящее время я использую среднеквадратичную ошибку для оптимизации своих параметров, но я не знаю, как их взвесить, так как мои последние данные считаются более важными, чем первые.

  • Вот мое уравнение:

y = C * log (a * x + b)

  • Вот мой код:

    import numpy as np
    from sklearn.metrics import mean_squared_error
    
    def approximate_log_function(x, y):
    
        C = np.arange(0.01, 1, step = 0.01)
        a = np.arange(0.01, 1, step = 0.01)
        b = np.arange(0.01, 1, step = 0.01)
    
        min_mse = 9999999999
        parameters = [0, 0, 0]
    
        for i in np.array(np.meshgrid(C, a, b)).T.reshape(-1, 3):
    
            y_estimation = i[0] * np.log(i[1] * np.array(x) + i[2])  
            mse = mean_squared_error(y, y_estimation)
    
            if mse < min_mse:
                min_mse = mse
                parameters = [i[0], i[1], i[2]]
    
    return (min_mse, parameters)
    

Вы можете видеть на изображении ниже оранжевая кривая - данные, которые у меня есть, а синяя линия - моя подогнанная линия.Мы видим, что линия немного растянута от линии на конце, и я хотел бы избежать этого, чтобы улучшить прогнозирование моей функции.

график функции логарифма

У меня двоякий вопрос:

  • Это действительно лучший способ сделать это или лучше использовать другую функцию (например, возрастающую форму экспоненциального затухания)?(y = C (1 - e-kt), k> 0)

  • Как я могу изменить свой код так, чтобы последние значения были более важными для подгонки, чем первые.

1 Ответ

0 голосов
/ 06 февраля 2019

Обычно в нелинейных методах наименьших квадратов обратное значение y берется в качестве веса, что практически исключает выбросы. Вы можете расширить эту идею, добавив функцию для вычисления веса на основе положения x.

def xWeightA(x):
    container=[]
    for k in range(len(x)):
        if k<int(0.9*len(x)):
           container.append(1)
        else:
            container.append(1.2)
   return container

def approximate_log_function(x, y):

    C = np.arange(0.01, 1, step = 0.01)
    a = np.arange(0.01, 1, step = 0.01)
    b = np.arange(0.01, 1, step = 0.01)

    min_mse = 9999999999
    parameters = [0, 0, 0]
    LocalWeight=xWeightA(x)

    for i in np.array(np.meshgrid(C, a, b)).T.reshape(-1, 3):

        y_estimation = LocalWeight*i[0] * np.log(i[1] * np.array(x) + i[2])  
        mse = mean_squared_error(y, y_estimation)

        if mse < min_mse:
            min_mse = mse
            parameters = [i[0], i[1], i[2]]

    return (min_mse, parameters)

Кроме того, похоже, что вы выполняете оценку через целевую функцию, которая заставляет код занимать много времени, чтобы найти минимум (по крайней мере, на моей машине).Вы можете использовать кривую или полифит, как предложено, но если целью является создание оптимизатора, попробуйте добавить ранний разрыв или случайный поиск по сетке.Надеюсь, это поможет

...