/// <summary> /// 意思決定 /// </summary> public int DecideIntention() { NumYArray xData = new NumYArray(); xData.Add(situation); //ニューラルネットワークによる結果表示 NumYArray resultArray = new NumYArray(nn.Predict(xData)); List <List <float> > resultList = resultArray.Get(); //ランダムによる意思決定 float n = Random.Range(0.0f, NumY.Sum(resultArray).Get()[0][0]); float offset = 0.0f; for (int i = 0; i < resultList[0].Count; i++) { offset += resultList[0][i]; if (n <= offset) { intention = i; break; } } return(this.intention); }
private void Button_Click_Export(object sender, RoutedEventArgs e) {//导出图表点击事件 // ExportFunction(); string[] sttime = new string[10]; int[] stnum = new int[10]; //sttime = Labels.ToArray();//将List<string> Labels存入string[] st 数组做流输出,存放横坐标的时间数据 sttime = NumX.ToArray(); stnum = NumY.ToArray(); //MessageBox.Show(st[9], "test");//测试消息框 ExportFunction(sttime, stnum); }
public void linestart(object sender, EventArgs e) {//折线图绘制函数 Labels.Add(DateTime.Now.ToString("HH:mm:s")); Labels.RemoveAt(0); NumX.Add(DateTime.Now.ToString("HH:mm:s"));//同步存放需要导出的x轴数据 NumX.RemoveAt(0); SeriesCollection[0].Values.Add(MainBusiness.numberPeople()); SeriesCollection[0].Values.RemoveAt(0); NumY.Add(MainBusiness.numberPeople());//同步存放需要导出的y轴数据 NumY.RemoveAt(0); }
/// <summary> /// データを元に結果を予測する /// </summary> /// <param name="xData">予測する状況</param> /// <returns>予測結果</returns> public NumYArray Predict(NumYArray xData) { //順伝播・フォワードプロパゲーション NumYArray layerZ1 = new NumYArray(NumY.Dot(xData, this.w1) + this.b1); NumYArray layerA1 = new NumYArray(NumY.Sigmoid(layerZ1)); NumYArray layerZ2 = new NumYArray(NumY.Dot(layerA1, this.w2) + this.b2); NumYArray layerA2 = new NumYArray(NumY.Sigmoid(layerZ2)); NumYArray returnArray = new NumYArray(layerA2); return(returnArray); }
private void Button_Click_Import(object sender, RoutedEventArgs e) { //导入图表点击事件 OutputFunction(NumX, NumY); //调用流输入函数对动态图表的xy轴数据存储list进行重写 int[] numy = NumY.ToArray(); string[] numx = NumX.ToArray(); for (int i = 0; i < 10; i++) { Labels.Add(numx[i]); Labels.RemoveAt(0); MessageBox.Show(numx[i], "test"); SeriesCollection[0].Values.Add(numy[i]);//因为没找到y轴数据对应的Ilist中存放数据的list,所以自己建立一个同步存放的list进行重写 SeriesCollection[0].Values.RemoveAt(0); } }
public NeuralNetwork(int inputUnits, int hiddenUnits, int outpuUnits, string folderName) { //学習値のデータがあるならそこから読み込む if (System.IO.File.Exists(@"Assets/Resources/AIData/" + folderName + "/LearningDataCSVw1.csv")) { w1 = NeuralReadCSV.readCSVData("AIData/" + folderName + "/LearningDataCSVw1"); b1 = NeuralReadCSV.readCSVData("AIData/" + folderName + "/LearningDataCSVb1"); w2 = NeuralReadCSV.readCSVData("AIData/" + folderName + "/LearningDataCSVw2"); b2 = NeuralReadCSV.readCSVData("AIData/" + folderName + "/LearningDataCSVb2"); } else { w1 = NumY.RandomArray(inputUnits, hiddenUnits, 1.0f, -1.0f); b1 = NumY.RandomArray(1, hiddenUnits, 1.0f, -1.0f); w2 = NumY.RandomArray(hiddenUnits, outpuUnits, 1.0f, -1.0f); b2 = NumY.RandomArray(1, outpuUnits, 1.0f, -1.0f); } }
/// <summary> /// 入力されたデータを元にトレーニング /// </summary> /// <param name="epochs">トレーニング回数</param> /// <param name="learningRate">学習率</param> /// <returns></returns> public bool Train(int epochs, float learningRate, bool isTrainNow) { if (!isTrainNow) { NumYArray layerZ1 = new NumYArray(); NumYArray layerA1 = new NumYArray(); NumYArray layerZ2 = new NumYArray(); NumYArray layerA2 = new NumYArray(); NumYArray dlayerZ1 = new NumYArray(); NumYArray dlayerZ2 = new NumYArray(); NumYArray dw1 = new NumYArray(); NumYArray db1 = new NumYArray(); NumYArray dw2 = new NumYArray(); NumYArray db2 = new NumYArray(); totalTrainNum = 0; maxTrainNum = Mathf.RoundToInt(100 / xData.Get().Count); if (maxTrainNum <= 0) { maxTrainNum = 1; } learnSpeed = 1; } nowTrainNum = 0; //規定回数学習させ、他処理のために途中で抜ける while (nowTrainNum < maxTrainNum * learnSpeed) { //許容値を超えているか判定する用出力結果 //Array a = Predict(xData); int m = xData.Get()[0].Count; //順伝播・フォワードプロパゲーション layerZ1 = NumY.Dot(xData, this.w1) + this.b1; layerA1 = NumY.Sigmoid(layerZ1); layerZ2 = NumY.Dot(layerA1, this.w2) + this.b2; layerA2 = NumY.Sigmoid(layerZ2); //誤差逆伝播法・バックプロパゲーション dlayerZ2 = (layerA2 - yData) / m; dw2 = NumY.Dot(layerA1.T, dlayerZ2); db2 = NumY.Sum(dlayerZ2, 0); dlayerZ1 = NumY.Dot(dlayerZ2, w2.T) * NumY.SigmoidDerivative(layerZ1); dw1 = NumY.Dot(xData.T, dlayerZ1); db1 = NumY.Sum(dlayerZ1, 0); //パラメータ更新 w2 -= learningRate * dw2; b2 -= learningRate * db2; w1 -= learningRate * dw1; b1 -= learningRate * db1; nowTrainNum++; totalTrainNum++; if (totalTrainNum >= epochs) { this.xData = new NumYArray(); this.yData = new NumYArray(); totalTrainNum = 0; nowTrainNum = 0; return(false); } } nowTrainNum = 0; return(true); }