C++, Delphi, JAVA és egyéb programnyelvek

Started by ignus, 2007-06-05, 15:03:45

Previous topic - Next topic

chilip

Quote from: Puru² on 2012-04-14, 15:35:45
Quote from: chilip on 2012-04-14, 14:29:31
[spoiler=rant]köcsög szellemhibák, sakk-játékot csinálok, már a vége fele vagyok és tesztelem. egyik lépésnél nem akarja meglépni, jó mondom, kipingálom breakpointokkal a sakkbanvan_e függvényem >> debug >> meglépem ugyan azokat a lépéseket újra és megteszi a lépést... aztán breakpointok nélkül is meglépi mindig mostantól, eddig miért nem tette?  :zomg:[/spoiler]
Csak nem VEP beadandó ?  :P

azaz

sakk játék:
játék időre (3 perces körök) vagy anélkül
gagyi AI-val, aki random lépked vagy 2 játékos

már minden kécc (szerencsére a királyos bug-ot megtaláltam), csak pár kissebb bug meg a gagyi AI hiányzik :P de arra is van tervem már, csak le kell kódolni. remélem holnap kécc lesz, mára hagyom már.

Darkstar

#421
Mivel nincs ötletem hova (és lehet, h matlabos kérdés lesz belőle) ezért ide:

A következőt próbálom megoldani matlabban:
Generálok egy 50000 elemű mintát, amiben Életkor - (0,1), azaz bedölt hiteles (1) vagy sem párok vannak.

Életkorokban van 6 "választóvonal", 18-78ig 12 évenként léptetve. Egy kategória pl a 18-30. Minden életkor kategóriához van rendelve egy p, amilyen arányban a korosztályban jellemző a csőd. Ez alapján a minta szépen ki is generálódik, ott nincs hiba.

Ezután ez a minta átkerül egy másik functionhöz, aminek  még 6 bemeneti változója (azaz egy 6-elemű vektor) van, amik életkorok.

A második függvény a p-ket már úgy számolja vissza, hogy megnézi, hogy egy kategóriában összesen hányan vannak és ebből hány csődös.

Ezután lenne egy maximum likelihood becslés.

Első kérdés, hogy mivel minden életkorra más a p valószinűség, felírható-e a teljes mintára egy likelihood

L = p1^x1*(1-p1)^(n1-x1)*p2^x2*(1-p2)^(n2-p2)...

ahol p a kategóriához tartozó csődvalószínűség, x a kategóriában lévő csődösök száma és n a kategóriában lévő összes ember? Szerintem igen.

Mivel 50000 körüli mintánál ez a likelihood szeret nullához közeledni (~(0,2^2000)*(0,8^8000)*...), ezért loglikelihoodot használok helyette.

A végcél az lenne, hogy ez a második függvény meg van hívva egy optimalizáló fv-el (esetleg fminsearch) és egy kiinduló "életkor-határokat" tartalmazó vektorral (ami NEM ugyanaz, mint amivel a minta lett generálva), utána pedig maximum likelihood becsléssel "megkeresi", hogy a minta generálásakor hol is lehettek az eredeti határok.

Ez manuálisan már megy, akkor kapom a legmagasabb értéket (-1*loglikelihood), ha az általam ismert eredeti életkorhatárokkal hívom meg (18,30,42...)

Az optimalizálós rész viszont még nem akar működni, hegesztek kicsit még és ha nem megy, akkor jön a második kérdés. :D

Remélem érthetően sikerült leírni.  :D

Ed.: Hm.
Fut az optimalizáció, de szerintem ez így eltartana pár hónapig, mire eredményre vezet, a Nelder-Mead algoritmus egy pöttyet lassú
小野寺梓のラブリーすきぴちゃん

Próféta

Quote from: Darkstar on 2012-04-21, 22:44:09
Első kérdés, hogy mivel minden életkorra más a p valószinűség, felírható-e a teljes mintára egy likelihood

L = p1^x1*(1-p1)^(n1-x1)*p2^x2*(1-p2)^(n2-p2)...

ahol p a kategóriához tartozó csődvalószínűség, x a kategóriában lévő csődösök száma és n a kategóriában lévő összes ember? Szerintem igen.
Szerintem is. Már ha minden emberke randomja egymástól függetlenül volt generálva, nincsenek összefüggések. Mert akkor az együttes likelihood a mintánkénti likelihoodok szorzata, tehát sok pi meg (1-pj) szorzata, vagyis pont az, amit számolsz.

Darkstar

Függetlenek, én is azért gondolom, hogy jó így is a likelihood.
小野寺梓のラブリーすきぴちゃん

kikuchiyo

Elnézést, ha hülyeséget mondok, de amit csinálsz az életkori kategóriánkénti fix valószínűségekkel, az tulajdonképpen a valódi csődkockázatnak, mint az életkor folytonos függvényének közelítése, nem?

