private void btnOK_Click(object sender, EventArgs e) { if (tbxCsvFilePath.Text == "" || cmbPreprocess.SelectedIndex < 0 || tbxNumInputNode.Text == "" || tbxTrainingRatio.Text == "") { MessageBox.Show("Error: You must fill all required inputs!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } //1. Đọc dữ liệu từ file .csv vào mảng và tiền xử lý StockRecordBUS stockRecordBUS = new StockRecordBUS(); StockRecordDTO stockRecordDTO = stockRecordBUS.LoadData(tbxCsvFilePath.Text); double[] dblSource = new double[stockRecordDTO.Entries.Count]; int i = 0; foreach (EntryDTO entryDTO in stockRecordDTO.Entries) { dblSource[i] = entryDTO.ClosePrice; i++; } PreprocessBUS preprocessBUS = new PreprocessBUS(); #region Phần riêng if (rdPricePrediction.Checked)//Dự đoán giá { if (rdSVR.Checked)//Mô hình SVR { if (cmbPreprocess.SelectedItem.ToString() == "ScaleByMinMax") { preprocessBUS.FindMinMax(dblSource); dblSource = preprocessBUS.PreprocessByMinMax(dblSource); } } else//Mô hình ANN { if (cmbPreprocess.SelectedItem.ToString() == "ScaleByMinMax") { preprocessBUS.FindMinMax(dblSource); dblSource = preprocessBUS.PreprocessByMinMax(dblSource); } } } else//Dự đoán xu hướng { if (rdSVR.Checked)//Mô hình SVR { if (cmbPreprocess.SelectedItem.ToString() == "Return[-1,1]") { dblSource = preprocessBUS.Scale_SVR_Return(stockRecordDTO.Entries.Count, dblSource, 1, 1); } } else//Mô hình ANN { if (cmbPreprocess.SelectedItem.ToString() == "Return[-1,1]") { dblSource = preprocessBUS.Scale_SVR_Return(stockRecordDTO.Entries.Count, dblSource, 1, 1); } } } #endregion //2. Chuyển sang định dạng của LibSVM (dựa vào số node đầu vào) ConverterBUS converter = new ConverterBUS(); int iPos = tbxCsvFilePath.Text.LastIndexOf('\\'); string strFolderPath = tbxCsvFilePath.Text.Remove(iPos+1); string strTotalFile = strFolderPath + stockRecordDTO.ID + ".txt"; int iNumInputNode = Convert.ToInt32(tbxNumInputNode.Text); int numDaysPredicted = 1; int iNumLine = 0; if (cmbPreprocess.SelectedItem.ToString() == "Return[-1,1]") { if (int.TryParse(tbxNumDaysPredicted.Text,out numDaysPredicted)) { converter.ConvertForTrend(int.Parse(tbxNumDaysPredicted.Text), iNumInputNode, dblSource, strTotalFile, out iNumLine, 2, false); } else { MessageBox.Show("Please enter a number"); return; } } else { if(ckbImproveDirection.Checked) { double dblTrainPercent = Convert.ToDouble(tbxTrainingRatio.Text); converter.ConvertWImprovedDirection(iNumInputNode, dblSource, strTotalFile, dblTrainPercent, out iNumLine); } else { converter.Convert(iNumInputNode, dblSource, strTotalFile, out iNumLine); } } //3. Từ file chứa toàn bộ dữ liệu ta phân phối vào 2 file train và test (dựa vào tỉ lệ bộ train) string strTrainFile = strFolderPath + stockRecordDTO.ID + "_" + numDaysPredicted + "_train.txt"; string strTestFile = strFolderPath + stockRecordDTO.ID + "_" + numDaysPredicted + "_test.txt"; StreamReader reader = new StreamReader(strTotalFile); StreamWriter trainWriter = new StreamWriter(strTrainFile); StreamWriter testWriter = new StreamWriter(strTestFile); //Ghi phương thức xử lý vào dòng đầu tiên của file test //Mục đích là để ta có thể chuyển về dữ liệu nguyên thủy testWriter.WriteLine(cmbPreprocess.SelectedItem.ToString() + " " + preprocessBUS.Min.ToString() + " " + preprocessBUS.Max.ToString()); double dblTrainingSetRatio = Convert.ToDouble(tbxTrainingRatio.Text); //int iBound = numDaysPredicted > iNumInputNode ? 2 * numDaysPredicted : numDaysPredicted + iNumInputNode; //int iNumLine = dblSource.Length - iBound + 1; int iDivideLine = (int)(dblTrainingSetRatio * iNumLine/100); for (i = 0; i < iDivideLine; i++) { string strLine = reader.ReadLine(); trainWriter.WriteLine(strLine); } for (; i < iNumLine; i++) { string strLine = reader.ReadLine(); testWriter.WriteLine(strLine); } testWriter.Close(); trainWriter.Close(); reader.Close(); MessageBox.Show("Finish!"); }
//Giá trị trả về là giá dự đoán public double TrainAndPredict(bool isSVR) { double[][] dblActual_Forecast = null; #region Phần chung //1. Lấy đoạn dữ liệu cần thiết double[] dblData = PickNeededData(); //2. Tiền xử lý PreprocessBUS preprocessBUS = new PreprocessBUS(); if (Preprocess == "ScaleByMinMax") { preprocessBUS.FindMinMax(dblData); dblData = preprocessBUS.PreprocessByMinMax(dblData); } ConverterBUS converter = new ConverterBUS(); int iNumLine = 0; if(ImprovedDirection) { converter.ConvertWImprovedDirection(NumInputNode, dblData, "Training.txt", 100, out iNumLine); } else { converter.Convert(NumInputNode, dblData, "Training.txt", out iNumLine); } //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("Test.txt"); if (Preprocess == "ScaleByMinMax") { writer.WriteLine("ScaleByMinMax " + preprocessBUS.Min.ToString() + " " + preprocessBUS.Max.ToString()); } string strLine = "0 "; for (int i = 0; i < NumInputNode; i++) { strLine = strLine + (i+1).ToString() + ":" + dblData[TrainingSize - NumInputNode + i].ToString() + " "; } writer.WriteLine(strLine); writer.Close(); #endregion #region Phần riêng //3. Huấn luyện và dự đoán #region SVR if (isSVR == true) //SVR { string[] strArgs = new string[8]; strArgs[0] = "-g"; //gama. Trong hàm Gauss kernel: exp(-gamma*|u-v|^2) strArgs[2] = "-c"; strArgs[4] = "-p"; //epsilon strArgs[6] = "Training.txt"; strArgs[7] = "SVRModel.txt"; //Tìm bộ tham số (gama, c, epsilon) svm_modelSelection modelSelection = new svm_modelSelection(); modelSelection.Log = false; string[] strArgsModel = new string[4]; strArgsModel[0] = "-v"; strArgsModel[1] = NumFold; strArgsModel[2] = "Training.txt"; strArgsModel[3] = "SVRModel.txt"; if (ModelSelection == "Grid search") { modelSelection.Run(strArgsModel, "", true, TrainingMeasure, CrossValidationType); strArgs[1] = modelSelection.Y.ToString(); //gama strArgs[3] = modelSelection.X.ToString(); //c strArgs[5] = modelSelection.Z.ToString(); //epsilon //Huấn luyện svm_train.Main(strArgs); //Dự đoán strArgs = new string[3]; strArgs[0] = "Test.txt"; strArgs[1] = "SVRModel.txt"; strArgs[2] = "Prediction.txt"; dblActual_Forecast = svm_predict.MainProcess(strArgs); } else if(ModelSelection == "Pattern search") { const int iNumModel = 10; for (int i = 0; i < iNumModel; i++) { modelSelection = new svm_modelSelection {Log = false}; strArgsModel[3] = "SVRModel" + i + 1 + ".txt"; modelSelection.Run(strArgsModel, "", false, TrainingMeasure, CrossValidationType); strArgs[1] = (Math.Pow(2, modelSelection.Y)).ToString(); //gama strArgs[3] = (Math.Pow(2, modelSelection.X)).ToString(); //c strArgs[5] = (Math.Pow(2, modelSelection.Z)).ToString(); //epsilon strArgs[7] = "SVRModel" + i + 1 + ".txt"; //Huấn luyện svm_train.Main(strArgs); } //Dự đoán double[][][] dblTemp = new double[iNumModel][][]; dblActual_Forecast = new double[2][]; dblActual_Forecast[0] = new double[]{0}; dblActual_Forecast[1] = new double[]{0}; for (int i = 0; i < iNumModel; i++) { strArgs = new string[3]; strArgs[0] = "Test.txt"; strArgs[1] = "SVRModel" + i + 1 + ".txt"; strArgs[2] = "Prediction.txt"; dblTemp[i] = svm_predict.MainProcess(strArgs); dblActual_Forecast[1][0] += dblTemp[i][1][0]; } dblActual_Forecast[1][0] /= iNumModel; } } #endregion #region ANN else //ANN { //Huấn luyện ANNParameterBUS.InputNode = NumInputNode; ANNModelBUS.AnnModelFile = "ANNModel.txt"; ANNTrainBUS annTrain = new ANNTrainBUS(); annTrain.LoadDataSet("Training.txt"); annTrain.Main(); //Dự đoán ANNParameterBUS.LoadParameter(); ANNPredictBUS annPredict = new ANNPredictBUS(); annPredict.LoadDataSet("Test.txt"); dblActual_Forecast = annPredict.MainProcess(); } #endregion #endregion return dblActual_Forecast[1][0]; //Giá dự đoán }