bjshnog

⟪WN8⟫ Development / Resources

2,170 posts in this topic

My equation was all wrong! :D ...Think that :D was meant to be a D:? Nope. Such a good time for a PhD mathematician/statistician to come into my school. :D

I can further improve the formula by using the eigendecomposition of the correlation matrix for each of these 4 stats. The length of the overall formula will increase by a factor of 4, but it will be even more accurate, and each part of the formula will still be easily discernable. If no-one tries to screw around with the calculation code on their sites after making it work properly, everything will be fine! Will post more when I do some tests.

Share this post


Link to post
Share on other sites

Then until we have the data, we can use a tier/class-based curve for those few tanks. Or, if a certain tank is marked "OP" or "UP", they get a slightly increased or decreased TOP stat? How are the top100 stats retrieved? Do the XVM people do the calculations every so often based on the stats of the users of XVM Stat? Is there any way we can try to have them update it? Or is it WG who does that?

 

 

As far as I know, the XVM people did it a few times, getting data from who knows where. It hasn{t been updated for a LONG time.

Share this post


Link to post
Share on other sites

As far as I know, the XVM people did it a few times, getting data from who knows where. It hasn{t been updated for a LONG time.

 

Then I'm sure that I'm not the only one who wants to get them to hurry up and do another round. Then again, I don't know how difficult it is for them.

Share this post


Link to post
Share on other sites

Okay, my friends, how can we do some test plots of K1 vs WR, to begin with? And about that eigendecomposition thing... I was so wrong. That would probably end up being about 24 times as long... or more.

 

How well do different stats correlate to wins at different tiers?

Share this post


Link to post
Share on other sites

No data for correlation at each tier. However I am pretty sure this would be VERY precise. Even if we only used weighted WR, dmg and frags. Ill see if I can find updated data somewhere...

Share this post


Link to post
Share on other sites

No data for correlation at each tier. However I am pretty sure this would be VERY precise. Even if we only used weighted WR, dmg and frags. Ill see if I can find updated data somewhere...

 

I think only using that would be a bit of a ripoff for scouts and defenders. Even if some defenders just hang back at base, they are still helping their team and they will lose points for damage and frags anyway.

There's another issue we have. Damage and Frags may have a strong correlation to WR, but they themselves are correlated strongly. Therefore, each of them separately will be worth less. After we do the tests between these stats, we might need help calculating the new coefficients for the formula, unless I can get it right.

 

... XVM doesn't seem to have Defense stats though... I guess we'll just use raw average Defense Points then.

Share this post


Link to post
Share on other sites

Upon examination of sela's stats in tier 1s compared to tier 10s, a tier normalizer may actually be required. However, low tiers shouldn't be worth much less than tier 10s. I'd say tier 1 should be worth about 60-70% of tier 10. We'll just come up with a simple curve or even a straight line for this, making normal average tier useful again.

 

This post is now obsolete. I had a slightly better idea, which I will post soon. Luckily, it's no more complex than this one.

Share this post


Link to post
Share on other sites

Aside from solving OP tank farming problems, this would make WN MUCH more fair to scout players... WN wouldnt expect them to kill or damage as much as other tank classes...

Share this post


Link to post
Share on other sites

For the correlations, we might be able to take the coefficients between them, r(i,j), and multiply each of the base coefficients by (2 - r(i,j)) / 2. Not sure though.

 

About tier, we can just scale the top100 value up by 2% per tier difference from tier 10. For example, for tier 1, the top100 values would be increased by 18%, 10% at tier 5, 4% at tier 8, 2% at tier 9, etc.

 

Aside from solving OP tank farming problems, this would make WN MUCH more fair to scout players... WN wouldnt expect them to kill or damage as much as other tank classes...

 

But what if they are crappy at scouting and just shoot enemies from the bushes with gold ammo? Besides, scouting has a notable role in winning and should definitely be in the formula, from a purely statistical viewpoint. Removing that would screw a lot of people over and also hit accuracy a lot.

Share this post


Link to post
Share on other sites

No you misunderstood me. I was just implying spotting stats are much more inaccurate from API, seem to be off in XVM stats also, and we could continue to use them, jsut not vehicle-dependant, just using overall avg as in WN7. Otherwise we could use generic values, as in 0.5 for heavies, 0 for SPG, 0.5 for TDs, 1 for meds, 2 for lights. 

Share this post


Link to post
Share on other sites

No you misunderstood me. I was just implying spotting stats are much more inaccurate from API, seem to be off in XVM stats also, and we could continue to use them, jsut not vehicle-dependant, just using overall avg as in WN7. Otherwise we could use generic values, as in 0.5 for heavies, 0 for SPG, 0.5 for TDs, 1 for meds, 2 for lights. 

 

Hmm. I think the only reason they are inaccurate is because they only have a small correlation with WR. It is also because some vehicles in classes have very different scouting capabilities. For example, the Loewe has a high view range and tends to insta-spot the enemy team on the Standard Malinovka map, while the Tiger II doesn't. Maybe that was just my crew and modules, but in every battle, if I saw an enemy Loewe or Pershing, I turned right around and got the hell out of there or died.

Share this post


Link to post
Share on other sites

I am trying to get accurate stats from somewhere... i have asked Phalynx from vbaddict, but hes on vacation for 2 weeks... we might have to wait.

Share this post


Link to post
Share on other sites

I am trying to get accurate stats from somewhere... i have asked Phalynx from vbaddict, but hes on vacation for 2 weeks... we might have to wait.

 

I've seen some of the stats on that site. The Leopard 1 has a 44% winrate, while XVM shows 51%.

 

Anyway, even if it takes a few more weeks or even months, we shouldn't jump to the conclusion that WN8 is complete until we have the stats.

Share this post


Link to post
Share on other sites

Phalynx will supply us the vbaddict data, ina  few weeks when he comes back from vacation...

Share this post


Link to post
Share on other sites

I was thinking when we have vbaddict data, I think top 100 is not the best idea. Maybe the average of top 25% or top 10%, since using the top100 stats can be biased regarding tanks that were OP for some time and then nerfed. As examples you have people with AMAZING stats on M48A1, Batchat, 50B, Foch, T110E5, but after nerf they are normal or maybe for some quite crappy tanks. This effect could be diluted a little bit using tp 10 or 25% data... we will see.

Share this post


Link to post
Share on other sites

I was thinking when we have vbaddict data, I think top 100 is not the best idea. Maybe the average of top 25% or top 10%, since using the top100 stats can be biased regarding tanks that were OP for some time and then nerfed. As examples you have people with AMAZING stats on M48A1, Batchat, 50B, Foch, T110E5, but after nerf they are normal or maybe for some quite crappy tanks. This effect could be diluted a little bit using tp 10 or 25% data... we will see.

 

Yeah, I thought the same thing, but I didn't have access to a computer, so I couldn't post it. Another reason for it is that if it's a relatively new tank, or even a tank that has bad reviews and not many people buy it, then the top 100 may include bad players. I think that's why the XVM top damage for the ST-I is so low at 2350. It's still a pretty uncommon tank.

 

I think a small percentage is the best idea, but we should really try to find some sort of performance curve for these OP tanks and use the point at about the bottom of the sharp increase near the top. I don't know if we can get the data for that though, but if we can, it should be relatively easy to find a good percentage. I don't think we'll ever be able to do anything about those people who stopped playing them after they were nerfed, even if WG updated their API, but then again, if those players are still good in those tanks, they won't benefit from it if they don't play them.

 

We have to keep in mind that this metric is pretty much on a per-battle basis, because even if they didn't stop playing the OP tank, their WN8 may still go up even if they are doing worse in the tank than they had prior to the nerf, as long as they are doing better than they have on average. I think this is a point to make on the official WN8 information thread once it's finished, if this per-tank metric is accepted.

 

Also, as I can see that WR definitely IS going to be in WN8, it should be weighted per-tank, by server top, so the weights won't really make much of a difference to that component unless they play lots of low tier battles, in which case their WN8 WR component will be quite low unless they carry all their teams. Hmm... that's a fair way to normalize for tier, without using an actual normalizer term... heh.

Share this post


Link to post
Share on other sites

So... are the programming/markup languages that will be used dependent on whoever is making the system? I mean, for different sites, will different languages be used, and does XVM use a different language? I assume so.

 

Anyway, I could come up with an example block of code which would calculate this. In fact, since I don't know any non-GML programming languages (hue), I could just come up with a general syntax type of thing. Will post soon.

Share this post


Link to post
Share on other sites

General:

"max" denotes total number of tanks available in the game (meaning total which can be extracted from the game files, to avoid errors).

ID# goes from 1 to max. Blocks like this:

exampleStat[1]

...

exampleStat[max]

will be shortened to:

exampleStat[iD#].

So, exampleStat[iD#] should not be confused as a single value.

 

Input for the formula:

battlesNumberTotal

battlesNumber[iD#]

playerWins[iD#] Remember, each win, even in platoons, still counts as a single win, and if someone makes sure that they win always on one tank, that will only make a small difference to WN8 depending on the tank. Or, if they only have a single battle, a win, putting their WR in that tank 30% above top or something, that 30% will be scaled to the number of battles in that tank compared to the total.

playerDamageTotal

playerFragsTotal

playerSpotsTotal

playerDefenseTotal

 

Reference database contains (constants to be stored on either a server or local machine, depending on where/how it is being calculated, currently uncalculated or unknown):

topWinRate[iD#]

topDamage[iD#]

topFrags[iD#]

topSpots[iD#]

topDefense[iD#], or a constant across all tanks, as this probably depends far more on the player than the tank, although the BatChat 25t probably has high Defense stats... On second thought, maybe this should be separate for every tank.

weightDamage = multiplier for base Damage stat in WN8

weightFrags

weightSpots

weightDefense

weightWins

scaleFactor Multiplier which puts the server mean or median WN8 at 1000, or some other value.

 

Functions:

Sum(exampleStat, 1, max, i) The sum of all exampleStat values from i = 1 to i = max. If a language being used doesn't have a function like that, then a For() loop can easily be done

Round(exampleValue, 1) exampleValue, rounded to the nearest multiple of 1 = Floor(exampleValue + 0.5)

WinsFunction(exampleWins) Transforms ratioWins to an S-curve or something which is mostly on a scale from 0 to 1, like the other ratios

Share this post


Link to post
Share on other sites

var WN8       // Final WN8

 

var wnDamage  // Damage component of WN8
var wnFrags   // Destroyed component of WN8
var wnSpots   // Detected component of WN8
var wnDefense // Defense component of WN8

var wnWins    // Wins component of WN8

 

var topDamageTotal  // Expected top Damage for all tanks used by player
var topFragsTotal   // Expected top Frags for all tanks used by player
var topSpotsTotal   // Expected top Spots for all tanks used by player

var topDefenseTotal // Expected top Defense for all tanks used by player

var topWins         // Expected top Wins per tank used by player         - array: topWins[iD#]

var topWinsTotal    // Expected top Wins for all tanks used by player

 

var ratioDamage  // Ratio of total Damage to expected top Damage

var ratioFrags   // Ratio of total Frags to expected top Frags

var ratioSpots   // Ratio of total Spots to expected top Spots

var ratioDefense // Ratio of total Defense to expected top Defense

var ratioWins    // Ratio of Wins per tank to expected top Wins per tank - ratioWins[iD#]

 

for(i=1; i<=max; i++)

{topWins[iD#] = Round(battlesNumber[iD#] * topWinRate[iD#], 1)}

 

topDamageTotal  = Sum(battlesNumber*topDamage,  1, max, i)

topFragsTotal   = Sum(battlesNumber*topFrags,   1, max, i)

topSpotsTotal   = Sum(battlesNumber*topSpots,   1, max, i)

topDefenseTotal = Sum(battlesNumber*topDefense, 1, max, i)

 

ratioDamage  = playerDamageTotal  / topDamageTotal

ratioFrags   = playerFragsTotal   / topFragsTotal

ratioSpots   = playerSpotsTotal   / topSpotsTotal

ratioDefense = playerDefenseTotal / topDefenseTotal

 

for(i=1; i<=max; i++)

{ratioWinsPre = playerWins / topWins}

 

ratioWins = Sum(battlesNumber * ratioWinsPre, 1, max, i) / battlesNumberTotal

 

wnDamage  = ratioDamage             * weightDamage

wnFrags   = ratioFrags              * weightFrags

wnSpots   = ratioSpots              * weightSpots

wnDefense = ratioDefense            * weightDefense

wnWins    = WinsFunction(ratioWins) * weightWins

 

WN8 = Min(battlesNumberTotal/100, 1) * (scaleFactor * wnDamage + wnFrags + wnSpots + wnDefense + wnWins)

 

return WN8

Share this post


Link to post
Share on other sites

The pseudo-script is complete.

 

The value ratioWins is the ratio of wins to expected wins for top players. Alone, ratioWins will give a value between 0 and 1 (with some values above 1 and very few below about 0.25, none below 0), but this should be transformed into an S-curve or something so that the worst 2% over 100 battles align with 0 and the top players over 100 battles align with 1.

 

Personally, I think a tanh curve would be sufficient, but I don't know much about the S-curve, so that's obviously for someone else to work out.

Share this post


Link to post
Share on other sites

var WN8       // Final WN8

 

var wnDamage  // Damage component of WN8

var wnFrags   // Destroyed component of WN8

var wnSpots   // Detected component of WN8

var wnDefense // Defense component of WN8

var wnWins    // Wins component of WN8

 

var topDamageTotal  // Expected top Damage for all tanks used by player

var topFragsTotal   // Expected top Frags for all tanks used by player

var topSpotsTotal   // Expected top Spots for all tanks used by player

var topDefenseTotal // Expected top Defense for all tanks used by player

var topWins         // Expected top Wins per tank used by player         - array: topWins[iD#]

var topWinsTotal    // Expected top Wins for all tanks used by player

 

var ratioDamage  // Ratio of total Damage to expected top Damage

var ratioFrags   // Ratio of total Frags to expected top Frags

var ratioSpots   // Ratio of total Spots to expected top Spots

var ratioDefense // Ratio of total Defense to expected top Defense

var ratioWins    // Ratio of Wins per tank to expected top Wins per tank - ratioWins[iD#]

 

for(i=1; i<=max; i++)

{topWins[iD#] = Round(battlesNumber[iD#] * topWinRate[iD#], 1)}

 

topDamageTotal  = Sum(battlesNumber*topDamage,  1, max, i)

topFragsTotal   = Sum(battlesNumber*topFrags,   1, max, i)

topSpotsTotal   = Sum(battlesNumber*topSpots,   1, max, i)

topDefenseTotal = Sum(battlesNumber*topDefense, 1, max, i)

 

ratioDamage  = playerDamageTotal  / topDamageTotal

ratioFrags   = playerFragsTotal   / topFragsTotal

ratioSpots   = playerSpotsTotal   / topSpotsTotal

ratioDefense = playerDefenseTotal / topDefenseTotal

 

for(i=1; i<=max; i++)

{ratioWinsPre = playerWins / topWins}

 

ratioWins = Sum(battlesNumber * ratioWinsPre, 1, max, i) / battlesNumberTotal

 

wnDamage  =  * ratioDamage             * weightDamage

wnFrags   =  * ratioFrags              * weightFrags

wnSpots   =  * ratioSpots              * weightSpots

wnDefense =  * ratioDefense            * weightDefense

wnWins    =  * WinsFunction(ratioWins) * weightWins

 

WN8 = Min(battlesNumberTotal/100, 1) * (scaleFactor * wnDamage + wnFrags + wnSpots + wnDefense + wnWins)

 

return WN8

 

Looks good and I'm starting to see the whole picture. I have a couple of questions though.

 

1. What does Sum() do? Can you show the subroutine for that?

2. You didn't didn't define max. What is it?

 

That's all I have after a quick lookover. I might have more after I look at it more closely.

Share this post


Link to post
Share on other sites

Generally, this ratioWins value is broken. We'll work out some other way to calculate it, but it's actually rather difficult in this case.

 

Looks good and I'm starting to see the whole picture. I have a couple of questions though.

 

1. What does Sum() do? Can you show the subroutine for that?

2. You didn't didn't define max. What is it?

 

That's all I have after a quick lookover. I might have more after I look at it more closely.

It's in the previous post.

 

Sum(f(x), rangeMin, rangeMax, ind) = // I am aware this is abuse of notation. This is just for demonstration.

{var sum;

sum = 0

for(ind=rangeMin; ind<=rangeMax; ind++)

    {sum += f(ind)}

return sum}

Share this post


Link to post
Share on other sites

  • Recently Browsing   0 members

    No registered users viewing this page.