Számok felosztása, Ti hogyan csinálnátok?

 ( yoursoft | 2019. augusztus 16., péntek - 20:53 )

A lényeg, hogy kapok számsorokat.
Ezeket kell 4 kategóriába sorolnom.
Erre csak érzésem van, hogy melyik hova tartozzon:

Példák:
----------------
1, 1, 3, 3, 4, 11, 34 -->
1, 1 -> 1.
3, 3, 4 -> 2.
11 -> 3.
34 -> 4.
----------------

1, 13, 25, 68, 1191 -->
1 -> 1.
13, 25, 68 -> 2.
-> 3. (üres)
1191 -> 4.
----------------

0, 0, 0, 31, 68, 230, 411, 1511, 2034 -->
0, 0, 0 -> 1.
31, 68 -> 2,
230, 411 -> 3.
1511, 2034 -> 4.
----------------

0, 1, 5, 30 -->
0 -> 1.
1 -> 2.
5 -> 2. vagy 3.
30 -> 4.

Van valami ötletetek, hogy miként lehetne programozottan?

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Mi alapjan akarod csoportositani, es minek? Tippre valamilyen klaszterezo algoritmus kell neked, de nem teljesen vilagos a kezi felosztasod.
https://en.wikipedia.org/wiki/K-means_clustering

De pl. pythonban-scikitben vannak ilyesmik elore leprogramozva.
1 dimenzioban mondjuk leprogramozni sem tunik lehetetlennek. De elobb talald ki, hogy mit akarsz kezdeni a csoportokkal.

--
When you tear out a man's tongue, you are not proving him a liar, you're only telling the world that you fear what he might say. -George R.R. Martin

Ok. Van egy szótáram. Szeretném a fordítási gyakoriságot megjeleníteni, mint a Google Translate.
Ehhez elemzéseket végeztem és megkaptam, hogy pl. az ability-t 1191-szer fordították "képesség"-nek. 68-szor "alkalmasság"-nak. Stb.
Ez alapján kellene az adott szóhoz tartozó fordításokat csoportosítanom.
Azaz felhasználóknak nem számokat jelenítenék meg, hanem pl. képesség mellett 3 kocka lenne, míg az alkalmasság mellett csak 1 kocka.

Vannak szó-érték párok:
Alma-1191
Körte-471
Vilmos-43
Pulyka-891
Világos-1092

A legnagyobb és a legkisebb (1191 és 43) közé kell skáláznod az értékeket, a skálán 3 halmaz van (3 kockával jelzed max a jóságot), azaz: (lépés = 382 (= (1191-43) /3 ))
43-425: egy kocka
426-808: két kocka
809-1191: három kocka

Mod:
1. Ha a jóságot jelezheted nulla kockával is (fals fordítás), akkor 4 halmazod lenne az egyenesen.
2. Lineáris helyett használhatsz log skálát is, a 267648732467 érték melletti 4356 és 9737 számok ne adjanak nulla kockát. A nagyon kiemelkedő érték ne "vigye el a bulit".

Esetleg simán c*log(n+1) alapon kiírni kockákat, ahol n a találat, c egy korrekció. A korrekció az alapján is meghatározható, hogy hány kocka tartozzon a max találathoz. Ekkor c = maxkocka/log(maxn+1).

Megnéztem még egyszer a mintáidat és az alapján ezt látom (ez a szabály igaz "majdnem" mindegyikre, ha nem basztam el):

a = min(array())
b = max(array()) * 0.75
c = avg(a,b) // emiatt nem mindegyikre igaz. 
// Van ahol azt nézed amit a képlet. 
// Van ahol azt, hogy a maradék tömbnek mi a mediánja és az alapján felezel. 
// Ez nem volt nekem tiszta az adatokból. 

1. = a
2. > a && < c
3. > c && < b
4. >= b

Mondjuk az ilyenek eldöntése mitől függ?
5 -> 2. vagy 3.
Ha mindegy, akkor a véletlenszám-generátor.

Köszönöm mindenkinek az öteleteket.

Működőképesnek néz ki a logaritmikus és Oregon megoldása is. Kipróbálom mindkettőt.

Még az enyémhez:
c = jelen pillanatban a maradék tömb külső határa és nem a belső!!!

pl:
1,2,10,100,200,1000

1) 1
2) 2,10,100,200
3)
4) 1000

Jelenleg a c értéke kb 500 avg(1,1000).

Ha megkeresed a maradék tömb avg(2,10,100,200), akkor annak az értéke 78 lenne.