Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit
Zdravím, jsem programátor a snažím se sestavit třídu na mnohonásobnou lineární regresi. Mám už kód, na vzorec: y = x1 * a1 + x2 * a2 který funguje naprosto přesně.
Já ale potřebuji, aby to fungovalo na vzorec: y = x1 * a1 + x2 * a2 + B
Nejlíp to vysvětlím na excel ukázce: https://dl.dropboxusercontent.com/u/973 … roblem.png
Můj kód funguje skvěle na případě, že konstanta B není vypočítána, ale já naopak konstantu B potřebuji vypočítat, a tak se ptám: je velký rozdíl ve výpočtu pokud potřebuji konstantu B?
Děkuji za případné rady
Offline
↑ netix:
Ahoj,
konstantu, kterou značíš B, samozřejmě potřebuješ, Tvůj vzorec y = x1 * a1 + x2 * a2 + B totiž není nic jiného než obecná rovnice roviny v prostoru. Ve Tvém problému ale nemáš jen dva nezávislé sloupce x1, x2, ale tři. V tom případě ale musíš hledat lineární funkci ne dvou, ale tří proměnných tvaru y = x1 * a1 + x2 * a2+ x3 * a3+ B. Anebo to chápu špatně?
Offline
↑ martisek:
Těch sloupců může být klidně 50, to není důležité.
Takhle vypadá zatím můj kód: http://pastebin.com/pcCYfXdm
A já ho potřebuji upravit, aby vypočítal nejen promenné A(double[] C;) ale i kosntantu B
Offline

Kolega martisek asi naráží na fakt, že nám ukazujete deterministický model, přitom máte na mysli klasickou regresi s chybovým prvkem.
Moje rada stále platí — první sloupec v X matici budou jedničky a pak normálně
Offline

Ano, platí to obecně.
Pokud nechcete/neumíte použít maticový zápis (váš kód jsem neprocházel), tak prostě nagenerujte první proměnnou s konstantní hodnotou, vždy rovnou jedné. Snad to bude fungovat, nikdy jsem to vaším postupem nezkoušel.
Edit: ten vzorec je vskutku jednoduchý. Jakmile máte matici nezávislých proměnných (x a jedničky jako konstanta) a vektor závislé proměnné (y), tak stačí mít funkci/třídu na maticové násobení a inverzi matic, pak je to hračka. Z toho maticového násobku vám vyjde vektor koeficientů začínající konstantou a pokračující jednotlivými neznámými.
Offline
↑ netix:
V předpisu funkce y = x1 * a1 + x2 * a2 + x3 * a3 + B znáš y; x1; x2; x3 a hledáš a1; a2; a3; B. Takže je třeba sestavit a řešit soustavu



kde n je počet hodnot v jednotlivých sloupcích.
Offline
Ok, děkuji všem za rady, asi nejlepší způsob k pochopení bude jednoduchý příklad, vložíme jen dva řádky dat a počet x bude taktéž 2.
Takže první řádek: x1 = -1; x2 = 1; y1 = 1;
Druhý řádek: x3 = 5; x4 = 2; y2 = 10;
Z těchto dat by ten vzorec mel vypočítat tyhle hodnoty: a1 = 1.5; a2 = 0; b = 2.5
Mohli byste mi z tohoto zadani vypočítat vysledek jen pomoci základni matematiky (+ - * / mocnina odmocnina) a dalších pomocnych promennych
Offline

Pokud jde pouze o funkční kód, netřeba znovu vynalézat kolo.
Hledejte "multiple linear regression C#" nebo "OLS C#". Základní skripty budou dělat inverzi matic, pokročilejší budou aplikovat různé algoritmy pro efektivnější kód.
Kdybyste přeci jen chtěl jednoduché řešení, následující vzorec je na odrazení. Funguje jen a pouze pro dvě vysvětlující proměnné.
Offline
↑ halogan:
Ale probůh - to je metoda nejmenších čtverců !!!!
Offline

↑ martisek:
Metoda momentů, že? Neviděl jsem ji v nich, jak máte nevypsané indexy, pardon. Zmátl mě váš úvod, kde píšete o funkci nebo nutnosti konstanty. Obojí neplatí.
Tak jako tak se nedostane k požadovanému jednoduchému výpočtu. A tak jako tak se dostaneme k maticovému vyjádření.
Offline
To nikdy nemůžu zvládnout, jak říkám, nemám VŠ vzdělání, vůbec těm vzorcům nerozumím. Mám ještě jeden c++ kód, je o hodně jednodušší, ale je to lineární regrese pouze s jedním X.
link: https://github.com/Netix/Multiple-Linea … linreg.cpp
27-36 řádek je pro přidáni dat x, y
38 řádek začíná funkce na spočítáni a, b
Můj problém by vyřešilo, kdyby jsme nějak dali dohromady kód kde budou dvě vstupní X, a ne jen jeden.
Offline
↑ netix:
===============
vložíme jen dva řádky dat a počet x bude taktéž 2.
Takže první řádek: x1 = -1; x2 = 1; y1 = 1;
Druhý řádek: x3 = 5; x4 = 2; y2 = 10;
Z těchto dat by ten vzorec mel vypočítat tyhle hodnoty: a1 = 1.5; a2 = 0; b = 2.5
================
Ze dvou bodů nemůžeš vygenerovat tři parametry, ale jenom dva.
Ještě jednou připomínám soustavu, kterou už jsem napsal:



a pro Tvoje první data https://dl.dropboxusercontent.com/u/973 … roblem.png jsem to přeložil do excelu:
Samozřejmě, že by to bylo jednodušší maticově, jak píše ↑ halogan:, ale to bys asi neprostřelil. Toto by snad jít mohlo. Nevím, jak jinak bych to už napsal.
Offline