Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[VB.NET i ?]regresja liniowa. metoda najm. kw. DZIWNE!

pdlc 27 Paź 2008 23:28 4949 26
  • #1 27 Paź 2008 23:28
    pdlc
    Poziom 10  

    Cześć!

    Napotkałem na dziwny problem mianowicie:
    Map 3 punkty:
    P1 (-8,333,26,000)
    P2 (-8,333,-14,667)
    P3 (-8,333,5,667)

    Wszystkie punkty leżą na prostej prostopadłej do osi X w punkcie (-8,333)

    Napisałem funkcję która liczy metodą najmniejszych kwadratów funkcję liniową na podstawie listy punktów.
    I:
    jak wskaże: P1,P2,P3 to: a=-0,25 b=2.00 (kreska prawie pozioma?????)
    jak wskaże: P1,p3,p2 to: a=0,00 b=4,00 (kreska pozioma na wysokości Y=4)

    DLACZEGO?

    powinna być pionowa w punkcie (-8,333)
    w przypadku punktów "nie pionowych" pokazuje raczej Ok. ????


    Macie jakieś pomysły na odpowiedz???

    0 26
  • #2 28 Paź 2008 11:14
    94075
    Użytkownik usunął konto  
  • #3 28 Paź 2008 17:03
    shg
    Specjalista techniki cyfrowej

    Zadaj sobie pytanie, jaką wartość ma współczynnik 'a' w równaniu prostej o postaci y = a*x + b?

    0
  • #4 28 Paź 2008 17:25
    qrdel
    Poziom 28  

    Napisałeś funkcję na znajdywanie parametrów wielomianu P(x) którego wartości (współrzędna Y) minimalizują sumę kwadratów odchyleń mierzonych po Y, a nie na znajdywanie reprezentacji prostej na płaszczyźnie XY przechodzącej najbliżej podanych punktów.
    Inna sprawa jak to napisałeś, bo moim skromnym zdaniem powinieneś dostać w efekcie "Error! Zero division!".

    0
  • #5 29 Paź 2008 15:20
    pdlc
    Poziom 10  

    CZeść!
    Dzięki wszystkim za zainteresowanie.
    Do obliczeń użyłem wsorów z wikipedii (może błąd)
    Ale odziwo wszelkie poziome proste wykreśla OK jednak z pionowymi jest coś nie tak. Poniżej kawałęk kodu do wyliczenia a i b

    Dim Sx As Double = 0
    Dim Sy As Double = 0
    Dim Sxy As Double = 0
    Dim Sxx As Double = 0
    Dim Syy As Double = 0
    Dim D As Double = 0
    Dim a As Double = 0
    Dim b As Double = 0

    For i = 1 To S
    Sx = Sx + Tablica_punktow_do_wyznaczenia(1, i)
    Sy = Sy + Tablica_punktow_do_wyznaczenia(2, i)
    Sxx = Sxx + (Tablica_punktow_do_wyznaczenia(1, i) ^ 2)
    Sxy = Sxy + (Tablica_punktow_do_wyznaczenia(1, i) * Tablica_punktow_do_wyznaczenia(2, i))
    Syy = Syy + (Tablica_punktow_do_wyznaczenia(2, i) ^ 2)
    Next
    D = S * Sxx - (Sx ^ 2)
    a = (S * Sxy - Sx * Sy) / D
    b = (Sxx * Sy - Sx * Sxy) / D

    gdzie S ilość punktów a Tablica_punktow_do_wyznaczenia(1, i) i Tablica_punktow_do_wyznaczenia(2, i) to tablica z punktami

    Mam pytanie czy dla 2 punktów metoda regresji liniowej tez jest OK tzn czy wyznaczy prostą przechodząca przez dwa punkty tak jak można to zrobić matematycznie?

    Czy tablica pubktów musi być "posortowana" rosnącą np po X?


    Oto przykład 1
    3 punkty leżące w osi

    [VB.NET i ?]regresja liniowa. metoda najm. kw. DZIWNE!
    [img]


    druga fotka:

    prosta L5 (ta zielona) to też te 3 punkty ale w innej kolejności
    Prosta L3 to prosta wyznaczona na podstawie tylko 2 punktów

    [VB.NET i ?]regresja liniowa. metoda najm. kw. DZIWNE!


    Dziwne co?

    Dodano po 24 [minuty]:

    A tak jeśli chodzi o "nie pionowe" punkty:
    [VB.NET i ?]regresja liniowa. metoda najm. kw. DZIWNE!

    0
  • #6 29 Paź 2008 16:56
    qrdel
    Poziom 28  

    Byłoby dobrze gdybyś czytał uważnie.
    Metoda REGRESJI LINIOWEJ polega na tym że:
    1. Najpierw zakładasz że istnieje wielomian Ax+B
    dziedziną A i B są liczby rzeczywiste
    z tego wynika że metoda nie przewiduje pionowych prostych.
    2. Potem prowadzisz rachunki aby znaleźć takie parametry żeby różnice mierzone po Y spełniały warunek minimalnej sumy kwadratów odległości.

    Problem znalezienia prostej na płaszczyźnie której suma kwadratów odległości euklidesowych od tych punktów jest minimalna jest INNYM PROBLEMEM.

    ----- edit -----

    a co do wzorów to gdy seria x(n) jest ciągiem stałym
    to Δ=N•Sxx-(Sx)² powinno być tożsamościowym zerem.
    Czyli wynik nie powinien tak lekko wychodzić ...

    0
  • #7 29 Paź 2008 17:16
    shg
    Specjalista techniki cyfrowej

    pdlc napisał:
    Do obliczeń użyłem wsorów z wikipedii (może błąd)
    Ale odziwo wszelkie poziome proste wykreśla OK jednak z pionowymi jest coś nie tak.

    To nie był błąd.
    Zadanie:
    Podaj wartości współczynników a i b w równaniu o postaci y = a*x + b dla dowolnie wybranej prostej równoległej do osi Y.
    Rozwiązanie tego zadania jest rozwiązaniem Twojego problemu.

    0
  • #8 29 Paź 2008 22:05
    pdlc
    Poziom 10  

    a=0

    ale to nie rozwiązuje mojego problemu :( jak zrobić program który wyznacza prostą na podstawie punktów - A jego szczególnym przypadkiem jest przypadek punktów o tym samym X (prostopadła do osi X)

    A program ma wyznaczyć KAŻDĄ prostą a nie tylko NIE PROSTOPADŁA :(

    Bo to program ma wyznaczyć a nie uzytkownik "uwazac" czy przypadkiem nie jest "prostopadła....

    0
  • #9 29 Paź 2008 22:40
    shg
    Specjalista techniki cyfrowej

    pdlc napisał:
    a=0

    A nieprawda! Ta jest równoległa do osi X.

    W takim razie chyba muszę napisać to wprost.

    Proste równoległe do osi Y nie mogą zostać przedstawione za pomocą równania o postaci y = a * x + b. Im bardziej pionowa prosta, tym a bliższe nieskończoności.
    Problemem jest postać tego równania, która uniemożliwia przedstawienie prostych równoległych do osi Y.

    pdlc napisał:
    A program ma wyznaczyć KAŻDĄ prostą a nie tylko NIE PROSTOPADŁA :(

    A znasz jakiś inny program, który potrafi wykonać obliczenia dla punktów leżących na prostej równoległej do osi Y?

    pdlc napisał:
    Bo to program ma wyznaczyć a nie uzytkownik "uwazac" czy przypadkiem nie jest "prostopadła....

    Jeżeli ma liczyć regresję liniową na podstawie wyników pomiarów, to nigdy do takiej sytuacji dojść nie powinno, albo osoba wykonująca pomiary i obliczenia nie ma pojęcia, co robi.

    0
  • #10 29 Paź 2008 22:59
    pdlc
    Poziom 10  

    Masz rację mój błąd Ax+By+C=0 - prostopadła do osi Y wtedy gdy B=0
    OK

    Więc prosze o pomoc...

    Tak naprawdę to nie chodzi mi o "pomiary" rozumiane jak na laborkach..
    Zadanie polega na wyznaczeniu prostej na podstawie punktów opisanych współrzędnymi XiY.

    W przypadku 2-ch punktów to nie ma problemu (równanie prostej przechodzące przez dwa punkty) i koniec!

    Ale problem w założeniach może dopuszczać podanie kilku punktów - wyznacyć prostą i podać błąd (np odchylenie standardowe )

    Jedynie co mi przyszło do głowy to regresja liniowa. Może błędnie


    Zadanie polega na wyznaczeniu prostej na podstawie 3-ch punktów. :(

    0
  • #11 30 Paź 2008 00:40
    shg
    Specjalista techniki cyfrowej

    To już znacząco zmienia postać rzeczy.
    Te trzy punkty (i więcej) to trochę problem.
    Jedyne co mi do głowy przychodzi to jakiś algorytm optymalizacji, który dopasowałby współczynniki A, B i C równania o postaci Ax + By + C = 0
    Z racji dowolności umiejscowienia punktów na płaszczyźnie algorytm powinien minimalizować sumę kwadratów odległości punktów od prostej.
    Czyli do zminimalizowania jest coś takiego (dla punktów o współrzędnych (x_i, y_i):
    $$\sum_{i=0}^{n}{\left( \frac{Ax_i + B_y_i + C} {\sqrt{A^2+B^2}}\right)^2}$$
    Nie wiem, który algorytm byłby tu najodpowiedniejszy.

    0
  • #12 30 Paź 2008 21:07
    pdlc
    Poziom 10  

    shg - A jak to obliczyć?

    Masz może jakiś namiar na www gdzie rozważane są takie problemy?

    A co powiesz np o:
    Skoro regresja liniowa "dość dobrze" dopasowuje prostą ale w przedziale 0-45° to może kazać wykrywać jak się rozkładają te punkty i jeśli są badziej "pionowe" niż "poziome" to "odwrócić" do celów wyliczeniowych te punkty (zmienić x z y) a po obliczeniach z powrotem ....

    0
  • #13 30 Paź 2008 21:31
    qrdel
    Poziom 28  

    O tym że regresja nie jest metodą optymalną w Twoich celach najlepiej świadczy to że nie jest jednoznaczna.
    Wybierz sobie dla przykładu kilka punktów mniej więcej w pobliżu wykresu y=ax.
    Policz regresję dla nich, oraz regresję po zamianie zmiennych X<>Y (i z powrotem); wyniki wyjdą różne.
    Być może nawet dla pewnych układów punktów jednoznaczne optymalne rozwiązanie nie istnieje.

    A szkic metody rozwiązania (niestety znowu mi wcięło "Geometrię analityczną" a za dużo myślenia może być szkodliwe) może być taki.

    1. Wybierz sposób opisu prostej na płaszczyźnie, y=ax+b nie jest dobre bo np. nie opisuje pionowych. Istnieje "kanoniczne równanie" opisujące prostą (nie pamiętam dokładnie, ma 3 parametry i jedną prostą można zapisać na kilka sposobów).
    [wzór na prostą to jak pamiętam ax+bx+c=0 z warunkiem a×b≠0, kanoniczny chyba dodawał warunki]
    2. Określ/znajdź wzór na odległość punktu od prostej.
    3. Napisz wzór na sumę kwadratów odległości serii (Xi,Yi) od prostej.
    4. Dla znalezienia minimum powyższej funkcji zróżniczkuj ją cząstkowo po parametrach równania prostej (trzech o ile pamiętam).
    5. Przyrównując pochodne cząstkowe do zera (warunek ekstremum) uzyskujesz układ 3 równań do rozwiązania.
    6. Rozwiązanie to współczynniki prostej szukanej (przynajmniej niektóre rozwiązania, jeśli wystąpią lokalne maksima). Czy da się rozwiązać analitycznie, czy tylko przybliżać numerycznie rozwiązania - nie wiem tak z marszu; sprawdź sam.

    0
  • #14 30 Paź 2008 22:45
    pdlc
    Poziom 10  

    LUDZIE jestem programistą nie MATEMATYKIEM! ;-D

    Regresję znam bo korzystałem na laborkach... pisałem nawet dla własnych celów programiki do wyliczeń - mając taki problem teraz pomyślałem że to się nada ..

    A to co napisał qrdel to MAGIA.

    Czy ktoś może spotkał się gdzieś w necie na metodę wyznaczania prostej na podstawie kilku punktów (które w założeniu będą leżeć na prostej - nieliniowość bardzo mała aczkolwiek ma być policzona - nie będzie to chmura punktów tylko linia punktowa)?

    0
  • #15 31 Paź 2008 15:26
    shg
    Specjalista techniki cyfrowej

    pdlc napisał:
    LUDZIE jestem programistą nie MATEMATYKIEM! ;-D

    Poza nielicznymi przypadkami programowanie sprowadza się do ubrania matematyki w interfejs użytkownika.

    pdlc napisał:
    A to co napisał qrdel to MAGIA.

    Eeee tam.
    Pierwsze trzy punkty masz załatwione w moim poście, jest równanie ogólne i równanie sumy kwadratów odległości punktów od prostej (w równaniu odległości punktu od prostej licznik tego ułamka jest w wartości bezwzględnej, tutaj pominąłem ze względu na kwadrat, w sumie to i pierwiastek z mianownika można było wywalić).

    Załatwienie dalszej części w sposób analityczny jest już niestety bardziej skomplikowane.

    pdlc napisał:
    Czy ktoś może spotkał się gdzieś w necie na metodę wyznaczania prostej na podstawie kilku punktów (które w założeniu będą leżeć na prostej - nieliniowość bardzo mała aczkolwiek ma być policzona - nie będzie to chmura punktów tylko linia punktowa)?

    Nieważne, jak mało oddalone będą te punkty, albo jednoznaczne określenie prostej na podstawie dwóch punktów, albo metoda taka jak opisana tutaj.

    Gotowiec w programie scilab:
    Code:
    clear;
    
    X = [-8.333; -8.333; -8.333];
    Y = [26.000; -14.667; 5.667];

    //X = [1; 2; 3];
    //Y = [2; 2; 2];

    // taki przypadek szczególny, bo nie istnieje dla niego jednoznaczne rozwiązanie
    //X = [2; 2; 2];
    //Y = [2; 2; 2];

    //X = [1; 2; 3];
    //Y = [-1; -2; -3];

    // Odległość punktu (X, Y) od prostej L
    // Tutaj X i Y są wektorami, w związku z czym również zwracana odległość jest wektorem,
    // a ten wektor, to po prostu odległości każdego punktu z osobna.
    function d = dist(L, m)
      A = L(1); B = L(2); C = L(3);
      d = abs(A*X + B*Y + C) / sqrt(A*A + B*B);
    endfunction

    // Wartości początkowe (ten wektor [1; 1; 1]) A i B muszą być rożne od 0, C obojętnie, ale też dałem 1.
    [ABC, v, info]=lsqrsolve([1; 1; 1], dist, size(X, 1));

    // Żeby ładniej wyglądało, wszystko zostanie podzielone tak,
    // żeby w pierwszej kolejności przy y stał współczynnik równy 1,
    // chyba że stosunek A/B jest bardzo duży (>1000000) (prosta prawie równoległa do osi Y,
    // niezerowa wartość B wynikająca z niedokładności obliczeń), wtedy jak nizej
    // Jeżeli to niemożliwe (prosta równoległa do osi Y),
    // to współczynnik 1 będzie przy X
    if ABC(2) <> 0 then
      if(ABC(1) / ABC(2) > 1e6) then
        ABC = ABC / ABC(1);
      else
        ABC = ABC / ABC(2);
      end
    else
      ABC = ABC / ABC(1);
    end

    // wynik
    ABC

    // Przyczyna zakończenia pracy
    select info
      case 0 then
        disp('Błędne parametry wejściowe.');
      case 1 then
        disp('Osiągnięto limit tolerancji błędu.');
      case 2 then
        disp('Osiągnięto limit ilości wywołań funkcji');
      case 3 then
        print('Zbyt mała wartość tolerancji, nie można osiągnąć lepszego przybliżenia.');
      case 4 then
        print('Kolejne iteracjie nie poprawiają wyniku.');
    end


    W sieci znaleźć możesz gotowe funkcje optymalizacji globalnej. Tutaj użyty został algorytm Levenberga-Marquardta. Minimalizowana jest suma wszystkich elementów wektora odległości podniesionych do kwadratu (funkcja lsqrsolve()).
    Ta część poprawiająca czytelność wyniku jest niepotrzebna, jeżeli wynik ma być użyty tylko do dalszych obliczeń, czy narysowania prostej.

    0
  • #16 31 Paź 2008 16:28
    qrdel
    Poziom 28  

    Cytat:
    LUDZIE jestem programistą nie MATEMATYKIEM! ;-D

    Wybacz, ale taką odpowiedzią strasznie się kompromitujesz.
    To kim według Ciebie jest programista, i na czym się zna?
    Byli kiedyś tacy fachowcy którzy np. przepisywali program z ręcznie zapisanych kartek (ale ze specjalnymi kratkami) na karty perforowane strawne dla komputera. Ale chyba nie nazywano ich programistami.
    Zobacz "Perełki oprogramowania", Bentley Jon i "Więcej perełek oprogramowania". Już na okładce masz napisane ile i jakich dziedzin może poznać programista jeśli nie chce zostać tylko wklepywaczem.
    Właśnie programisty zadaniem jest: zrozumienie ogólne cudzego problemu, ubranie go w model matematyczny, dobranie matematycznych metod rozwiązania, skorygowanie metody pod względem rozwiązywania numerycznego i na końcu zakodowanie, uruchomienie i przetestowanie produktu.
    Ty próbujesz się ograniczać do samego kodowania.
    Tylko że wtedy potrzebujesz drugiego fachowca - powiedzmy "analityka systemowego" który wykona resztę zadania. Tylko że on zwykle nie będzie potrzebował kodera, bo zrobi to sam, lewą nogą.

    Co do problemu to po pierwsze musisz się zastanowić czy potrzebujesz rozwiązania absolutnie ścisłego czy tylko wystarczaczająco dokładnego.
    Bardzo istotna jest też specyfikacja problemu. Tu chodzi o kryterium bliskości prostej do zbioru punktów - czy koniecznie suma kwadratów, a może suma modułów, a może jakieś średnie ważone - mnogość pomysłów.
    Metod rozwiązania mógłbyś testować wiele, ale przy absolutnej nieznajomości matematyki się nie da.
    Dla zachęcenia jednak do przyszłych studiów naszkkicuję parę lekko odlotowych pomysłów:
    1. Regresję da się uruchomić dla pary punktów, da wtedy wynik dokładny (oczywiście poza x1=x2, ale wtedy można zamienić zmienne i problem będzie tylko gdy (x1,y1)=(x2,y2))
    Policzyć regresję dla wszystkich par punktów a potem
    - jakoś "uśrednić" wyniki
    - wylosować/wyselekcjonować najpopularniejszy, najbardziej zbliżony do innych wynik
    2. Wydaje się, że nieźle żeby prosta przechodziła przez środek ciężkości układu punktów X0=∑x1/N, Y0=∑yi/N.
    Pozostaje dopasowanie jednej zmiennej.
    - policzyć współczynniki kierunkowe prostych między X0,Y0 i każdym z punktów zbioru po czym
    - - uśrednić
    - - uśrednić z wagami równymi odległości xi,yi od X0,Y0
    3. (od czapy, ale krócej się myśli) podzielić zbiór na dwa podzbiory z grubsza równoliczne - połowa z mniejszymi X-ami i połowa z większymi X-ami, znaleźć środki ciężkości obu podzbiorów i poprowadzić przez nie prostą. Wcześniej sprawdzić czy podział na większe i mniejsze Y-ki nie jest lepszy. Lepszy jest ten podział który daje większą odległość środków ciężkości podzbiorów.

    Ale problem jest stale w sformułowaniu samego problemu.
    Bo jakie powinno być "optymalne" rozwiązanie dla zbioru {(-1,-1), (-1,1), (1,-1), (1,1)} ?

    shg sorry, nieuważnie czytałem Twój post, rzeczywiście przedstawiłeś większość moich wywodów.

    0
  • #17 31 Paź 2008 21:52
    pdlc
    Poziom 10  

    Hmm..

    Nie tak do końca...

    qrdel i shg - nie chcę polemizować z waszym zdaniem na temat MATEMATYKO-PROGRAMISTÓW (Gdyby tak było to każdy matematyk byłby programistą - qrdel a tak nie jest) Powiem tylko tyle: studiów nie skończyłem bo oblałem całki - czy to mnie dyskwalifikuje żeby "bawić" się programowaniem - moim zdaniem nie.

    Dzięki za podpowiedzi - zaraz zaczynam nad nimi myśleć - jak by co to będę pytał ;D

    Jeszcze raz dzięki


    I już pytanko:
    (qrdel ) Czy środek ciężkości dla tej grupy punktów liczyć tak samo jak np dla Δ? czyli:

    (X1+X2+...+Xn)/n
    (Y1+Y2+...+Yn)/n

    ?

    Dodano po 47 [minuty]:

    shg: pytanie o twój kod:

    // Odległość punktu (X, Y) od prostej L

    L- co to za prosta? (przecież szukam jej)

    function d = dist(L, m)
    A = L(1); B = L(2); C = L(3);
    d = abs(A*X + B*Y + C) / sqrt(A*A + B*B);
    endfunction

    // Wartości początkowe (ten wektor [1; 1; 1]) A i B muszą być rożne od 0, C obojętnie, ale też dałem 1.
    [ABC, v, info]=lsqrsolve([1; 1; 1], dist, size(X, 1));

    tego kompletnie nie rozumiem (A=L(1))
    Nie znam składni tego Scilaba...

    Skąd wziąć tą prostą L?

    0
  • #18 31 Paź 2008 22:36
    shg
    Specjalista techniki cyfrowej

    L jest wektorem (można się do niego dobrać jak do tablicy), czyli pierwszy element to L(1) (nie zero!), drugi to L(2) itd.
    Wartość wektora L, czyli współczynniki A, B i C równania prostej jest przybliżana jest za pomocą funkcji lsqrsolve(), zaczyna się od wartości początkowej (tu: [1; 1; 1]). Potem następuje seria modyfikacji współczynników tej prostej, wykonywana przez algorytm i za każdym razem zdefiniowana wcześniej funkcja (dist()) używana jest do obliczenia odległości punktów od prostej, której współczynniki równania zostały właśnie wygenerowane.

    Algorytm działa tak, że liczy przybliżenie pochodnych (jakobian) powodując nieznaczne "przesunięcie" wektora L w przestrzeni (po wszystkich wymiarach) i licząc różnicę minimalizowanej funkcji po i przed takim przesunięciem.
    Wyobraź to sobie jak wchodzenie pod górę z zamkniętymi oczami. Najpierw stoisz w miejscu, robisz krok w każdą stronę i już wiesz w którą stronę trzeba iść, aby dotrzeć do szczytu. tutaj jest tak, że warunek ten sprawdzany jest po każdym kroku, dla funkcji liniowych można to łatwo załatwić tak jak napisał qrdel, za pomocą pochodnej (czyli jak bardzo jest pod górę) i dostać się na szczyt jednym susem. Funkcje nieliniowe (taka jak tu) wymagają jednak poruszania się małymi kroczkami i sprawdzania za każdym razem, czy poprzednio obrany kierunek dalej jest do góry i czy aby na pewno nie da się lepiej (no może nie do końca, bo taki algorytm, który zawsze porusza się po najbardziej stromej trajektorii to nieco prostszy algorytm największego spadku, algorytm LM ma jeszcze jeden "bajer").

    0
  • #19 01 Lis 2008 15:04
    qrdel
    Poziom 28  

    Brak studiów nie dyskwalifikuje nikogo, poza jedną jedyną sytuacją - przypisywaniem sobie ukończenia tych studiów.
    Niemniej fakt że kiedyś doiłem owcę nie sprawił że jestem juhasem czy tym bardziej bacą.
    Podobnie stawianie babek z piasku nie mianuje budowniczym lądowym.
    Nawet do tytułu inżyniera nie mam zbyt dużych pretensji mimo że zajmuję się nieco zawodowo inżynierią (oprogramowania głównie), a jedno z moich stanowisk ma w nazwie "inżynier".
    Masz pełne prawo bawienia się, eksperymentowania lub uczenia się wszystkiego czego tylko zechcesz (powiedzmy w granicach prawa i moralności).
    Więcej, jeśli takim niezformalizowanym sposobem nabędziesz rzetelną wiedzę i/lub umiejętności to nie będę miał żadnych pretensji o brak kwitka czy paru literek przed nazwiskiem. Znamy bardzo zacnych idiotów z różnymi tytułami i wiemy że czasem znaczą one bardzo niewiele.
    Chodzi mi jedynie o to, że programowanie powstało jako dział/narzędzie matematyki na długo przed stworzeniem urządzeń do wykonywania programów i służyło precyzyjnemu opisowi sposobów radzenia sobie z matematycznymi problemami.
    Najprostsze exemplum to choćby sito Eratostenesa.
    Stąd tez zgodzę się z twierdzeniem że wszyscy matematycy są programistami, choć być może o tym nie wszyscy wiedzą, no ale jeśli mogą nie wiedzieć że mówią prozą to co to komu szkodzi.
    Przepraszam, początkowo wziąłem Cię za studenta-lewusa który próbuje maksymalnie olewać wszystko co jego zdaniem nie ma bezpośredniego związku z jego docelową pracą - a zanim skończy studia to styl pracy na wymarzonym stanowisku dwukrotnie ulegnie istotnym zmianom. (typu - doskonalił się w tranzystorach, a weszły najpierw scalaki, a potem mikroprocesory)
    Nie zmienia to faktu że składni języka można nauczyć się w kilka godzin, ale formułowanie problemów i programowanie ich rozwiązań to może specyficzna, ale ewidentnie matematyczna działalność.

    Tak, środek ciężkości to średnia z sumy współrzędnych.
    (co ciekawe, środek ciężkości to pojęcie z mechaniki klasycznej, ale ją już się zalicza do matematyki)

    0
  • #20 02 Lis 2008 13:18
    pdlc
    Poziom 10  

    OKI qrdel - mnie się wydaję że wymagasz za dużo od programisty - oczywiście jeśli jest tak jak mówisz to bardzo dobrze - jednak programista (a nie koder - bo to różnica dla mnie też) ma za zadanie "zamienić" (czytaj przetłumaczyć) problem i zadanie na język komputera. Przykład nie muszę wiedzieć do czego używa się jakiegoś wzoru by napisać program który go wyliczy - prawda?
    Ale nie o tym... ;P

    Pytanie mam jeszcze takie :
    - wyliczam prostą na podstawie wag punktów.
    Ale co mam odpowiedzięć jeśli ktoś spyta o błąd mego wyliczenia (dokładność). W przypadku metody najmniejszych kwadratów jest np: odchylenie standardowe a i b czy np współczynnik korelacji liniowej Pearsona. (jest wzór :D)

    A jak będzie w tym przypadku?

    0
  • #21 02 Lis 2008 14:14
    qrdel
    Poziom 28  

    No właśnie, oddzielasz działalność programisty od matematyki, a potem (ze świetnym matematycznym wyczuciem) strzelasz we mnie najcięższym kalibrem statystyczno-matematycznym.
    Odpowiedź pierwsza (ex-cathedra czyli "nie mój problem")
    Jeżeli się samemu projektuje metody obliczeniowe to trzeba samemu (najpierw umieć a potem) wyznaczyć błędy uzyskanych rozwiązań.
    Odpowiedź druga (po ludzku)
    Metody działania widzę dwie
    - teoretyczna - przepropagować wszystkie dokładności przez wszystkie obliczenia ciągnąc wszędzie ich pochodne cząstkowe; wybitni fachowcy jeszcze po każdym przekształceniu potrafią rozpoznać jakie nazwisko nosi kolejny rozkład prawdopodobieństwa (a ja się na tym nie znam)
    - praktyczna - jak koniecznie trzeba znaleźć błąd obliczenia parametru v wyliczonego na podstawie danych x,y,z z błędami odpowiednio a,b,c to można to zrobić "eksperymentalnie".
    Należy stworzyć dla każdej danej dość liczny zbiór x1..n, y1..n, z1..n tak aby każdy miał odchylenie standardowe odpowiednio a,b,c; dla każdego zestawu xi,yi,zi wyznaczyć vi; dla zbioru v1..n wyznaczyć odchylenie standardowe i uznać je za miarę błędu wyznaczenia parametru v.

    Trzecia możliwość to obejście, ograniczyć się do dobrze opisanych i zbadanych metod, tylko często trudno jest znaleźć szczegółowe dane.
    Dla przykładu: gdzie byś szukał błędu wyznaczenia błędu określenia parametru a w metodzie regresji liniowej? (tam nie ma pomyłki, chodzi o błąd błędu)
    Ja owszem mam jedną taką książkę, po niemiecku (a niemieckiego właściwie nie znam); tylko albo komuś pożyczyłem, albo gdzieś cwanie schowałem i też nie wiem gdzie to znaleźć. A przy szukaniu konkretnej szczegółowej wiedzy Internet jest absolutnie do niczego.

    Wracając do umiejętności programisty.
    Myślę że się ze mną zgodzisz, że zaprojektowanie zestawu testów do procedury obliczeniowej jest zadaniem programisty. Tylko jak zaprojektujesz testy nie rozumiejąc metody?

    0
  • #22 02 Lis 2008 20:12
    pdlc
    Poziom 10  

    oki - poczytam o tych błędach

    qrdel - według ciebie to wychodzi na to że programista to "najmądrzejszy człowiek" na świecie, bo zna się na matematyce, kosmonautyce, medycynie ... i na wszystkim tym gdzie sie wykorzystuje komputery.
    Ja się na tym wszystkim nie znam ale gratuluję wiedzy ;D

    Dodano po 5 [godziny] 35 [minuty]:

    teraz właśnie miałem rozmowę z osob,ą która poprosiła mnie o pomoc...
    qrdel - czy mogę napisać aplikację księgową nie znając się na księgowości?
    ja uważam że tak!

    Ale chyba według ciebie NIE - powinienem najpierw skończyć jakąś szkołę księgowości.....

    0
  • #23 02 Lis 2008 23:14
    qrdel
    Poziom 28  

    Współczuję księgowym jeśli będą musieli pracować z systemem napisanym przez osobę nie wiedzącą nic o księgowości.
    --- edit ---
    Co do znajomości rzeczy to twierdzę tylko że masz wiedzieć że programowanie jest dziedziną matematyki (owszem, stosowanej) i że nie powinieneś się dziwić że do pisania efektywnych programów znajomość matematyki jest konieczna. Nawet nie uważam że powinieneś znać całą matematykę (jakby to było możliwe).
    Co do innych dziedzin wiedzy i działalności praktycznej uważam nie tyle że masz poznać całą tę dziedzinę, ale że masz przyjąć postawę otwartą, być gotowym poznać (choćby po łbach) część bezpośrednio związaną z zadaniem i zbudować sobie model otoczenia problemu aby znaleźć najskuteczniejszą metodę jego rozwiązania.
    Naprawdę polecam "Perełki oprogramowania" i drugi ich tom. (są na rynku, niedawno kupowałem na prezent dla młodego mechatronika)

    0
  • #24 03 Lis 2008 08:24
    pdlc
    Poziom 10  

    ale qrdel cały czas twierdzisz że spawacz który spawa przęsło mostu musi umieć je zaprojektować...

    A jak np babka idzie do krawcowej "po"suknie ślubną to co - bierze co tylko jej krawcowa uszyje? Nie najpierw gada : chce tak, tak , tak i tak .
    Krawcowa mówi to ok , to ok, z tym będzie problem.

    To "zleceniodawca" określa "co chce" a wykonawca to robi albo mówi że się nieda (często = nie umiem).


    I nie gadaj takich głupot bo to forum czytają młodzi ludzie (też) - co może sobie pomyśleć taka młoda osoba jak przeczyta że musi się na wszystkim znać żeby pisać aplikacje?


    W "tym" konkretnym przypadku to "ja" zlecam - "sobie" napisanie aplikacji
    Tylko problem polega nie na mnie w części programowania tylko z" matematyką"

    (jak pisałem wcześniej - zraziłem się do niej)

    I prosząc o pomoc nie pytam : jak narysować prostą na kontrolce picturebox? Tylko jak to obliczyć ,policzyć, wyznaczyć ale to powinno być w gestii ZLECENIODAWCY (a w tym przypadku niestety moją).

    Gdybym potrafił to wyznaczyć nie zajmował bym "Wam" czasu...

    0
  • #25 03 Lis 2008 18:31
    qrdel
    Poziom 28  

    Spawacz który spawa przęsło mostu ma obowiązek robić to dobrze (i nie tylko dlatego ze może kiedyś będę po tym moście jechał).
    Ma wiedzieć jaki rodzaj spawu jest potrzebny do takiego zastosowania, w jakim reżimie technologicznym się go wykonuje itp. Powinien też potrafić rozpoznać kiedy spawarka daje za duży prąd, albo niestabilny i wiedzieć kiedy odmówić spawania gdy jedyne dostarczone elektrody będą zbyt twarde/miękkie/korozyjne albo tylko do spawania (powiedzmy) stali chirurgicznej. Akurat nie znam się zbytnio na tym, więc może trochę pomieszałem.
    Ale przypomina mi się historia polskiego inżyniera który na zachodzie chciał się zatrudnić jako spawacz. Pytają go co umie spawać? No wszystko! A spawał tytan? Nie. A w osłonie argonu? Nie. A pod wodą? Nie.
    Dlatego jestem zdecydowanie przeciwny kształceniu "fachowców" od kręcenia śrubokrętem w prawo.
    A matematyki od programowania nijak nie rozdzielisz, możesz najwyżej mocno zamknąć oczy żeby tego nie zauważać.
    Jak zamierzasz stosować metody Monte Carlo bez znajomości statystyki?
    Bo inaczej stawiasz się w pozycji pomocnika maszynistki który na hasło bardzo sprawnie wciska klawisz "W", ale nic więcej nie potrafi.
    Nie uważam też żeby każdy programista miał się uczyć dziedziny dla której ma stworzyć aplikację. Ale ma zrozumieć z czym mają do czynienia nowo poznani klienci, jak to reprezentować w dziedzinie wirtualnej i na podstawie posiadanej wiedzy (programistycznej) winien znaleźć dobre rozwiązanie.

    0
  • #26 03 Lis 2008 21:28
    pdlc
    Poziom 10  

    qrdel - ja o niebie ty o chlebie..

    Nie ma sensu ... przeczytaj jeszcze raz co napisałeś! Ja poruszam sprawę tego czy spawacz ma się znać na liczeniu konstrukcji kratowych i konstruowaniu mostów a ty piszesz że:

    Cytat:
    Spawacz który spawa przęsło mostu ma obowiązek robić to dobrze (i nie tylko dlatego ze może kiedyś będę po tym moście jechał).
    Ma wiedzieć jaki rodzaj spawu jest potrzebny do takiego zastosowania, w jakim reżimie technologicznym się go wykonuje itp. Powinien też potrafić rozpoznać kiedy spawarka daje za duży prąd, albo niestabilny i wiedzieć kiedy odmówić spawania gdy jedyne dostarczone elektrody będą zbyt twarde/miękkie/korozyjne albo tylko do spawania (powiedzmy) stali chirurgicznej.


    Co ma piernik do wiatraka? OCZYWIŚCIE SPAWACZ MUSI SIĘ ZNAĆ NA SPAWANIU - ale nie MUSI na konstruowaniu - pod tego jest KONSTRUKTOR MOSTÓW. Twoja ostatnią wypowiedzią udowodniłeś tylko że "spierasz się nawet nie wiedząc o co"

    TO PRAWDA: PROGRAMISTA MUSI ZNAĆ PODSTAWY MATEMATYKI.
    (ale nie musi wiedzieć jak się liczy Laplasjan w sferycznym układzie współrzędnych)

    Jeszcze raz dzięki z uwagi dotyczące tematu. (te do tej pory)
    Temat zaczyna schodzić na psy - trzymajmy się tematu :D

    0
  • #27 05 Lis 2008 19:19
    qrdel
    Poziom 28  

    Owszem, chyba na pisaniu programów znam się nieco lepiej niż na spawaniu.
    Ale właśnie co do spawacza napisałem że: "Ma wiedzieć jaki rodzaj spawu jest potrzebny do takiego zastosowania, w jakim reżimie technologicznym się go wykonuje..." i jak rozumiem zgodziłeś się z tym.
    Ale Twoje wypowiedzi o programowaniu odpowiadają stwierdzeniu o spawaczu że wystarczy jak potrafi utrzymać ciągły łuk.
    Ale w sumie nie chodzi chyba o to żebyśmy się pokłócili.
    Każdy z nas ma swoje zdanie (co z tego że jestem przekonany że moje jest słuszne). Dopóki nie jesteś moim uczniem/studentem, albo ja nie jestem odbiorcą programu Twojej produkcji, to mogę sobie tylko pogadać.
    Na zakończenie proponowałbym Ci przeczytanie jakiejś książki o pisaniu programów (nie podręcznika języka).
    Życzę powodzenia w działaniach.

    0