bug-gnubg
[Top][All Lists]

## Re: [Bug-gnubg] Gap in guestimated ratings?

 From: Joern Thyssen Subject: Re: [Bug-gnubg] Gap in guestimated ratings? Date: Sat, 25 Jan 2003 08:45:49 +0000 User-agent: Mutt/1.4i

```On Fri, Jan 24, 2003 at 01:13:21PM -0500, James F. Kibler wrote
> Thanks to Maaereyes Solomon (author of 3DFiBs) I downloaded gnubg for
> Windows a couple of weeks ago and find it an excellent learning tool.
>
> The attached .gif image has a simple plot of the gnubg guestimated
> ratings from matches I've played on FIBS vs. the date the match was
> played.  The blue diamonds are the ratings for each match, the pink
> squares are the daily averages, and the black line is a polynomial fit
> to the data.  You'll quickly notice that there are no match ratings
> between 1300 and 1500.  One would expect a Rayleigh distribution of
> match ratings with a mean approximately equal to one's FIBS rating.  My
> current FIBS rating is about 1500.  The average of these ratings is
> 1615.  Well, I could understand if the gnubg rating was biased relative
> to the FIBS rating, but how could it have a 200 point gap in the
> middle?  Gnubg says I'm either pretty good or very bad, not the
> middle-of-the-road player that I really am!
>
> Can you tell me what factors are used in gnubg to estimate the rating?
> I was thinking to collect some more data and do a least squares fit to
> the estimator in an attempt to improve the coefficients.

I call the ratings "guesstimates" because that's what they are!

The guestimated rating is some simple interpolation formulae based on
your error rate per decision expressed in normalised equity (see below).

If you can provide some better interpolation formulae I'll be happy to
implement them. I'm basically looking for a gazillion matches played on
FIBS where the error rate per decision is recorded for both players as
well as their FIBS rating.

Jørn

extern float
absoluteFibsRating ( const float r, const int n ) {

static float arRating[] =
{  500, 1500,  1600,  1750,  1850,  1950,  2050, 2200 };
static float arErrorRate[] =
{ 1e38, 0.030, 0.025, 0.020, 0.015, 0.010, 0.005, 0.0 };
int i;
float a;

if ( r < 0 )
return 2200;

/* use linear interpolation between
(0.030,1500) and (0.0,2200) */

for ( i = 6; i >= 1; i-- ) {

if ( r < arErrorRate[ i ] ) {

a = ( arRating[ i + 1 ] -  arRating[ i ] ) /
( arErrorRate[ i + 1 ] - arErrorRate[ i ] );

return arRating[ i ] + a * ( r - arErrorRate[ i ] );

}

}

/* error rate above 0.030 */
/* use exponential interpolation */

return 500.0f + 1000.0f * exp ( 0.030f - 10.0 * r );

}

```