powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Помогите плиз определить величину достоверности для экспонцианальной аппроксимации
13 сообщений из 13, страница 1 из 1
Помогите плиз определить величину достоверности для экспонцианальной аппроксимации
    #39787865
bumbox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!

Уважаемые форумчане подскажите плиз.
Строю два графика параллельно в Excel и C#.
Коэффициенты a и b совпали!
R2 определить не получается.
R2 рассчитываю по формуле тынц .

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
            // расчет коэффициента а
            double log_a = (sumLogYArr * sumSquareXArr - sumLogYArr_XArr * sumXArr) / (N * sumSquareXArr - sumXArr * sumXArr);
            a = Math.Exp(log_a);

            // расчет коэффициента b
            b = (N * sumLogYArr_XArr - sumLogYArr * sumXArr) / (N * sumSquareXArr - sumXArr * sumXArr);

            //++++++++++++++++++++++++++++++++++++++++++++++++++++++
            // расчет коэффициента достоверности
            //++++++++++++++++++++++++++++++++++++++++++++++++++++++
            // значения, полученные через функцию апроксимации
            double[] Fi = new double[N];
            for (int i = 0; i < N; i++)
            {
                Fi[i] = a * Math.Exp(XArr[i] * b);
            }

            // Среднее значение по фактам
            double avgYArr = YArr.Average();

            // расчет числителя и знаменателя коэффициента достоверности
            double SSres = 0;
            double SStot = 0;
            for (int i = 0; i < N; i++)
            {
                SSres += (YArr[i] - Fi[i]) * (YArr[i] - Fi[i]);
                SStot += (YArr[i] - avgYArr) * (YArr[i] - avgYArr);
            }

            // расчет коэффициента достоверности
            R2 = 1 - (SSres / SStot);
...
Рейтинг: 0 / 0
Помогите плиз определить величину достоверности для экспонцианальной аппроксимации
    #39787867
bumbox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забыл написать, что рассчитываю формулу линии тренда.
И соответственно величину достоверности.
...
Рейтинг: 0 / 0
Помогите плиз определить величину достоверности для экспонцианальной аппроксимации
    #39787882
bumbox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня не очень с английским, но ТУТ вроде все то же самое.
...
Рейтинг: 0 / 0
Помогите плиз определить величину достоверности для экспонцианальной аппроксимации
    #39787896
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кто на форуме последний юзал хрустальный шар? Выкатывайте давайте обратно - очень нужен.
...
Рейтинг: 0 / 0
Помогите плиз определить величину достоверности для экспонцианальной аппроксимации
    #39787914
bumbox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_subКто на форуме последний юзал хрустальный шар? Выкатывайте давайте обратно - очень нужен.

Да! Действительно где он?
...
Рейтинг: 0 / 0
Помогите плиз определить величину достоверности для экспонцианальной аппроксимации
    #39788152
bumbox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну помогите плиз, сам не вижу ошибку.
Неужели никто найдет эту багу?
...
Рейтинг: 0 / 0
Помогите плиз определить величину достоверности для экспонцианальной аппроксимации
    #39788241
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bumboxНу помогите плиз, сам не вижу ошибку.
Неужели никто найдет эту багу?Ага, я вам кинул какой-то кусок кода и какую-то ссылку - ищите, вспоминайте математику, проанализируйте мой код, найдите мне ошибку, я же не вводных данных не дам, ни описание ожидаемого и реального результата, ни даже рабочего примера, который можно было бы запустить и проверить - буду сидеть на попе ровно и ждать волшебника в голубом вертолете.

Ну сиди дальше, чо....
...
Рейтинг: 0 / 0
Помогите плиз определить величину достоверности для экспонцианальной аппроксимации
    #39788275
bumbox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProbumboxНу помогите плиз, сам не вижу ошибку.
Неужели никто найдет эту багу?Ага, я вам кинул какой-то кусок кода и какую-то ссылку - ищите, вспоминайте математику, проанализируйте мой код, найдите мне ошибку, я же не вводных данных не дам, ни описание ожидаемого и реального результата, ни даже рабочего примера, который можно было бы запустить и проверить - буду сидеть на попе ровно и ждать волшебника в голубом вертолете.

Ну сиди дальше, чо....

