//Разбитие исходной выборки в корреляционную таблицу private void btnSeparate_Click_1(object sender, EventArgs e) { double bx, by; double?start_x = null, start_y = null; try { bx = double.Parse(txtBx.Text); by = double.Parse(txtBy.Text); if (txtStartX.Text.Length > 0) { start_x = double.Parse(txtStartX.Text); } if (txtStartY.Text.Length > 0) { start_y = double.Parse(txtStartY.Text); } } catch (FormatException) { MessageBox.Show("Некорректный формат значений", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } cor_table = new CorrelationTable(data.ToList(), bx, by, start_x, start_y); make_creation_table(cor_table); cortable_exists = true; setup_gui(); }
//Открытие корреляционной таблицы из файла private void menuOpenCorrelationTable_Click(object sender, EventArgs e) { var dlg = new OpenFileDialog(); //dlg.Filter = "*.csv|Таблица CSV"; if (dlg.ShowDialog() != DialogResult.OK) { return; } reset_all(); try { cor_table = CsvParser.ReadCorrelationTable(dlg.FileName); } catch (Exception exp) { MessageBox.Show(exp.Message, "Ошибка при чтении корреляционной таблицы", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } make_creation_table(cor_table); cortable_exists = true; setup_gui(); }
//Расчет других странных сумм double get_NijUiVj(CorrelationTable table, int[] Ni, double[] Ui, int[] Nj, double[] Vj) { double sum1 = 0; for (int x = 0; x < table.Width; x++) { for (int y = 0; y < table.Height; y++) { sum1 += table[x, y] * Ui[x] * Vj[y]; //??? } } return(sum1); }
///////////////////////////////////////////////////////////////////////////// //Находит число элементов int get_n(CorrelationTable table) { int sum = 0; for (int i = 0; i < table.Width; i++) { for (int j = 0; j < table.Height; j++) { sum += table[i, j]; } } return(sum); }
int[] get_Ni(CorrelationTable table) { var ni = new int[table.Width]; for (int x = 0; x < table.Width; x++) { int sum = 0; for (int y = 0; y < table.Height; y++) { sum += table[x, y]; } ni[x] = sum; } return(ni); }
//Создание корреляционной таблицы заданного размера private void btnCreate_Click_1(object sender, EventArgs e) { if ((cortable_exists || cortable_empty_exists) && (MessageBox.Show("Создать новую таблицу? Это удалит текущие данные.", "Создание корреляционной таблицы", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)) { return; } reset_all(); int n_x = (int)numCreateCols.Value; int n_y = (int)numCreateRows.Value; cor_table = new CorrelationTable(n_x, n_y); make_creation_table(cor_table); cortable_empty_exists = true; setup_gui(); }
public CorrelationCalc(CorrelationTable table) { this.Table = table; N = get_n(table); Ni = get_Ni(table); Nj = get_Nj(table); var dxdy = get_DxDy(table); Dx = dxdy.X; Dy = dxdy.Y; Ui = get_ui(table, Dx); Vj = get_vj(table, Dy); NiUi = get_NiUi(table.Width, Ni, Ui); NjVj = get_NiUi(table.Height, Nj, Vj); NiUi2 = get_NiUi(table.Width, Ni, Ui.Select(x => x * x).ToArray()); NjVj2 = get_NiUi(table.Height, Nj, Vj.Select(x => x * x).ToArray()); Qu = NiUi2 - NiUi * NiUi / N; Qv = NjVj2 - NjVj * NjVj / N; NijUiVj = get_NijUiVj(table, Ni, Ui, Nj, Vj); Quv = NijUiVj - NiUi * NjVj / N;; //Расчет среднего X = table.Bx * NiUi / N + Dx; Y = table.By * NjVj / N + Dy; //Расчет дисперсии Sx = table.Bx * table.Bx * Qu / (N - 1); Sy = table.By * table.By * Qv / (N - 1); //Расчет коэффициента корреляции: R = Quv / Math.Sqrt(Qu * Qv); //Расчет коээфициентов линейной регрессии B1 = table.By / table.Bx * Quv / Qu; B1_ = table.Bx / table.By * Quv / Qv; B0 = Y - B1 * X; B0_ = X - B1_ * Y; }
//Находимт среднее наиболее часто встречающегося интервала PointD get_DxDy(CorrelationTable table) { //Находим наибллее часто встреч. int max = 0, max_x = 0, max_y = 0; for (int i = 0; i < table.Width; i++) { for (int j = 0; j < table.Height; j++) { if (table[i, j] > max) { max = table[i, j]; max_x = i; max_y = j; } } } return(new PointD(table.GetX(max_x).Middle, table.GetY(max_y).Middle)); }
/////////////////////////////////////////////////////////////////////////////////////// /// СОЗДАНИЕ, ОТКРЫТИЕ, ВВОД КОРРЕЛЯЦИОННОЙ ТАБЛИЦЫ /////////////////////////////////////////////////////////////////////////////////////// //Очищает все таблицы и прочее private void reset_all() { gridCorrelationInput.Rows.Clear(); gridCorrelationInput.Columns.Clear(); data = new BindingList <PointD>(); data.AllowEdit = false;; data.AllowNew = false; data.AllowRemove = false; gridData.DataSource = data; cor_table = null; cor_calc = null; txtX.Text = ""; txtY.Text = ""; txtSx.Text = ""; txtSy.Text = ""; txtR.Text = ""; gui_flags_set(false); setup_gui(); }
double[] get_vj(CorrelationTable table, double dy) { return(table.YHeaders.Select(y => (y.Middle - dy) / table.By).ToArray()); }
//Находим странные Ui, Vj double[] get_ui(CorrelationTable table, double dx) { return(table.XHeaders.Select(x => (x.Middle - dx) / table.Bx).ToArray()); }
/////////////////////////////////////////////////////////////////////////////////////// /// ТАБЛИЧНЫЙ ГРАФОН /////////////////////////////////////////////////////////////////////////////////////// //Создание таблицы для ручного ввода корреляционной таблицы //Или отображение уже готовй таблицы //MVC плачет кровавыми слезами private void make_creation_table(CorrelationTable table) { gridCorrelationInput.Rows.Clear(); gridCorrelationInput.Columns.Clear(); //int cell_size = 40; var templ_row = new DataGridViewRow(); var gray_style = new DataGridViewCellStyle(); var normal_style = new DataGridViewCellStyle(); gray_style.BackColor = Color.LightGray; gray_style.Alignment = DataGridViewContentAlignment.MiddleCenter; normal_style.Alignment = DataGridViewContentAlignment.MiddleCenter; //Создаем столбцы //Левый столбец - гранцы интервалов по У templ_row.Cells.Add(new DataGridViewTextBoxCell()); gridCorrelationInput.Columns.Add("WTF".ToString(), ""); //Остальные столбцы for (int i = 0; i < table.Width; i++) { templ_row.Cells.Add(new DataGridViewTextBoxCell()); gridCorrelationInput.Columns.Add("C" + i.ToString(), ""); //gridCorrelationInput.Columns[i + 1].Width = cell_size; } //Заполняем таблицу //Первая строка gridCorrelationInput.Rows.Add(); foreach (DataGridViewTextBoxCell c in gridCorrelationInput.Rows[0].Cells) { c.Style = gray_style; } gridCorrelationInput[0, 0].Value = "Y\\X"; gridCorrelationInput[0, 0].ReadOnly = true; for (int x = 0; x < table.Width; x++) { gridCorrelationInput[x + 1, 0].Value = table.XHeaders[x]; } //Остальные строки for (int y = 0; y < table.Height; y++) { gridCorrelationInput.Rows.Add(); //gridCorrelationInput.Rows[y + 1].Height = cell_size; gridCorrelationInput[0, y + 1].Value = table.YHeaders[y]; gridCorrelationInput[0, y + 1].Style = gray_style; for (int x = 0; x < table.Width; x++) { gridCorrelationInput[x + 1, y + 1].Style = normal_style; gridCorrelationInput[x + 1, y + 1].Value = table[x, y].ToString(); } } //Переход на вкладку с таблией }