Машинное обучение в трейдинге: теория, модели, практика и алготорговля - страница 3624

[Удален]  
1000 измерений. Считало 9 минут в колабе (зря потраченное время, без учета написания кода).

[Удален]  

Вроде не правильно считалась многомерная ф-я. Постарался сделать прямо как в статье:

def megacity_function(x):
    def process_element(x0, x1):
        a = np.sin(np.sqrt(np.abs(x0 - 1.13) + np.abs(x1 - 2.0)))
        b = np.cos(np.sqrt(np.abs(np.sin(x0))) + np.sqrt(np.abs(np.sin(x1 - 2.0))))
        f = a + b

        res = np.floor(np.power(f, 4)) - np.floor(2 * np.exp(-(np.power(x0 + 9.5, 2) + np.power(x1 + 7.5, 2)) / 0.4))

        # Масштабирование результата
        res_scaled = (res - (-1.0)) / (12.0 - (-1.0)) * (1.0 - 0.0) + 0.0

        return res_scaled

    def recursive_process(arr):
        if len(arr.shape) == 1:  # Если массив одномерный
            if len(arr) >= 2:
                sum_value = 0.0
                num_pairs = len(arr) // 2
                for i in range(num_pairs):
                    sum_value += process_element(arr[i * 2], arr[i * 2 + 1])
                return sum_value / num_pairs
            else:
                raise ValueError("Массив должен содержать как минимум два элемента")
        else:  # Если массив многомерный
            return np.array([recursive_process(sub_arr) for sub_arr in arr])

    return recursive_process(np.array(x))

В статье так:

double CalcFunc (double &args []) //function arguments
  {
    int numbOfFunctions = ArraySize (args) / 2;
    if (numbOfFunctions < 1) return GetMinFunValue ();

    double x, y;
    double sum = 0.0;
    for (int i = 0; i < numbOfFunctions; i++)
    {
      x = args [i * 2];
      y = args [i * 2 + 1];

      if (!MathIsValidNumber (x)) return GetMinFunValue ();
      if (!MathIsValidNumber (y)) return GetMinFunValue ();

      //double u = 0.5;
      //x = x * cos (u) - y * sin (u);
      //y = x * sin (u) + y * cos (u);

      if (x < GetMinRangeX ()) return GetMinFunValue ();
      if (x > GetMaxRangeX ()) return GetMinFunValue ();

      if (y < GetMinRangeY ()) return GetMinFunValue ();
      if (y > GetMaxRangeY ()) return GetMinFunValue ();

      sum += Core (x, y);
    }
    
    sum /= numbOfFunctions;

    return sum;
  }


Результат для 50 измерений:

+ добавил мультипроцессинг. Запускать лучше на TPU, а не CPU. Быстрее считает.

Потом поменяю функцию на модифицированную из статьи. 

 
Maxim Dmitrievsky #:

Вроде не правильно считалась многомерная ф-я. Постарался сделать прямо как в статье:

В статье так:


Результат для 50 измерений:

+ добавил мультипроцессинг. Запускать лучше на TPU, а не CPU. Быстрее считает.

Потом поменяю функцию на модифицированную из статьи. 

А как идет преобразование с мультиразмерности в три?
[Удален]  
mytarmailS #:
А как идет преобразование с мультиразмерности в три?

Просто беру первые 2 измерения и результат для них )

Добавил код оптимизации нейронкой "Multivariate Megacity NN" :)

пока что коряво, но на двух измерениях как-то сработала.

 
Maxim Dmitrievsky #:

Просто беру первые 2 измерения и результат для них )

А нужно брать среднее значение соответствующих парных измерений.

Значение многомерной функции F, где n - количество двумерных, а f - двумерная функция: F(x,y) = (1/n) * Σ f(xi,yi)

Координаты для визуализации многомерного пространства в трёхмерном:

x = (x1 + x2 + ... + xn) / n
y = (y1 + y2 + ... + yn) / n

Можно ещё выводить точки всех отдельных двумерных f, тогда получится множество точек в трёхмерном пространстве.

[Удален]  
Andrey Dik #:

А нужно брать среднее значение соответствующих парных измерений.

Значение многомерной функции F, где n - количество двумерных, а f - двумерная функция: F(x,y) = (1/n) * Σ f(xi,yi)

Координаты для визуализации многомерного пространства в трёхмерном:

x = (x1 + x2 + ... + xn) / n
y = (y1 + y2 + ... + yn) / n

Можно ещё выводить точки всех отдельных двумерных f, тогда получится множество точек в трёхмерном пространстве.

Можно, но я это все не использую, поэтому неохота. Можно рисовать только разведанные области. Чтобы посмотреть что делает в динамике.
 

По мне, крайне любопытный материал, даже с кодом.


https://kolibri.press/324864


https://github.com/Computational-Turbulence-Group/SURD

Может кто-то странслирует код на R?

GitHub - Computational-Turbulence-Group/SURD
GitHub - Computational-Turbulence-Group/SURD
  • Computational-Turbulence-Group
  • github.com
A Python repository for decomposing causality into its synergistic, unique, and redundant components for complex and chaotic systems. SURD (Synergistic-Unique-Redundant Decomposition) is a causal inference method that measures the increments of information gained about future events based on the available information from past observations. It...
[Удален]  
СанСаныч Фоменко #:

По мне, крайне любопытный материал, даже с кодом.


https://kolibri.press/324864


https://github.com/Computational-Turbulence-Group/SURD

Может кто-то странслирует код на R?

Мне тоже недавно дали ссылку на такой подход. Пока не разбирался.

Еще после конкурса Прадо появился ряд статей по разным подходам, например этот (нужен vpn).

A New Way to Detect Causality in Time-Series: Interview with Alejandro Rodriguez Dominguez
  • Microprediction
  • microprediction.medium.com
I virtually sat down with Alejandro Rodriguez Dominguez to discuss his recent paper with Om Hari Yadav on causality detection. I’m always on the lookout for new tricks to sharpen the search for relevant exogenous data, and I was thinking of including Alejandro and Om Hari’s ideas in my entry in the ADIA Lab Causal Discovery Contest that...
[Удален]  
К слову, мой подход не сработал на его данных, но на моих дает результаты.
[Удален]  

Еще одна хитрая ф-я, которая иногда помогает сгладить кривую баланса на новых данных.

При обучении, старые данные не так важны как самые новые. Потому что временной ряд, паттерны меняются и все такое. Большинство моделей поддерживают sample weights. Можно давать бОльший вес последним наблюдениям и меньший более старым.

def create_sample_weights(X):
    # Разделяем датасет на 10 частей
    num_parts = 10
    part_size = len(X) // num_parts
    weights = np.zeros(len(X))

    for i in range(num_parts):
        start_idx = i * part_size
        end_idx = (i + 1) * part_size if i != num_parts - 1 else len(X)
        weights[start_idx:end_idx] = (i + 1) / num_parts

    return weights