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

 
Maxim Dmitrievsky #:
Вам иерархическая больше подойдет, если надо наподобие листьев

Вполне вероятно - надо пробовать.

Правда, на сколько я помню, там памяти много надо оперативной для промежуточных расчетов, а ещё не понятно - как переносить на MQL5, и есть ли там возможность применяться на новых данных...

 
Forester #:
Думаю эта формула участвует при обучении / поиске центров кластеров. Для прогноза нужно просто найти ближайший центр по С[]

В общем, надо посмотреть, что там в массиве...

Вы с AlgLib'om дружите - можете примитивный код показать, как провести кластеризацию и применить на новых данных?

Я, если честно, их сокращения в функциях недопонимаю - что подать на вход\выход...

 
Renat Akhtyamov #:

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

если бы была окружность, то формула подходит

Мю, как я понимаю - среднее значение для каждого предиктора, оказавшегося в кластере.

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

По результату выбирается наиболее близкий кластер, как я понимаю. Т.е. надо делать расчет для всех кластеров получается.

При применении не пересчитываем среднее значение просто. 

 
Aleksey Vyazmikin #:

В общем, надо посмотреть, что там в массиве...

Вы с AlgLib'om дружите - можете примитивный код показать, как провести кластеризацию и применить на новых данных?

Я, если честно, их сокращения в функциях недопонимаю - что подать на вход\выход...

Уже года 4 Алглибом не занимался.
 
Forester #:
//| INPUT PARAMETERS:                                                |
//|     XY          -   dataset, array [0..NPoints-1,0..NVars-1].    | - массив [строк , столбцов]
//|     NPoints     -   dataset size, NPoints>=K                     | - число строк
//|     NVars       -   number of variables, NVars>=1                |  число столбцов
//|     K           -   desired number of clusters, K>=1             | - число кластеров, сколько хотите получить
//|     Restarts    -   number of restarts, Restarts>=1              | - не понятно, попробуйте 1
//| OUTPUT PARAMETERS:                                               |
//|     Info        -   return code:                                 |
//|                     * -3, if task is degenerate (number of       |
//|                           distinct points is less than K)        |
//|                     * -1, if incorrect                           |
//|                           NPoints/NFeatures/K/Restarts was passed|
//|                     *  1, if subroutine finished successfully    |
//|     C           -   array[0..NVars-1,0..K-1].matrix whose columns| - массив центров
//|                     store cluster's centers                      |
//|     XYC         -   array[NPoints], which contains cluster       | - номер кластера для каждой строки из XY
//|                     indexes                                      |

Вроде все просто - см комментарии на русском.

 
Aleksey Vyazmikin #:

Мю, как я понимаю - среднее значение для каждого предиктора, оказавшегося в кластере.

А что такое среднее от всех? Это и есть центр кластера по этому столбцу.

 
mytarmailS #:
Будет ли тс зарабатывать на тесте да/нет

 вероятность по бинарной классификации. 

Либо наклон кривой каптала на тесте по регресии или там ФВ или шарп или сколько заработает на тесте цифра. 

А лучше вместе две модели и классификация и Регресия. 


Тогда можно нагенрить 1000 ТС,   потом выбрал по  20 самых лучшых по вероятности что заработает на тесте, потом отобрал по регресии n лучшых по шарпу по регресии. 

Круто

Експеримент серьёзный
Типа датасет состоит из 1000 моделей с оценками их работы на новых данных? А зачем их классифицировать, можно же просто отсортировать

А, чтобы в среднем посмотреть, какие параметры чаще приводят к успешному успеху             
 
Maxim Dmitrievsky #:
Типа датасет состоит из 1000 моделей с оценками их работы на новых данных? А зачем их классифицировать, можно же просто отсортировать

А, чтобы в среднем посмотреть, какие параметры чаще приводят к успешному успеху             

Нет, не правильно.. попробую еще раз обьяснить,  забудь про модели пока вообще..

Есть у тебя много ТС оптимизированыйх на трейн и есть тест.


Создаем датасет для модели :

таргет = По тест мы смотрим работала ли ТС на тест  (это целевая ДА/НЕТ)

дата =  (признаки) это параметры ТС , кривая капитала, сделки, ФВ, шарп (если ТС на основе МО то кишки модельки)


Далее трейним уже как бы реальную модель отвечать будет работать конкретная ТС на тесте или нет

 
Aleksey Vyazmikin #:

Баловство всё это. Пока не сможете детектить смещение вероятности в отдельно взятом листе - модели будут лить.

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

Откуда береться смещение?

Если примеров в листах не достаточно и модели будут лить то зачем вообще говорить пр эти листы. 
 
Forester #:
Уже года 4 Алглибом не занимался.
Вот нашел в старом файле свой тест kmeans c ф-ей предикта:

#include <Math\Alglib\alglib.mqh>
   CMatrixDouble MatrixLearn;//обучающая часть данных
