Borrar filtros
Borrar filtros

Please help me understand output from discretize

37 visualizaciones (últimos 30 días)
Jeff Spector
Jeff Spector el 29 de Jul. de 2024 a las 17:25
Comentada: Walter Roberson el 29 de Jul. de 2024 a las 19:30
I am trying to understand what discretize is doing, I have data ranging from 0 to 1 and want to bin it in bins of size .01.
X=[.01:.01:1] ; % - example data uniformly going form .01 to 1 in steps of .01
binEdges=[0:0.01:1]; %- the bind edges
binLocs=discretize(X,binEdges,'IncludedEdge','right'); %
%I would expect each bin gets 1 value so that bon locs is [1 2 3 4 5 6 7 8 9 10 etc... up to 100]
but what I get is
binLocs=
1 2 3 4 5 7 7 8 9 10 11 12 13 14 16 16 17 19 19 20 22 22 23 25 25 26 27 28 30 30 31 32 33 34 35 37 37 38 39 40 41 43 43 44 45 46 47 49 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
why is is repeating some (for example the values .06 and .07 go in bin 7 and nothing in bin 6 ?
I'd like the first bin to b 0<=x<=.01 bin 2 .01<x<=.02 bin 3 .02<x<=.03 etc..
can someone explain why I am getting 2 values in some bins ( i.e. bin 7 and bin 22)
Thanks,
-Jeff

Respuesta aceptada

Torsten
Torsten el 29 de Jul. de 2024 a las 17:57
Editada: Torsten el 29 de Jul. de 2024 a las 18:13
X=[.01:.01:1] ; % - example data uniformly going form .01 to 1 in steps of .01
binEdges=[0:0.01:1]; %- the bind edges
X(6)>binEdges(7) & X(6)<=binEdges(8)
ans = logical
1
X(7)>binEdges(7) & X(7)<=binEdges(8)
ans = logical
1
Since your data are on the edges of the bins, it's a precision problem in several cases.
  2 comentarios
Jeff Spector
Jeff Spector el 29 de Jul. de 2024 a las 18:28
Editada: Jeff Spector el 29 de Jul. de 2024 a las 18:29
I thought that 'includge edge, right" would take of that. I still don't understand the following :
X(6)
ans =
0.0600
binEdges(7)
ans =
0.0600
.0600>06000
ans =
logical
0
%- this makes sense since they are equal but then
.0600>binEdges(7)
ans =
logical
0
%- ok this is same as above, now replace .0600 with X(6)
X(6)
ans =
0.0600
>> X(6)>binEdges(7)
ans =
logical
1
%- I guess I don't understand why this is happening? Can someone enlighten me. It seems to get it correct if I'm not using "X(6) but rather the value of X(6). This seems insane to me so please help me understand what I am missing.
Thanks,
-Jeff
Torsten
Torsten el 29 de Jul. de 2024 a las 18:41
Editada: Torsten el 29 de Jul. de 2024 a las 18:45
X(6) is not 0.0600. It's only printed as output with this limited length.
X=[.01:.01:1] ; % - example data uniformly going form .01 to 1 in steps of .01
binEdges=[0:0.01:1]; %- the bind edges
binEdges(7)-X(6)
ans = -6.9389e-18
X(6)-binEdges(8)
ans = -0.0100
binEdges(7)-X(7)
ans = -0.0100
X(7)-binEdges(8)
ans = -1.3878e-17

Iniciar sesión para comentar.

Más respuestas (1)

Walter Roberson
Walter Roberson el 29 de Jul. de 2024 a las 18:56
X=[.01:.01:1] ; % - example data uniformly going form .01 to 1 in steps of .01
binEdges=[0:0.01:1]; %- the bind edges
X - round(X * 100)/100
ans = 1x100
1.0e-15 * 0 0 0 0 0 0.0069 -0.0139 0 0 -0.0139 0 0 0 0 0.0278 0 0 0.0278 0 0 0.0278 0 0 0.0278 0 0 0 0 0.0555 0
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
binEdges - round(binEdges*100)/100
ans = 1x101
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
So, starting from 0.01 and incrementing by 0.01 does not lead to edges that are exactly what you would naively predict.
  2 comentarios
Jeff Spector
Jeff Spector el 29 de Jul. de 2024 a las 19:13
Thanks. I sitll don't really understand where the number are coming from ( i.e. why aren't they .01,.02 etc.. but just using round (X,5) seems to fix the issue, and I can easily tolerate that level of roundig so thanks so much!
-Jeff
Walter Roberson
Walter Roberson el 29 de Jul. de 2024 a las 19:30
X = 0.01:0.01:1;
Y = (1:100)/100;
X(6:7) - Y(6:7)
ans = 1x2
1.0e-16 * 0.0694 -0.1388
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
fprintf('X(6:7) = %08x %08x\n', typecast(X(6:7), 'uint64'));
X(6:7) = 3faeb851eb851eb9 3fb1eb851eb851eb
fprintf('Y(6:7) = %08x %08x\n', typecast(Y(6:7), 'uint64'));
Y(6:7) = 3faeb851eb851eb8 3fb1eb851eb851ec
fprintf('X5+ = %08x\n', typecast(X(5) + 0.01, 'uint64'))
X5+ = 3faeb851eb851eb9
I would guess that 0:0.01:1 is being treated internally as (0:100)/100 whereas 0.01:0.01:1 is treated as repeated addition, and repeated addition suffers from round-off error.

Iniciar sesión para comentar.

Categorías

Más información sobre Calendar en Help Center y File Exchange.

Etiquetas

Productos


Versión

R2023b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by