|
分類:[C#]
初心者のため、C#に詳しくなくご相談します。
いま、CSVファイルがあり、3列目までが説明変数、
4列目が目的変数として、4組のデーターを解析したいと思っています。
・「inputfile.csv」
0.00625, 0.03448276, 0.0483871, 0.04
0.21875, 0.2068966, 0.2580645, 0.24
0.46875, 0.4137931, 0.5483871, 0.52
1, 1, 1, 1
これを、コンボボックス1に次の通り埋め込んでコンパイルすると計算が成功します。
comboValue == "1"
trainData.Add(new NData(new List<double>() { 0.00625, 0.03448276, 0.0483871 }, new List<double>() { 0.04 }));
trainData.Add(new NData(new List<double>() { 0.21875, 0.2068966, 0.2580645 }, new List<double>() { 0.24 }));
trainData.Add(new NData(new List<double>() { 0.46875, 0.4137931, 0.5483871 }, new List<double>() { 0.52 }));
trainData.Add(new NData(new List<double>() { 1, 1, 1 }, new List<double>() { 1 }));
上述の方法では、データー毎に埋め込んでコンパイルしないといけません。
汎用的にCSVファイルを読み込んで、説明変数をX、目的変数をYとしてCSV形式で読み込んで、
実施するコンボボックス「FILE」を作成しました。
説明変数X、目的変数Yは正しく読み込まれていることを確認出来ましたが、最後にXData、YDataに格納する際に、
comboValue == "1"のように、Xが3配列、Yが1配列になりません。
さらに、i,jが読み取れないとエラーになります。
trainData.Add(new NData(new List<double>() { XData[i, j] }, new List<double>() { YData[i, j7] }));
単純なCSVファイルを読み込んで、格納するだけの処理ですが、初心者のため失敗続きでした。
ご助言頂けますと有難く存じます。
記
namespace NNet{
public partial class Form1 : Form{
private NTrainer trainer;
public Form1()
{
InitializeComponent();
comboBox1.Items.AddRange(new string[]{ "1", "2", "3", "File" });
comboBox1.SelectedIndex = 3;
}
private void button1_Click( object sender, EventArgs e ) {
List<NData> trainData = new List<NData>();
if(comboBox1.SelectedIndex == -1) return;
if(trainer == null) {
var comboValue = comboBox1.Items[comboBox1.SelectedIndex].ToString();
if (comboValue == "1")
{
trainData.Add(new NData(new List<double>() { 0.00625, 0.03448276, 0.0483871 }, new List<double>() { 0.04 }));
trainData.Add(new NData(new List<double>() { 0.21875, 0.2068966, 0.2580645 }, new List<double>() { 0.24 }));
trainData.Add(new NData(new List<double>() { 0.46875, 0.4137931, 0.5483871 }, new List<double>() { 0.52 }));
trainData.Add(new NData(new List<double>() { 1, 1, 1 }, new List<double>() { 1 }));
}
else if (comboValue == "2")
・・・・・・(途中省略)・・・・・・
else if (comboValue == "File")
{
List<double> numbers = new List<double>();
foreach (string line in File.ReadAllLines("inputfile.csv"))
{
foreach (string word in line.Split(',')){
numbers.Add(Double.Parse(word));
//確認用
string[] cols = word.Split(',');
for (int n = 0; n < cols.Length; n++)
MessageBox.Show(cols[n]);
//確認用終了
}
}
//確認用
using (StreamWriter sWriter = new StreamWriter("output.csv", false, Encoding.GetEncoding("Shift_JIS")))
foreach (var s in numbers)
{
sWriter.WriteLine("{0} ", s);
}
//確認用終了
int NDP = 4;
int Input_Unit = 3;
int Output_Unit = 1;
double[,] XData = new double[NDP, Input_Unit];
double[,] YData = new double[NDP, Output_Unit];
int line_count = 4;
int col_count = 4;
// 2次元配列の定義
double[,] InData = new double[line_count, col_count];
int a = 0, b = 0;
foreach (string line in File.ReadAllLines("inputfile.csv"))
{
foreach (string word in line.Split(','))
{
InData[a, b] = Convert.ToDouble(word);
b++;
}
//確認用
using (StreamWriter sWriter2 = new StreamWriter("output2.csv", false, Encoding.GetEncoding("Shift_JIS")))
foreach (var t in InData)
{
sWriter2.WriteLine("{0} ", t);
}
//確認用終了
for (int i = 0; i < NDP; i++)
{
for (int j = 0; j < Input_Unit; j++)
{
XData[i, j] = InData[i, j];
}
using (StreamWriter sWriter3 = new StreamWriter("outputX.csv", false, Encoding.GetEncoding("Shift_JIS")))
foreach (var t in XData)
{
sWriter3.WriteLine("{0} ", t);
}
int jb = Input_Unit;
for (int j7 = 0; j7 < Output_Unit; j7++)
{
YData[i, j7] = InData[i, jb + j7];
using (StreamWriter sWriter4 = new StreamWriter("outputY.csv", false, Encoding.GetEncoding("Shift_JIS")))
foreach (var t in YData)
{
sWriter4.WriteLine("{0} ", t);
}
trainData.Add(new NData(new List<double>() { XData[i, j] }, new List<double>() { YData[i, j7] }));
}
}
b = 0;
a++;
}
}
} else {
trainData = trainer.NData;
}
if(trainData.Count > 0){
Run(trainData);
}
}
|