És akkor az életkor szerint integrálni kéne valahogy a likelihood-függvény felállításakor, sőt, még a valós populáció koreloszlását is figyelembe kéne venni valamilyen bayesi mágiával.

Failure is the default option

Darkstar

A fix valószínűségek csak mintageneráláshoz kellenek, mert egyrészt a valós minta viszonylag kicsi, üzleti titok így nem lehet csatolni a szakdogához és ráadásul torz, olyan szempontból, hogy empirikus adatok már csak a "megszűrt" emberektől vannak, azaz azokról, akiket eleve elutasítottak, nem tudunk semmit.

Az egész mögött meghúzódó gondolat, hogy egy olyan "folytonos" adatot, mint az életkort, hogy lehet úgy partícionálni, hogy utána az arra alapuló scorecard (azaz egy sima regresszió) lehetőleg pontos becslést adjon a csődvalószínűségre (természetesen nem csak az életkor alapján).

Innen jött az a gondolat, hogy úgy érdemes elhelyezni a határokat, hogy a különböző csoportokban a kockázat szignifikánsan eltérjen.

Elvileg erre hivatott a második függvény, azért az nem fix, hanem csak kiinduló határokat kap, amiknek a módosítgatásával, esetleg mergelésével kialakít egy partícionálást.

Mivel ez csak egy bsc szarakodás, nem kell túllihegni mindenféle felesleges varázslással. Szerintem is sántít kicsit pár helyen, de a konzulensem mondta, hogy ne szarakodjak vele túl sokat, mert nem kell. :D

Aztán persze lehet, hogy félreértettem a kérdésedet.
小野寺梓のラブリーすきぴちゃん

Próféta

Quote from: kikuchiyo on 2012-04-22, 00:21:04
sőt, még a valós populáció koreloszlását is figyelembe kéne venni valamilyen bayesi mágiával.
Elnézést, ha hülyeséget mondok, de miért? Ha jól értem a feladatot, az nem érdekes, hogy miért pont ezek az emberek voltak kisorsolva. Csak az érdekes, hogy ha már megvannak az embereink életkorokkal, akkor közülük miért pont azok csődöltek be, akik; vagyis hogy függ a csőd esélye az életkortól. Ahol életkorra vetítve sűrűbben vannak az emberek, ott legfeljebb pontosabb lesz a becslés.

Ami meg az életkor szerinti integrálást illeti, nem valami fizikás szóródásos feladat járt a fejedben? A csőd hatására nem változik meg az alanyok életkora (hiába öregednek kinézetre 10 évet egy hét alatt), szóval azt nem kell figyelembe venni, hogy mi van, ha nem is annyi éves, hanem egy kicsit más.

kikuchiyo

Nem értetted félre, nagyjából erre céloztam (azaz mondtam valamit homályosat, és reméltem, hogy értelmes :D).

Szóval ha igazán jó modellt akarsz, akkor az optimalizációd nem csak fix számú kategóriára működik, hanem arra is képes, hogy megmondja, hány kategória kell, hogy adott pontossággal leírd az eredeti eloszlást (azaz a particionálás finomságát is állítani tudja).
De ha tényleg kicsi a mintaszám meg torz a minta meg bsc, akkor vsz. nem érdemes belemenni. :)
Failure is the default option

Darkstar

Mergelni tud, de az új határok berakásával vigyázni kell, mert lazán túltanul a modell, és túlságosan mintaspecifikus lesz.
小野寺梓のラブリーすきぴちゃん

kikuchiyo

Quote from: Próféta on 2012-04-22, 00:34:48
Quote from: kikuchiyo on 2012-04-22, 00:21:04
sőt, még a valós populáció koreloszlását is figyelembe kéne venni valamilyen bayesi mágiával.
Elnézést, ha hülyeséget mondok, de miért? Ha jól értem a feladatot, az nem érdekes, hogy miért pont ezek az emberek voltak kisorsolva. Csak az érdekes, hogy ha már megvannak az embereink életkorokkal, akkor közülük miért pont azok csődöltek be, akik; vagyis hogy függ a csőd esélye az életkortól. Ahol életkorra vetítve sűrűbben vannak az emberek, ott legfeljebb pontosabb lesz a becslés.

Olyasmire gondoltam, hogy a valóságban előfordulhat, hogy mondjuk a 18-25 vagy 70-75 éves emberek közül eleve kevesebben kötnek hitelt, és ha így van, ezt már figyelembe kell venni.

Vagy mittomén. Nem gondoltam át alaposan.

QuoteAmi meg az életkor szerinti integrálást illeti, nem valami fizikás szóródásos feladat járt a fejedben? A csőd hatására nem változik meg az alanyok életkora (hiába öregednek kinézetre 10 évet egy hét alatt), szóval azt nem kell figyelembe venni, hogy mi van, ha nem is annyi éves, hanem egy kicsit más.

