コード例 #1
0
ファイル: MainGUI.cs プロジェクト: hksonngan/mytesgnikrow
        private void btnTest_Click(object sender, EventArgs e)
        {
            if (tbxTestFilePath.Text == "" || tbxModelFilePath.Text == "")
            {
                MessageBox.Show("Error: You must fill all required inputs!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            #region Phần chung
            //Ma trận với dòng thứ 1 chứa các giá trị thực và dòng thứ 2 chứa các giá trị dự đoán.
            double[][] dblActual_Forecast = new double[2][];
            dblActual_Forecast[0] = null;
            dblActual_Forecast[1] = null;

            int iPos = tbxTestFilePath.Text.LastIndexOf('\\');
            string strFolderPath = tbxTestFilePath.Text.Remove(iPos+1);
            #endregion

            #region Phần riêng
            #region Dự đoán giá
            if (rdPricePrediction.Checked)//Dự đoán giá
            {
                iPos = tbxTestFilePath.Text.LastIndexOf('_');
                string strMutualPath = tbxTestFilePath.Text.Remove(iPos + 1);
                string strPredictedFile = strMutualPath + "predict.txt";
                #region SVR
                if (rdSVR.Checked)//Mô hình SVR
                {
                    string[] strArgs = new string[3];
                    strArgs[0] = tbxTestFilePath.Text;
                    strArgs[1] = tbxModelFilePath.Text;
                    strArgs[2] = strPredictedFile;
                    StreamReader reader = new StreamReader(tbxModelFilePath.Text);
                    string strLine = reader.ReadLine();
                    if (strLine == "Multiple")  //Bag Pattern Search
                    {
                        StreamWriter measure = new StreamWriter(strMutualPath + "SingleModelMeasure.txt");
                        strLine = reader.ReadLine();    //Số mô hình
                        int iNumModel = Convert.ToInt32(strLine);
                        double[][][] dblActual_ForecastSeries = new double[iNumModel][][];
                        for (int i = 0; i < iNumModel; i++)
                        {
                            dblActual_ForecastSeries[i] = new double[2][];
                            dblActual_ForecastSeries[i][0] = null;
                            dblActual_ForecastSeries[i][1] = null;

                            strLine = reader.ReadLine();    //Đường dẫn đến file model
                            strArgs[1] = strLine;
                            dblActual_ForecastSeries[i] = svm_predict.MainProcess(strArgs);
                            MeasureBUS measureBUS = new MeasureBUS();
                            double dblMSE = measureBUS.MSE(dblActual_ForecastSeries[i][0], dblActual_ForecastSeries[i][1]);
                            double dblNMSE = measureBUS.NMSE(dblActual_ForecastSeries[i][0], dblActual_ForecastSeries[i][1]);
                            double dblDS = measureBUS.DS(dblActual_ForecastSeries[i][0], dblActual_ForecastSeries[i][1]);
                            measure.WriteLine((i + 1).ToString() + " " + dblMSE.ToString() + " " + dblNMSE.ToString() + " " + dblDS.ToString());
                        }
                        measure.Close();

                        //Để có kết quả sau cùng, ta sẽ lấy trung bình kết quả dự đoán của tất cả các mô hình lại
                        int iCounter = dblActual_ForecastSeries[0][0].Count();
                        dblActual_Forecast[0] = new double[iCounter];
                        dblActual_Forecast[1] = new double[iCounter];
                        for (int i = 0; i < iCounter; i++)
                        {
                            //Giá thực
                            dblActual_Forecast[0][i] = dblActual_ForecastSeries[0][0][i];
                            //Giá dự đoán
                            dblActual_Forecast[1][i] = 0;
                            for (int j = 0; j < iNumModel; j++)
                            {
                                dblActual_Forecast[1][i] += dblActual_ForecastSeries[j][1][i];
                            }
                            dblActual_Forecast[1][i] /= iNumModel;
                        }

                        //Ghi kết quả cuối cùng ra file
                        StreamWriter finalResult = new StreamWriter(strPredictedFile);
                        for (int i = 0; i < iCounter; i++)
                        {
                            finalResult.WriteLine(dblActual_Forecast[0][i].ToString() + " " + dblActual_Forecast[1][i].ToString());
                        }
                        finalResult.Close();
                        reader.Close();
                    }
                    else
                    {
                        reader.Close();
                        dblActual_Forecast = svm_predict.MainProcess(strArgs);
                    }
                }
                #endregion
                #region ANN
                else//Mô hình ANN
                {
                    ANNModelBUS.AnnModelFile = tbxModelFilePath.Text;

                    ANNParameterBUS.LoadParameter();

                    ANNPredictBUS annPredict = new ANNPredictBUS();
                    annPredict.LoadDataSet(tbxTestFilePath.Text);
                    dblActual_Forecast = annPredict.MainProcess();
                    //dblActual_Forecast = annPredict.StepTrainingMethod();
                    annPredict.WritePredictPrice(strPredictedFile);
                }
                #endregion
            }
            #endregion
            #region Dự đoán xu hướng
            else//Dự đoán xu hướng
            {
                if (rdSVR.Checked)//Mô hình SVR
                {
                    iPos = tbxTestFilePath.Text.LastIndexOf('_');
                    string strMutualPath = tbxTestFilePath.Text.Remove(iPos + 1);
                    string strPredictedFile = strMutualPath + "predict.txt";
                    string[] strArgs = new string[3];
                    strArgs[0] = tbxTestFilePath.Text;
                    strArgs[1] = tbxModelFilePath.Text;
                    strArgs[2] = strPredictedFile;
                    StreamReader reader = new StreamReader(tbxModelFilePath.Text);
                    string strLine = reader.ReadLine();
                    if (strLine == "Multiple")  //Bag Pattern Search
                    {
                        StreamWriter measure = new StreamWriter(strMutualPath + "SingleModelMeasure.txt");
                        strLine = reader.ReadLine();    //Số mô hình
                        int iNumModel = Convert.ToInt32(strLine);
                        double[][][] dblActual_ForecastSeries = new double[iNumModel][][];
                        for (int i = 0; i < iNumModel; i++)
                        {
                            dblActual_ForecastSeries[i] = new double[2][];
                            dblActual_ForecastSeries[i][0] = null;
                            dblActual_ForecastSeries[i][1] = null;

                            strLine = reader.ReadLine();    //Đường dẫn đến file model
                            strArgs[1] = strLine;
                            dblActual_ForecastSeries[i] = svm_predict.MainProcess(strArgs);
                            MeasureBUS measureBUS = new MeasureBUS();
                            double dblNMSE = measureBUS.NMSE(dblActual_ForecastSeries[i][0], dblActual_ForecastSeries[i][1]);
                            measure.WriteLine((i + 1).ToString() + " " + dblNMSE.ToString());
                        }
                        measure.Close();

                        //Để có kết quả sau cùng, ta sẽ lấy trung bình kết quả dự đoán của tất cả các mô hình lại
                        int iCounter = dblActual_ForecastSeries[0][0].Count();
                        dblActual_Forecast[0] = new double[iCounter];
                        dblActual_Forecast[1] = new double[iCounter];
                        for (int i = 0; i < iCounter; i++)
                        {
                            //Giá thực
                            dblActual_Forecast[0][i] = dblActual_ForecastSeries[0][0][i];
                            //Giá dự đoán
                            dblActual_Forecast[1][i] = 0;
                            for (int j = 0; j < iNumModel; j++)
                            {
                                dblActual_Forecast[1][i] += dblActual_ForecastSeries[j][1][i];
                            }
                            dblActual_Forecast[1][i] /= iNumModel;
                        }

                        //Ghi kết quả cuối cùng ra file
                        StreamWriter finalResult = new StreamWriter(strPredictedFile);
                        for (int i = 0; i < iCounter; i++)
                        {
                            finalResult.WriteLine(dblActual_Forecast[0][i].ToString() + " " + dblActual_Forecast[1][i].ToString());
                        }
                        finalResult.Close();
                        reader.Close();
                    }
                    else
                    {
                        reader.Close();
                        dblActual_Forecast = svm_predict.MainProcess(strArgs);
                    }
                }
                else//Mô hình ANN
                {
                    iPos = tbxTestFilePath.Text.LastIndexOf('_');
                    string strPredictedFile = tbxTestFilePath.Text.Remove(iPos + 1) + "predict.txt";

                    ANNModelBUS.AnnModelFile = tbxModelFilePath.Text;
                    ANNParameterBUS.LoadParameter();

                    ANNPredictBUS annPredict = new ANNPredictBUS();
                    annPredict.LoadDataSet(tbxTestFilePath.Text);
                    dblActual_Forecast = annPredict.MainProcessTrend();
                    annPredict.WritePredictPrice(strPredictedFile);
                }
            }
            #endregion
            #endregion

            #region Phần chung
            HandleMeasure(strFolderPath+"PerformanceMeasure.txt", dblActual_Forecast[0], dblActual_Forecast[1]);
            MessageBox.Show("Finish!");
            #endregion
        }
コード例 #2
0
ファイル: MainGUI.cs プロジェクト: hksonngan/mytesgnikrow
        private void btnPredict_Click(object sender, EventArgs e)
        {
            //Ma trận với dòng thứ 1 chứa các giá trị thực và dòng thứ 2 chứa các giá trị dự đoán.
            double[][] dblActual_Forecast = new double[2][];
            dblActual_Forecast[0] = null;
            dblActual_Forecast[1] = null;

            #region Price
            #region Ghi File Test
            //Dùng tạm số node input = 5, sau này bổ sung hàm đọc file số node input
            int numInputNode = 5;

            //Tìm ngày cần dự đoán
            DateTime inputDay = dtpInputDay.Value;
            DateTime Today = ((EntryDTO)_stockRecordDTO.Entries[_stockRecordDTO.Entries.Count - 1]).Date;
            int i;
            for (i = 0; i < _stockRecordDTO.Entries.Count - numInputNode; i++)
            {
                EntryDTO curEntry = (EntryDTO)_stockRecordDTO.Entries[i + numInputNode];
                if (inputDay.Subtract(curEntry.Date).Days <= 0 && inputDay.Subtract(Today).Days <= 0)
                {
                    break;
                }
            }

            //Ghi bộ input đầu vào cho ngày dự đoán
            double[] dblSource = new double[numInputNode + 1];
            if (i < _stockRecordDTO.Entries.Count - numInputNode)
            {
                //1. Đọc dữ liệu vào mảng
                double[] dblTemp = new double[_stockRecordDTO.Entries.Count];
                for (int j = 0; j < _stockRecordDTO.Entries.Count; j++)
                {
                    EntryDTO curEntry = (EntryDTO)_stockRecordDTO.Entries[j];
                    dblTemp[j] = curEntry.ClosePrice;
                }

                for (int j = 0; j < numInputNode; j++)
                {
                    EntryDTO curEntry = (EntryDTO)_stockRecordDTO.Entries[i + j];
                    dblSource[j] = curEntry.ClosePrice;
                }

                PreprocessBUS preprocessBUS = new PreprocessBUS();
                preprocessBUS.FindMinMax(dblTemp);
                dblSource = preprocessBUS.PreprocessByMinMax(dblSource);

                //2. Tạo file test. File test này chỉ có 2 dòng:
                //+Dòng 1: Chứa thông tin tiền xử lý
                //+Dòng 2: Giống như 1 dòng của file training, nhưng giá trị đích không biết (để bằng 0)
                StreamWriter writer = new StreamWriter(@"TestPrice.txt");
                writer.WriteLine("ScaleByMinMax " + preprocessBUS.Min.ToString() + " " + preprocessBUS.Max.ToString());

                string strLine = "0 ";
                for (int j = 0; j < numInputNode; j++)
                {
                    strLine += (j + 1).ToString() + ":" + dblSource[j].ToString() + " ";
                }
                writer.WriteLine(strLine);

                writer.Close();
            }
            else
            {
                MessageBox.Show("Error: Invalid input!");
            }
            #endregion
            #region Dự đoán ANN
            ANNModelBUS.AnnModelFile = @"AppModel\ANNPrice\" + cmbStockID.SelectedItem.ToString() + "_1_model.txt";

            ANNParameterBUS.LoadParameter();

            ANNPredictBUS annPredict = new ANNPredictBUS();
            annPredict.LoadDataSet(@"TestPrice.txt");
            dblActual_Forecast = annPredict.MainProcess();
            pricePredict = dblActual_Forecast[1][0];
            tbxANNPrice.Text = Math.Round(dblActual_Forecast[1][0], 2).ToString();
            #endregion
            string[] strArgs = new string[3];
            strArgs[0] = @"TestPrice.txt";
            strArgs[1] = @"AppModel\SVRPrice\" + cmbStockID.SelectedItem.ToString() + "_1_model.txt";
            strArgs[2] = "price_predicted.txt";
            dblActual_Forecast = svm_predict.MainProcess(strArgs);
            tbxSVMPrice.Text = Math.Round(dblActual_Forecast[1][0], 2).ToString();
            #endregion
            #region Trend
            //Dùng tạm số node input = 5, sau này bổ sung hàm đọc file số node input
            numInputNode = 5;

            //Tìm ngày cần dự đoán
            inputDay = dtpInputDay.Value;
            Today = ((EntryDTO)_stockRecordDTO.Entries[_stockRecordDTO.Entries.Count - 1]).Date;
            for (i = 0; i < _stockRecordDTO.Entries.Count; i++)
            {
                EntryDTO curEntry = (EntryDTO)_stockRecordDTO.Entries[i];
                if (inputDay.Subtract(curEntry.Date).Days <= 0 && inputDay.Subtract(Today).Days <= 0)
                {
                    break;
                }
            }
            int numDaysPredicted = 1;
            if (!int.TryParse(tbxNumDayTrendPredict.Text, out numDaysPredicted))
            {
                MessageBox.Show("Please enter a number");
                return;
            }

            //Ghi bộ input đầu vào cho ngày dự đoán
            dblSource = new double[numInputNode * numDaysPredicted + numDaysPredicted + 1];
            if (i < _stockRecordDTO.Entries.Count && i > numInputNode * numDaysPredicted)
            {
                for (int k = 0; k < dblSource.Length; k++)
                {
                    dblSource[k] = 0;
                }
                //1. Đọc dữ liệu vào mảng
                for (int j = 0; j < numInputNode * numDaysPredicted; j++)
                {
                    EntryDTO curEntry = (EntryDTO)_stockRecordDTO.Entries[i - j];
                    dblSource[j] = curEntry.ClosePrice;
                }
                for (int k = 0; k < dblSource.Length; k++)
                {
                    if (dblSource[k] == 0)
                    {
                        dblSource[k] = dblSource[0];
                    }
                }
                PreprocessBUS preprocessBUS = new PreprocessBUS();
                dblSource = preprocessBUS.Scale_SVR_Return(dblSource.Length, dblSource, 1, 1);

                //2. Chuyển sang định dạng của LibSVM (dựa vào số node đầu vào)
                ConverterBUS converter = new ConverterBUS();

                int iNumLine = 0;

                converter.ConvertForTrend(numDaysPredicted, numInputNode, dblSource, "TestTrend.txt", out iNumLine, 2, true);

                #region Dự đoán ANN

                if (numDaysPredicted >= 1 && numDaysPredicted < 5)
                {
                    ANNModelBUS.AnnModelFile = @"AppModel\ANNTrend\" + cmbStockID.SelectedItem.ToString() + "_1_model.txt";
                    strArgs[1] = @"AppModel\SVRTrend\" + cmbStockID.SelectedItem.ToString() + "_1_model.txt";
                }
                else if (numDaysPredicted >= 5 && numDaysPredicted < 10)
                {
                    ANNModelBUS.AnnModelFile = @"AppModel\ANNTrend\" + cmbStockID.SelectedItem.ToString() + "_5_model.txt";
                    strArgs[1] = @"AppModel\SVRTrend\" + cmbStockID.SelectedItem.ToString() + "_5_model.txt";
                }
                else if (numDaysPredicted >= 10 && numDaysPredicted < 30)
                {
                    ANNModelBUS.AnnModelFile = @"AppModel\ANNTrend\" + cmbStockID.SelectedItem.ToString() + "_10_model.txt";
                    strArgs[1] = @"AppModel\SVRTrend\" + cmbStockID.SelectedItem.ToString() + "_10_model.txt";
                }
                else
                {
                    ANNModelBUS.AnnModelFile = @"AppModel\ANNTrend\" + cmbStockID.SelectedItem.ToString() + "_30_model.txt";
                    strArgs[1] = @"AppModel\SVRTrend\" + cmbStockID.SelectedItem.ToString() + "_30_model.txt";
                }

                ANNParameterBUS.LoadParameter();

                ANNPredictBUS annPredictTrend = new ANNPredictBUS();
                annPredictTrend.LoadDataSet(@"TestTrend.txt");
                dblActual_Forecast = annPredictTrend.MainProcessTrend();
                trendPredict = dblActual_Forecast[1][0];
                tbxANNTrend.Text = dblActual_Forecast[1][0] > 0 ? "Tăng" : "Giảm";

                strArgs[0] = @"TestTrend.txt";
                strArgs[2] = "trend_predicted.txt";
                dblActual_Forecast = svm_predict.MainProcess(strArgs);
                tbxSVMTrend.Text = dblActual_Forecast[1][0] > 0 ? "Tăng" : "Giảm";

                #endregion

            }
            else
            {
                MessageBox.Show("Error: Invalid input!");
            }

            #endregion
        }