Не обязательно язвить, я человек понятливый.
Повторюсь, коэффициенты a и b совпали.
Рабочий пример:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
                double[] XArr = new double[19];
                double[] YArr = new double[19];

                // для форума данные, потом удалить
                YArr = new double[19] { 79, 209.67, 1026.71, 2161.7, 1192.74, 1128.06, 450.31, 169.13, 606.38, 763.49, 210.5, 309.34, 404.25, 1462.95, 797.18, 1540.24, 440.09, 352.22, 120.83 };
                XArr = new double[19] { 1.19, 1.79, 4.35, 4.94, 4.05, 4.74, 4.16, 1.7, 4.3, 3.02, 2.29, 2.76, 3.45, 3.58, 3.96, 3.11, 2.03, 2.67, 2.13 };

                //Пример заполнения ячеек
                KeyValuePair<int, int> keyValue;
                int countRows = 0;
                double valueX = 0;
                double valueY = 0;
                for (int j = 1; j < 20; j++)
                {
                    try
                    {
                        countRows++;
                        // keyValue = new KeyValuePair<int, int>(j, 3);
                        // valueX = Math.Round(Convert.ToDouble(dictionary[keyValue]), 2);
                        valueX = XArr[j - 1];
                        worksheet.Cells[j, 1].Value = valueX;
                        // keyValue = new KeyValuePair<int, int>(j, 4);
                        // valueY = Math.Round(Convert.ToDouble(dictionary[keyValue]), 2);
                        valueY = YArr[j - 1];
                        worksheet.Cells[j, 2].Value = valueY;

                        XArr[j - 1] = valueY;
                        YArr[j - 1] = valueX;
                    }
                    catch(KeyNotFoundException ex)
                    {
                        // кидаем в консоль
                        Console.WriteLine(ex);
                    }
                }

                Approximation approxim = new Approximation();
                approxim.XArr = XArr;
                approxim.YArr = YArr;
                approxim.Exponential();



Class Approximation:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace kern.Models
{
    public class Approximation
    {
        public double[] XArr { get; set; }

        public double[] YArr { get; set; }

        public double a { get; set; }
        public double b { get; set; }
        public double R2 { get; set; }

        // Экспоненциальная аппроксимация 
        public void Exponential()
        {
            // проверки
            PersonException();

            //+++++++++++++++++++++++++++++++++++++++++++
            // расчеты для нахождения a и b
            //+++++++++++++++++++++++++++++++++++++++++++
            // количество элементов в множествах
            int N = XArr.Length;
            // сумма логарифмов YArr
            double sumLogYArr = 0;
            // сумма квадратов XArr
            double sumSquareXArr = 0;
            // сумма логарифмов XArr
            double sumLogXArr = 0;
            // сумма логарифма YArr умноженная на XArr
            double sumLogYArr_XArr = 0;
            // сумма XArr
            double sumXArr = XArr.Sum();

            // заполнение промежуточных данных
            for (int i = 0; i < N; i++)
            {
                sumLogYArr += Math.Log(YArr[i]);
                sumSquareXArr += XArr[i] * XArr[i];
                sumLogXArr += Math.Log(XArr[i]);
                sumLogYArr_XArr += Math.Log(YArr[i]) * XArr[i];
            }

            // расчет коэффициента а
            double log_a = (sumLogYArr * sumSquareXArr - sumLogYArr_XArr * sumXArr) / (N * sumSquareXArr - sumXArr * sumXArr);
            a = Math.Exp(log_a);

            // расчет коэффициента b
            b = (N * sumLogYArr_XArr - sumLogYArr * sumXArr) / (N * sumSquareXArr - sumXArr * sumXArr);

            //++++++++++++++++++++++++++++++++++++++++++++++++++++++
            // расчет коэффициента достоверности
            //++++++++++++++++++++++++++++++++++++++++++++++++++++++
            // значения, полученные через функцию апроксимации
            double[] Fi = new double[N];
            for (int i = 0; i < N; i++)
            {
                Fi[i] = a * Math.Exp(XArr[i] * b);
            }

            // Среднее значение по фактам
            double avgYArr = YArr.Average();

            // расчет числителя и знаменателя коэффициента достоверности
            double SSres = 0;
            double SStot = 0;
            for (int i = 0; i < N; i++)
            {
                SSres += (YArr[i] - Fi[i]) * (YArr[i] - Fi[i]);
                SStot += (YArr[i] - avgYArr) * (YArr[i] - avgYArr);
            }

            // расчет коэффициента достоверности
            R2 = 1 - (SSres / SStot);
        }

        private void PersonException()
        {
            if (XArr.Length != YArr.Length)
            {
                throw new Exception("Количество элементов в множествах X и Y должно быть одинаковым");
            }

            if (XArr.Length < 2 || YArr.Length < 2)
            {
                throw new Exception("Количество элементов в множествах X и Y должно быть больше одного");
            }
        }

    }
}