Valami olyasmi járt a fejemben, hogy ha a kockázati függvény p az életkor T folytonos függvénye, akkor DS néhány diszkrét elemből álló szorzatát (ill. log-nál összegét) integrállal kell helyettesíteni. De mittomén, mondom, nem gondoltam bele mélyebben.
Failure is the default option

Darkstar

Quote from: kikuchiyo on 2012-04-22, 00:49:10
Olyasmire gondoltam, hogy a valóságban előfordulhat, hogy mondjuk a 18-25 vagy 70-75 éves emberek közül eleve kevesebben kötnek hitelt, és ha így van, ezt már figyelembe kell venni.
A mintának nem a teljes lakosságot kell reprezentálnia, ezért ezt nem kell figyelembe venni. A banki, "éles" minta azért nem jó, mert ott nincs adat az elutasítottakról. Lehet, hogy 80%-uk lett volna csődös, lehet, hogy 50. De bárhogy is, az éles minta a valóságosnál jobb képet mutat a szűrtség miatt (selection bias). Mivel az életkorhatárokat meg pont a szűréshez kell behúzni, ezért egy sima egyenletes eloszlást lehet feltételezni az igénylők koránál.
小野寺梓のラブリーすきぴちゃん

Próféta

Quote from: kikuchiyo on 2012-04-22, 00:49:10
Valami olyasmi járt a fejemben, hogy ha a kockázati függvény p az életkor T folytonos függvénye, akkor DS néhány diszkrét elemből álló szorzatát (ill. log-nál összegét) integrállal kell helyettesíteni. De mittomén, mondom, nem gondoltam bele mélyebben.
Ha jól értem, a kockázati függvény az output, inputként változatlanul csak véges sok mérés lenne. Szóval akkor se integrál lenne, hanem szumma.

Amúgy ha tényleg folytonos közelítést kéne adni, nem pedig diszkrét kategóriákat keresni, akkor én simán rádobnék a mintákra egy aluláteresztést, oszt jónapot. Azzal még lehet játszani, hogy mennyire finoman mossa össze az adatpontokat (pl. mekkora sugarú haranggörbével legyen Gaussian blur), az egyik véglet a túltanulás, a másikban lapos átlag lesz az egész.

kikuchiyo

Failure is the default option

Kvikveg

Quote from: kikuchiyo on 2012-05-25, 23:44:38
El ne felejtsem ezt a jövő héten elküldeni a kollégáknak:

http://bit.csc.lsu.edu/~gb/csc4101/Reading/gigo-1997-04.html
A nyelv elso emlitesekor a Nnnnoooo.jpg ugrott be.
Najo bookmarkolom, de en miota kijottem mindenhez faradt vagyok.
WARNING: module "coffee.exe" did not run correctly. Brain running in limited mode.
Do not meddle in the affairs of dragons for you are crunchy and taste good with ketchup.

Próféta

Azt nem mondjátok komolyan, hogy Adával is kell dolgoznotok?  :eek:

Quote from: kikuchiyo on 2012-05-25, 23:44:38
El ne felejtsem ezt a jövő héten elküldeni a kollégáknak:

http://bit.csc.lsu.edu/~gb/csc4101/Reading/gigo-1997-04.html
Jópofa :Kiraly:
Ez a "lerántjuk a leplet a gonosz programozási nyelvről" mintha önálló Aprils Fools műfaj lenne - van pl. C++ változata is:
http://lists.blu.org/pipermail/discuss/2000-April/006338.html

kikuchiyo

Quote from: Próféta on 2012-05-26, 18:37:47
Azt nem mondjátok komolyan, hogy Adával is kell dolgoznotok?  :eek:

A szerződésünk értelmében nem árulhatjuk el, csak ennyit mondhatok:  :comp: :falba: :bruhuhu:

Failure is the default option

kikuchiyo

Failure is the default option

Kvikveg

WARNING: module "coffee.exe" did not run correctly. Brain running in limited mode.
Do not meddle in the affairs of dragons for you are crunchy and taste good with ketchup.

kikuchiyo

Windows guruk: van-e valamilyen bevált, egyszerű, értelmes módszer screenshotok automatizált, felhasználói beavatkozás nélküli készítésére?
Olyasmi lenne ideális, mint linux alatt az import, scrot és társaik.
Failure is the default option

kikuchiyo