// заполнить MatrixLearn например MatrixLearn[row].Set(col,123.0); или считать из файла ф-ей LoadFullMatrix() см. ниже
   CMatrixDouble c;//центры кластеров - по ним можно отнести любую строку к одному из кластеров
   int klusters = 4, restarts=10;
   int xyc[],xycp[];//номер кластера для каждой строки

   KMeans(klusters, restarts, dt.MatrixLearn, c, xyc);//кластеризация: данные, число кластеров, число перезапусков - //в итоге матрицу можно поделить на klusters матриц и обрабатывать по отдельности
   predict_CKMeans(MatrixLearn,dt.MatrixLearn.Size(),dt.ins_all,klusters,c,xycp);
   Print("Predicted cluster indexes");
   string t0="";for(int i=0; i<(ArraySize(xycp)>20?20:ArraySize(xycp)); i++){ t0+=(string)(xycp[i])+", ";} Print(t0+"... (",ArraySize(xycp)," items)."); //печать первых 20 элементов
   int ac = ArrayCompare(xyc,xycp); Print("ArrayCompare: ",ac);


   // -------------- кластеризация --------------

   void KMeans(int klusters, int Restarts, CMatrixDouble &mtr, CMatrixDouble &c, int &xyc[])//кластеризация
      {
   //кластеризация в Data Mining приобретает ценность тогда, когда она выступает одним из этапов анализа данных, построения законченного аналитического решения. Аналитику часто легче выделить группы схожих объектов, изучить их особенности и построить для каждой группы отдельную модель, чем создавать одну общую модель для всех данных.
      Print("Кластеризация:");
      int info;
      CAlglib::KMeansGenerate(mtr,mtr.Size(),ins_all,klusters,Restarts,info,c,xyc);
      // в XYC - номер кластера к которому строка отнесена, в с  центр кластера для каждого столбца
      //в итоге матрицу можно поделить на klusters матриц и обрабатыватьпо отдельности
      Print("cluster indexes");
      string t0;for(int i=0; i<(ArraySize(xyc)>20?20:ArraySize(xyc)); i++){ t0+=(string)(xyc[i])+", ";} Print(t0+"... (",ArraySize(xyc)," items)."); //печать первых 20 элементов

      int xycp[];//проверка
      predict_CKMeans(mtr,mtr.Size(),ins_all,klusters,c,xycp);
      Print("Predicted cluster indexes");
      t0="";for(int i=0; i<(ArraySize(xycp)>20?20:ArraySize(xycp)); i++){ t0+=(string)(xycp[i])+", ";} Print(t0+"... (",ArraySize(xycp)," items)."); //печать первых 20 элементов
      int ac = ArrayCompare(xyc,xycp);
      Print("ArrayCompare: ",ac);
      //Print("matrix whose columns store cluster's centers:"); printMatrix(c);
   }
   
//+------------------------------------------------------------------+
//| k-means++ clusterization    -> predict cluster number            |
//| INPUT PARAMETERS:                                                |
//|     XY          -   dataset, array [0..NPoints-1,0..NVars-1].    |
//|     NPoints     -   dataset size, NPoints>=K                     |
//|     NVars       -   number of variables, NVars>=1                |
//|     K           -   desired number of clusters, K>=1             |
//| OUTPUT PARAMETERS:                                               |
//|     CT           -   array[0..NVars-1,0..K-1].matrix whose columns|
//|                     store cluster's centers                      |
//|     XYC         -   array[NPoints], which contains cluster       |
//|                     indexes                                      |
//+------------------------------------------------------------------+

void predict_CKMeans(CMatrixDouble &xy,const int npoints,
                                    const int nvars,const int k,
                                    CMatrixDouble &ct,int &xyc[])
{//--- fill XYC with center numbers
   ArrayResize(xyc,npoints);
    for(int i=0;i<npoints;i++){
        int cclosest=-1;
        double dclosest=1E300, tmp;
        for(int j=0;j<k;j++){
         double v=0.0;
         for(int i_=0;i_<nvars;i_++){
            tmp=xy[i][i_]-ct[i_][j];
            v+=tmp*tmp;
         }
            if(v<dclosest){cclosest=j;dclosest=v;}//--- check
        }
        xyc[i]=cclosest;//--- change value
    }
}


//+--------------------загрузка полной обучающей матрицы из CSV файла входы и выходы ----------------------------------------------+
void LoadFullMatrix(string fName, string delimeter=","){//загрузка полной обучающей матрицы из CSV файла входы и выходы
   int file_handle=FileOpen(fName,FILE_READ|FILE_TXT|FILE_ANSI|FILE_COMMON);

      if(file_handle!=INVALID_HANDLE){
         string s; int k; ushort u_sep=StringGetCharacter(delimeter,0); string r[]; int cols=0,row=0; bool first_line=false;
         while(!FileIsEnding(file_handle)){
            s=FileReadString(file_handle);
            if(!first_line && row==0){first_line=true;continue;}//если 1-я строка, то пропуск - там м.б. названия строк
            k=StringSplit(s,u_sep,r);
            if(cols==0){cols=k;}
            if(cols!=k){Alert("Нарушена размерность матрицы (",cols,"!=",k,") в строке ",row);continue;}

            MatrixLearn.Resize(row+1, cols);
            for(int i=0;i<k;i++) {
               MatrixLearn[row].Set(i,(double)r[i]);
            }
            row++;
         }
         FileClose(file_handle);
         rows=row;
         ins_all=cols-outs;
         ins=ins_all;
         Print("Считана матрица (",ins_all," + ",outs,") = ",cols," x ",rows, " из файла ",fName);
      }
}


Причина обращения: