abonnement Unibet Coolblue
  zaterdag 6 juni 2020 @ 13:53:08 #1
150517 SpecialK
No hesitation, no delay.
pi_193503923
Ik ben iets aan het programmeren en ik moet 1000 eenheden indelen over een bell curve.

Dus normaal zou je means/standaardverdeling invullen. Maar ik wil volledig anders om.

Ik wil dat de grafiek vanaf 0 naar X eenheden gaat (max). En ik wil de staven opdelen in eenheden van 1 (zoals het in het voorbeeld hieronder is opgedeeld in 0.25)



En ik wil dat de som van al die oppervlakten (van de staven) (ongeveer) 1000 is (dat is mijn input)

Maar ik heb geen idee waar ik zelfs moet beginnen eigenlijk. Het zou helpen als iemand met programmeer-ervaring mij een beetje de goede weg op kan helpen

Ik zoek zoiets als

1
2
3
4
5
6
7
8
9
public int GetAmountForUnit(int maxX, int x, int totalSurfaceArea)
{
???
}

//50 eenheden breed
//wil ik weten wat de hoogte is van de 10e staaf
//Als ik 1000 items met standaardverdeling er in smijt
GetAmountForUnit(50, 10, 1000);


[ Bericht 6% gewijzigd door SpecialK op 06-06-2020 19:51:45 ]
There are no things, but as a consequence there are as many things as we like
  zaterdag 6 juni 2020 @ 16:02:46 #2
484383 Eendenkooi
homeopathisch onverdund
pi_193505329
Kan je het wel in excel? Daar zijn veel mensen toch net iets handiger in.
  zaterdag 6 juni 2020 @ 17:18:54 #3
140043 Isdatzo
Born in the echoes.
pi_193506139
Ik begrijp niet zo goed wat je bedoeling is.

De oppervlakte onder een (standaard normale) verdeling is per definitie één; het is immers een probability density function ('kansdichtheid') en een kans van meer dan 1 kan niet.

De hoogte van de staaf op X is dan gewoon een kwestie van X invullen in de PDF van de standaard normale verdeling X ~ N(0,1): f(x) = exp(-0.5x2) / sqrt (2*pi)

Maar waarom wil je de hoogte weten?

Het plaatje in jouw voorbeeld laat overigens ook geen normale verdeling zien, maar wat je met een normale verdeling kan doen is hem verschuiven over de x-as en/of hem platdrukken/uitrekken langs de x-as (het is dan niet meer een *standaard* normale verdeling). Dat laatste is gedefinieerd als een normale verdeling met gemiddelde μ = 0 en variantie σ2; = 1. Voor andere gevallen krijg je X ~ N(μ,σ2) met PDF



[ Bericht 1% gewijzigd door Isdatzo op 06-06-2020 17:59:57 ]
Huilen dan.
  zaterdag 6 juni 2020 @ 17:24:04 #4
140043 Isdatzo
Born in the echoes.
pi_193506199
Wat zijn je gegevens, en wat wil je ermee doen?
Huilen dan.
  zaterdag 6 juni 2020 @ 18:07:03 #5
150517 SpecialK
No hesitation, no delay.
pi_193506939
quote:
7s.gif Op zaterdag 6 juni 2020 17:18 schreef Isdatzo het volgende:
Ik begrijp niet zo goed wat je bedoeling is.

De oppervlakte onder een (standaard normale) verdeling is per definitie één; het is immers een probability density function ('kansdichtheid') en een kans van meer dan 1 kan niet.
Ik bedoel de oppervlakte van 1 staaf. Niet van het geheel. En als 1 gelijk staat aan 1000 dan vind ik het prima om die vermenigvuldiging te doen.

quote:
De hoogte van de staaf op X is dan gewoon een kwestie van X invullen in de PDF van de standaard normale verdeling X ~ N(0,1): f(x) = exp(-0.5x2) / sqrt (2*pi)

Maar waarom wil je de hoogte weten?
Omdat ik per eenheid op de x-as wil weten hoeveel items ik moet pakken uit de stapel.

quote:
Het plaatje in jouw voorbeeld laat overigens ook geen normale verdeling zien,
Klopt. Het plaatje is een andere functie maar dat maakt verder niet uit voor mijn vraag denk ik.

quote:
maar wat je met een normale verdeling kan doen is hem verschuiven over de x-as en/of hem platdrukken/uitrekken langs de x-as (het is dan niet meer een *standaard* normale verdeling). Dat laatste is gedefinieerd als een normale verdeling met gemiddelde μ = 0 en variantie σ2; = 1. Voor andere gevallen krijg je X ~ N(μ,σ2) met PDF

[ afbeelding ]
Ik wil dus juist niet schuiven en platdrukken. Ik wil andersom.

Kan ik dus een standaardverdeling plotten met als input de min en max X
There are no things, but as a consequence there are as many things as we like
  zaterdag 6 juni 2020 @ 18:08:05 #6
140043 Isdatzo
Born in the echoes.
pi_193506952
Om het een beetje inzichtelijk te maken, hier 3 verschillende normale verdelingen, "50 eenheden breed" zoals je stelt in de OP, allemaal met μ = 25 maar met een verschillende standaardafwijking σ.

σ=10

Hoogte staaf 10:0.008598284
Oppervlakte staaf 10: 0.0129585

σ=8

Hoogte staaf 10: 0.005215123
Oppervlakte staaf 10: 0.00861236
σ=5

Hoogte staaf 10: 0.0008863697
Oppervlakte staaf 10: 0.000898210

Waarbij ik staaf 10 heb ik gedefinieerd als 9.5<x<10.5
Huilen dan.
  zaterdag 6 juni 2020 @ 18:29:22 #7
140043 Isdatzo
Born in the echoes.
pi_193507224
quote:
0s.gif Op zaterdag 6 juni 2020 18:07 schreef SpecialK het volgende:

Omdat ik per eenheid op de x-as wil weten hoeveel items ik moet pakken uit de stapel.

[knip]

Ik wil dus juist niet schuiven en platdrukken. Ik wil andersom.

Kan ik dus een standaardverdeling plotten met als input de min en max X
Je hebt dus data, en je weet dat die normaal verdeeld is, alleen je weet nog niet hoe die normale verdeling eruit ziet (dus wat het gemiddelde en de variantie is)? Vervolgens wil je die verdeling in 50 stukken hakken om te kijken hoeveel punten er in bin X vallen? Begrijp ik het goed zo?

Dan zou ik zeggen: maak gewoon een gegroepeerde frequentieverdeling met 50, of net hoeveel je wil, klassen.
Huilen dan.
  zaterdag 6 juni 2020 @ 19:57:06 #8
150517 SpecialK
No hesitation, no delay.
pi_193508395
quote:
7s.gif Op zaterdag 6 juni 2020 18:08 schreef Isdatzo het volgende:
Om het een beetje inzichtelijk te maken, hier 3 verschillende normale verdelingen, "50 eenheden breed" zoals je stelt in de OP, allemaal met μ = 25 maar met een verschillende standaardafwijking σ.

σ=10
[ afbeelding ]
Hoogte staaf 10:0.008598284
Oppervlakte staaf 10: 0.0129585

σ=8
[ afbeelding ]
Hoogte staaf 10: 0.005215123
Oppervlakte staaf 10: 0.00861236
σ=5
[ afbeelding ]
Hoogte staaf 10: 0.0008863697
Oppervlakte staaf 10: 0.000898210

Waarbij ik staaf 10 heb ik gedefinieerd als 9.5<x<10.5
Dank je.. deze grafieken en je post hiervoor hebben even wat dingen in mijn hoofd laten klikken
There are no things, but as a consequence there are as many things as we like
  zaterdag 6 juni 2020 @ 20:00:25 #9
150517 SpecialK
No hesitation, no delay.
pi_193508445
quote:
7s.gif Op zaterdag 6 juni 2020 18:29 schreef Isdatzo het volgende:

[..]

Je hebt dus data, en je weet dat die normaal verdeeld is, alleen je weet nog niet hoe die normale verdeling eruit ziet (dus wat het gemiddelde en de variantie is)? Vervolgens wil je die verdeling in 50 stukken hakken om te kijken hoeveel punten er in bin X vallen? Begrijp ik het goed zo?
Ja exact.. maar wat ik dus eigenlijk moet doen is een grafiek plotten met bepaalde sigma, .. en als ik die mooi vind... vervolgens de X-as waarden opsplitsen zodat er bijvoorbeeld 50 eenheden ontstaan...

Ik moet simpel transformeren.. ook met de Y-as... omdat de totale oppervlakte 1 is kan ik die Y-as cijfers kan gebruiken om percentages van de eenheden van de plank te pakken per X-eenheid.... ik hoef helemaal niks om te draaien.

Super bedankt ik denk dat ik verder kan
There are no things, but as a consequence there are as many things as we like
  zaterdag 6 juni 2020 @ 20:20:59 #10
