13. januar 2009 - 14:13Der er
9 kommentarer og 1 løsning
Sammenlign arrays af doubles
Hej experter, jeg har virklig brug for nogle kloge hoveder.
Jeg er i gang med at lave et program der skal finde nogle værdier fra en database, alt efter hvordan en serie af måle data ser ud.
En kort forklaring til problemet:
Lad os sige, at det perfekte set måle data var {1, 2, 3, 4, 5, 6}. jeg har 2 målinger i min database: {1.5, 2.5, 3.5, 4.5, 5.5, 6.5} {0.5, 1.5, 2.5, 3.5, 4.5, 5.5}
Nu laver jeg så en måling, og får følgende: {1.4, 2.4, 3.4, 4.4, 5.4, 6.4}
jeg skal så finde ud af hvilken entry i databasen der minder mest om den nye måling.
Det er jo ret let, at finde ud af hvor meget den gennemsnitlige fejl er, og så finde den tidligere måling der ligger tættest på det.
Men hvis jeg så har en måling som nogle nye målinger som {1.3, 2.3, 3.3, 3.7, 4.7, 5.7} {0.7, 1.7, 2.7, 4.3, 5.3, 6.3}
Gennemsnitlig er de to sæt målinger jo nødagtigt lige meget forkerte, men aligevel er de meget forskelligt.
Der er ikke nogen helt fast størrelse på hvad der skal måles, der kan være mellem 5 og 10.000 målinger, så der er ingen mulighed for at filtreringen skal foregå i min sql string. Min tanke var at ha et, måske at par, tal der beskriver kurvens form og offset.
Er der nogen af jer der kan beskrive ganske kort, hvilken teknik jeg skal bruge, og evvt give nogle links til ydderligere læse stof?
Hvis du bare skal have en eller anden vurdering af kvaliteten så tag forskellen for hver data punkt og gang med sig selv, lav en sum af det for hvert data set.
Det kommer ikke til at gå, i hvert fald ikke hvis det er det eneste tal jeg skal bruge. Men det er rigtigt at det er en god måde at beskrive offsettet på.
Hvis du ser på de 2 sidste sæt data i spørgsmålet, vil stddev være det samme for de 2 sæt, selv om formen for de 2 sæt er meget forskellig.
Lad os lige navngive de forskellige set: P:{1, 2, 3, 4, 5, 6} DB1:{1.5, 2.5, 3.5, 4.5, 5.5, 6.5} DB2:{0.5, 1.5, 2.5, 3.5, 4.5, 5.5}
"Nu laver jeg så en måling, og får følgende:" M1:{1.4, 2.4, 3.4, 4.4, 5.4, 6.4}
"Men hvis jeg så har en måling som nogle nye målinger som" M2:{1.3, 2.3, 3.3, 3.7, 4.7, 5.7} : ((0,2)^2x3+(0,8)^2x3)/6 for DB1 M3:{0.7, 1.7, 2.7, 4.3, 5.3, 6.3} : ((0,8)^2x3+(0,2)^2x3)/6 for DB1
De er ens set i forhold til DB1 og P (0,3 afvigelse for alle værdier).
Så skulle man se på forskellene i % for hvert måling i hvert sæt, forskel til DB1: Første værdi er 1.5 M2: (1.5-1.3)/1.3 = 15% M3: (1.5-0.7)/0.7 = 114% osv. så totalt afviger M2 83% fra DB1 og 134% fra DB2, M3 afviger 203% fra DB1 og 94% fra DB2. Så M2 er en DB1 og M3 en DB2.
Men jeg kan dårligt sige om dette er retvisende for dine data.
Nååh ja, klart nok, det har du ret i. Men så skal jeg hver gang jeg tager en måling sammen ligne den med alle tidligere målinger for at finde den bedste.
Hvis nu der er 1.000.000 tidligere målinger, kommer dette ogås til at tage et stykke tid at beregne. Så er muligheden jo selvføldig at ryde op i databasen, og kun gemme nogle rimelig unikke måle data.
Mit håb var, at jeg hver gang jeg laver et nyt sæt målinger, kan beregne 'determinanten' for det sæt, gemme det i databasen, og så lave en søgning i databasen, efter de determinanter der er ca samme værdi som den nye. På den måde får jeg kun én beregning for hver ny sæt målinger.
Du kunne måske beregne alle dine gemte sæts afvigelser fra det Perfekte sæt i en sorteret liste efter afvigelsens størrelse (med et hurtigt søgetræ). Beregne den nye målings afvigelse fra den perfekte størrelse. Finde de nærmeste 10,100 eller 1000 fra DB og sammenligne med dem. Dette vil kun være en heuristik og ikke en 100% sikkert at du finder det rigtige match.
Jeg fik lige en anden ide, den er slet ikke gennemtænkt, men jeg prøver lige at slynge den ud aligevel.
Hvis nu hver gang der bliver lavet en ny måling, bliver beregnet stddev i forhold til p. Samtidig bliver der beregnet en eller anden alternetiv p, der kommer til at krydse linien for en oprindelige p, exempelvis en lige linie fra p[0]+1 til p[n]-1, evt kunne der også være lavet offset til den originale p.
På denne måde, vil der ikke kunne være 2 forskellige linier, der har samme 3 tal. Er det ikke smart, eller har jeg glemt noget :)?
Jeg efter prøvede min teori med at sammenligne data med 3 fast 'kurver'. Det var ikke umidlbart en success, ihvert fald kan jeg ikke lige gennemskue at finde sammen hænget mellem de tre tal.
Jeg tror vejen frem bliver som segmose også foreslår, at udvælge 10-100 set målinger der repræsentere alle mine tænklige målinger. Og så kun sammmen ligne mine nye målinger med de 10-100.
Jeg kom til at tænke på en anden ting. Hvordan virker en finderaftryks scanner? Får man vel heller ikke en entydig tal ud af den. Og hvis man så har en database med 1.000.000 fingeraftryk i, kommer det også til at tage noget tid at søge i den. Men det gør det jo selvføldig også i CSI :)
Jeg kommer nok ikke nærmere. Lige nu, men det bliver noget jeg kommer til at rode med det næste lange stykke tid, så jeg skal nok sige til hvis jeg lige pludslig får en genial ide :) Hvis der skulle være nogen der får lyst til det, vil jeg meget gerne ha en prej, jeg åbner gerne en ny tråd og deler points ud igen.
Indtil nu har jeg besluttet mig for at gå efter segmoses forslag, altså finde mig nogle tidligere målinger der bedst muligt kan repræsentere alle fremtidige målinger.
Men tak for hjælpen indtil nu.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.