#439
Quote from: fórummotorWarning: this topic has not been posted in for at least 120 days.
Unless you're sure you want to reply, please consider starting a new topic.
:(

Nincs kedve vmelyik, legalább 8 GB memóriával rendelkező gurunak lefordítani és futtatni ezt a programot?

http://pastebin.com/KkPQiCPt

Értelemszerűen GMP kell hozzá. libgmp, libgmp-dev vagy hasonló nevű csomagokban szokták tartalmazni a csomagkezelők.

szerk: in b4 "de programozni nem úgy kell, hogy random rátenyerelsz a billentyűzetre, hanem hogy gondolkodsz és odafigyelsz arra, amit írsz. Hogy a programod rosszul működik, az nem meglepő, mivel kesze-kusza, átláthatatlan, rosszul olvasható, érthető, karbantartható módon építetted fel - egyszóval öntökönszúrást művelsz." :D
Failure is the default option

Próféta

itthon nem rendelkezem annyi memóriával :(

kikuchiyo

Kösz, már közben "javítottam" rajta annyit, hogy éppenhogy, de belefér a memóriába swappelés nélkül. 44-re még nem, de arra is van ötletem. Amúgy is csak egy toy problem az egész...
Failure is the default option

Selmo


A tökéletesség unalmas.


Darkstar

Volt egy kis szabadidőm, ezért gondoltam, miért ne kezdenék el kicsit javascripttel szórakozni (eddig még soha nem volt egymáshoz szerencsénk).
Szóval a cél:
Hogy kikerüljem a danbooru nyomorúságos rendszerét, és egyszerűbben tudjam egy-egy artist összes képét lementeni, a következőt szeretném elérni.
A script szépen elindul, amikor egy artist kezdőoldalára lépek (itt belép az első gyenge pont, azaz nem mindig fog így kinézni a link, de ez egyelőre most a kissebb probléma: http://danbooru.donmai.us/posts?tags=kantoku.)
Ezután szépen megkeresi a thumbnail linkeket, és annak segítségével előállítja a linkeket a full képekhez (ha a kép png, akkor a .jpg-t kicseréli). Ezután nyit egy új tabot és szépen megmutatja a thumbnail-eket, és a linkeket a full képekhez.
Gyakran (99.9999%) előfordul, hogy több oldalnyi kép van. Ezesetben a script illendően végiggyalogol az oldalakon és mindegyiken lefut.
A kérdés: hogyan tudnám megoldani, hogy előbb szépen végigmenjen az összes oldalon, begűjtse az összes linket, aztán mindezt egy oldalon prezentálja, és ne annyi újat nyisson, ahány oldal van?
A kód (ismétlem: először bűvészkedem JAVA-val és még nem is végleges, tehát kéretik a röhögést kicsit visszafogni. Az Addbutton-al az a tervem, hogy első körben csak egy gombot dobjon az oldal tetejére, és ne automatikusan fusson le. De ez majd későbbi csiszolás.)
[spoiler]// ==UserScript==
// @name        Grab
// @version     0
// @include     http://danbooru.donmai.us/posts?tags=*
// @include     http://danbooru.donmai.us/posts?*
// ==/UserScript==

javascript:

function UrlExists(url) {
  var http = new XMLHttpRequest();
  http.open('HEAD', url, false);
  http.send();
  return http.status!=404;
}


function AddButton(){
    var element = document.createElement("input");
    element.type = "button";
    element.name = "CreateButton";
    element.value = "Create";
    element.addEventListener('click',Pagination,false);
    document.getElementById("post-sections").appendChild(element);
}


function Pagination(){
var regPages = new RegExp("/posts?&amp*","g");
Create();
var pages = document.body.innerHTML.match(/\/posts\?&amp[A-z0-9_=;&%-]*/g);
if(typeof pages[4] != 'undefined')
    {
    window.location.href = "http://danbooru.donmai.us" + pages[4];
    }
    else{
        if (document.URL.match(/http:\/\/danbooru\.donmai\.us\/posts\?tags\=[A-z0-9_-]*/gi))
        {
        window.location.href = "http://danbooru.donmai.us" + pages[3];
        }
    }
}


function Create(){
var reg = new RegExp("/ssd/data/preview/[A-Za-z0-9_]+.jpg","g");
var reg2 = new RegExp("[A-Za-z0-9_]+.jpg");
var images = document.body.innerHTML.match(reg);
var n = images.length;


for(var i = 0; i < n; i++) {
    var imgsrc = "http://danbooru.donmai.us/data/" + images[i].match(reg2);
    var thumb = "http://danbooru.donmai.us" + images[i];
        if (!UrlExists(imgsrc))
        {
            imgsrc = imgsrc.replace("jpg","png");
        }
    links_html += "<a href=" + imgsrc + ">" + "<img src=" + thumb + ">" + "<a>";
}
}


var links_html = "<!DOCTYPE html><html><body>";
Pagination();
links_html += "</body></html>";
var links = window.open("");
links.document.body.innerHTML = links_html;
[/spoiler]
小野寺梓のラブリーすきぴちゃん