140043 Isdatzo
Born in the echoes.
pi_193508834
quote:
0s.gif Op zaterdag 6 juni 2020 20:00 schreef SpecialK het volgende:

[..]

Ja exact.. maar wat ik dus eigenlijk moet doen is een grafiek plotten met bepaalde sigma, .. en als ik die mooi vind... vervolgens de X-as waarden opsplitsen zodat er bijvoorbeeld 50 eenheden ontstaan...

Grafiek plotten tot je 'm mooi vindt? Dat is een beetje het paard achter de wagen spannen: die mu en sigma kan je gewoon uit je data halen natuurlijk.



Waarbij mu de gemiddelde waarde is.

quote:
Ik moet simpel transformeren.. ook met de Y-as... omdat de totale oppervlakte 1 is kan ik die Y-as cijfers kan gebruiken om percentages van de eenheden van de plank te pakken per X-eenheid.... ik hoef helemaal niks om te draaien.

Super bedankt ik denk dat ik verder kan
Ho, let op hè. De Y-waarden kan je niet zomaar gebruiken om percentages van te maken. Je moet dan de oppervlakte (van je 'staaf') onder de grafiek gebruiken. Dat wat ik in mijn voorbeelden grijs gekleurd had.

[ Bericht 14% gewijzigd door Isdatzo op 06-06-2020 20:40:06 ]
Huilen dan.
  zaterdag 6 juni 2020 @ 20:52:57 #11
150517 SpecialK
No hesitation, no delay.
pi_193509526
quote:
7s.gif Op zaterdag 6 juni 2020 20:20 schreef Isdatzo het volgende:

[..]

Grafiek plotten tot je 'm mooi vindt? Dat is een beetje het paard achter de wagen spannen: die mu en sigma kan je gewoon uit je data halen natuurlijk.

[ afbeelding ]

Waarbij mu de gemiddelde waarde is.
[..]

Ho, let op hè. De Y-waarden kan je niet zomaar gebruiken om percentages van te maken. Je moet dan de oppervlakte (van je 'staaf') onder de grafiek gebruiken. Dat wat ik in mijn voorbeelden grijs gekleurd had.
yess.. dank je die oppervlakte tip had ik nog even nodig idd..

ik merk wel dat ik niet exact op 1000 eenheden uit kom omdat ik natuurlijk de hoekjes in de ronding kwijt raak ergens...

Dus ik gooi die overige eenheden randomly op de stapel op het einde.

Ik weet dat het klinkt alsof ik iets smerigs aan het doen ben maar het gaat om het simuleren van piekbelasting op een systeem dus het luistert verder niet super nauw

Dit is mijn uiteindelijke code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
        public static float StandardDeviation(float x, float stddev)
        {
            var mean = 0;
            var one_over_2pi = (float)(1.0 / (stddev * Math.Sqrt(2 * Math.PI)));
            var var = stddev * stddev;

            return (float)(one_over_2pi * Math.Exp(-(x - mean) * (x - mean) / (2 * var)));
        }

        public static int GetAmountOfUnitsForStandardDeviationAtX(int totalX, int x, int unitCount)
        {
            var startX = -2F;
            var endX = 2F;

            var transformedXWidth = ((endX - startX) / (float)totalX);
            var transformedX = ((float)x * transformedXWidth) + startX;

            var y = StandardDeviation(transformedX, 1F);

            return (int)Math.Round(((float)unitCount * (y * transformedXWidth)) * (1.03F));
        }

En die verhoging op het einde met 1.03 is om wat meer eenheden mee te pakken om die echte oppervlakte te benaderen maar.. denk dat ik dat er uit ga halen want ik kan me voorstellen dat dat bij andere cijfers wellicht overshooting kan zijn.
There are no things, but as a consequence there are as many things as we like
  zaterdag 6 juni 2020 @ 21:27:42 #12
140043 Isdatzo
Born in the echoes.
pi_193510311
Ik ben niet zo'n held in Java, maar kan je niet gewoon met numerieke integratie werken? Dan raak je (zo goed als) geen 'hoekjes' kwijt en hoef je geen dingen op stapels te gooien.

Als ik het in R doe dan zit ik op een (verwaarloosbare) totale error < 9.4e-05.

[ Bericht 4% gewijzigd door Isdatzo op 06-06-2020 21:39:31 ]
Huilen dan.
abonnement Unibet Coolblue
Forum Opties
Forumhop:
Hop naar:
(afkorting, bv 'KLB')