...
Рейтинг: 0 / 0
Помогите плиз определить величину достоверности для экспонцианальной аппроксимации
    #39788423
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bumboxУ меня не очень с английским, но ТУТ вроде все то же самое.
"there are two different definitions of R2 and apparently Excel mixes both!" - "есть два определения для R2 и вероятно Excel смешивает/сочетает оба" (там же есть ссылка на формулы - https://stats.stackexchange.com/questions/164586/what-is-the-upper-bound-on-r2-not-1/164702#164702)
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
            // расчет числителя и знаменателя коэффициента достоверности
            double SSres = 0;
            double SStot = 0;
            double RSS = 0;
            double ESS = 0;
            double term3 = 0;
            for (int i = 0; i < N; i++) {
                SSres += (YArr[i] - Fi[i]) * (YArr[i] - Fi[i]);
                SStot += (YArr[i] - avgYArr) * (YArr[i] - avgYArr);
                RSS += (YArr[i] - Fi[i]) * (YArr[i] - Fi[i]);
                ESS += (Fi[i] - avgYArr) * (Fi[i] - avgYArr);
                term3 += 2 * (YArr[i] - Fi[i]) * (Fi[i] - avgYArr);
            }
            // расчет коэффициента достоверности
            R2 = 1 - (SSres / SStot);
            var TSS = RSS + ESS;
            R2wi = 1 - ESS/ TSS; // model with an intercept
            R2woi = 1 - (ESS + term3) / (TSS + term3); // model without an intercept
...
        System.Diagnostics.Debug.WriteLine($"R2={approxim.R2}; R2wi={approxim.R2wi}; R2woi={approxim.R2woi}");
---------------
R2=0,395219350352075; R2wi=0,439651038137973; R2woi=0,604780649647925

получается, R2wi "ближе" всего к эксельному результату...
...
Рейтинг: 0 / 0
Помогите плиз определить величину достоверности для экспонцианальной аппроксимации
    #39788441
bumbox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LR,

Понял, спасибо большое!
...
Рейтинг: 0 / 0
Помогите плиз определить величину достоверности для экспонцианальной аппроксимации
    #39788463
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bumbox,

еще на на разницу в результатах могут влиять различия в правилах округления эеселя и дотнет (например, в экселе невозможно ввести значение с более чем 15 знаков после запятой, х.з., возможно и в матвычислениях там есть какие-нить "обрезания").
...
Рейтинг: 0 / 0
Помогите плиз определить величину достоверности для экспонцианальной аппроксимации
    #39788751
bumbox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRbumbox,

еще на на разницу в результатах могут влиять различия в правилах округления эеселя и дотнет (например, в экселе невозможно ввести значение с более чем 15 знаков после запятой, х.з., возможно и в матвычислениях там есть какие-нить "обрезания").

К сожалению ни одна не совпадает, даже близко.
Буду искать.
...
Рейтинг: 0 / 0
Помогите плиз определить величину достоверности для экспонцианальной аппроксимации
    #39788862
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bumboxК сожалению ни одна не совпадает, даже близко.
Буду искать.
Похоже, и не должна совпадать
Справка и обучение по Excel Добавление тренда или линии среднего значения к диаграмме
Величина достоверности аппроксимации

Построение линии тренда с указанием на диаграмме величина достоверности аппроксимации, вычисляемой по следующей формуле:

(уравнение)

Этот параметр линии тренда располагается на вкладке Параметры диалогового окна Добавление линии тренда или Формат линии тренда.

Примечание: Отображаемая вместе с линией тренда величина достоверности аппроксимации не является скорректированной . Для логарифмической, степенной и экспоненциальной линий тренда в Excel используется видоизмененная модель регрессии .
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Помогите плиз определить величину достоверности для экспонцианальной аппроксимации
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]