如何设计硬币翻转游戏的“机器学习”方法

时间:2014-11-26 05:27:10

标签: java machine-learning

我正在完成一个算法课,教授希望我们在“机器学习”中进行练习我几乎可以在项目中自由统治,但是,它必须属于监督学习的总体范围。所以,我决定用计算机播放器进行投注进行硬币翻转模拟。我的想法是让硬币偏向,看看计算机是否可以通过使用训练数据下注时发现偏差。我真的不确定如何处理这个......

我的想法是增加一个胜利计数器并将其作为一个参数传递给一个方法,当在100轮投注的训练轮次之后确定投注时。这样,计算机播放器可以决定放置更多的头部,例如,如果头部有90%的可能性。经过充分的培训后,我认为计算机会发现偏见。

我在这里有代码根据结果增加一个胜利计数器,但是,我不确定从那里去哪里。 I.E.如果它是一场胜利,如果头部或尾部出现,然后使用该信息将赌注押在下一轮中,如何保存相应的数据。任何建议将不胜感激。如果有人认为我这样走错了,我也愿意使用不同的方法。

请记住,我是大学二年级学生,对实际的机器学习技术知之甚少,因此在我的问题中引用了引号。

public class CoinFlip {

  public static void main(String[] args) {
    int bank = 500;
    int headsCount=0;
    int tailsCount=0;
    int winCounter=0;
    int lossCounter=0;
    String[] flipResults = new String[100];

    ComputerPlayer randomPlayer = new ComputerPlayer();
    Coin coin = new Coin();

    for (int i = 0; i < 100; i++) {
        randomPlayer.placeRandomBet();
        flipResults[i] = coin.flip();
        if(flipResults[i].equals("heads")){
            headsCount += 1;
        }
        else{
            tailsCount +=1;
        }
        if(flipResults[i].equals(randomPlayer.placeRandomBet())){
            bank += 50;
            winCounter+=1;
        }
        if(!flipResults[i].equals(randomPlayer.placeRandomBet())){
            bank -=50;
            lossCounter+=1;
    }
  }
}

public static class ComputerPlayer{

      double bet;
      String heads = "heads";
      String tails = "tails";

    public String placeRandomBet(){
        bet = Math.random();
        if(bet < .5){
            return heads;
        }
        else return tails;
    }

    public static String placeLearnedBet(int wins; int losses){
        //not sure where to start
    }

public static class Coin {

        double coin;
        String heads = "heads";
        String tails = "tails";

    public String flip() {
        if (Math.random() < .9) {
            return heads;
        } else {
            return tails;
        }
    }

}

2 个答案:

答案 0 :(得分:1)

如果你知道硬币是均匀分布的,那么你应该总是选择多数。如果您不知道硬币的分布,那么您想要使用称为随机加权多数(Regret Minimization)的算法。该算法基本上表明你应该选择概率#head / #flips的头。就重量而言,如果您知道硬币是均匀分布的,那么您可以估计偏差并计算估计的方差。随着翻转次数的增加,方差会像翻转次数的平方根一样下降。你的投注应该适当增加。 IMO的权重使得问题不那么明显。你的目标是什么?为了优化您的总预期收益?如果是这样,那么不清楚你是否应该下注,直到最后一次硬币翻转,此时你的差异最小,然后下注你所有的钱。然而,这种策略并没有最大限度地减少您的差异,因为您的所有资金都在于一次下注。此外,如果硬币没有偏见,最好不要下注或下注所有的钱。在这两种情况下,您都有0个预期收益但差异很大。

答案 1 :(得分:1)

就找到偏见而言,这并不是那么困难。基本上,你只是根据总比赛数量中的头数来猜测偏差,这个比率会给你平均偏差。因此,例如,如果你有51个头和49个尾巴,那么你会猜测对头部的偏差是51%。

最终,我认为Benjy是正确的,你应该根据哪个更有可能(根据你的偏见)下注(正面或反面)。随着您获得越来越多的样本,您猜测的偏差将会收敛到实际偏差。就投注而言,从期望的角度来看,你应该尽可能多地下注;但从现实的角度来看,这不是一个好的策略(因为如果你总是赌一切,除非硬币100%偏向某种方式,否则你最终会失去一切)。

可能的投注策略可能是“前瞻性”,即假设您将在接下来的n轮中进行相同的投注,并计算您将赢和输的概率。你没有直接试图找到下注金额,而是试图找到给出一定成功概率的数字n(向前看的轮数)。投注方案风险越大,所接受的成功概率越小(即方案风险越大),投注方案越保守,则接受的成功概率越大。一旦你找到保证你成功所需的轮次数(在你选择的概率范围内),你可以将你的底池除以预期轮次数,即下注最大数量,这样如果你在接下来的n轮中失去每一轮,你仍然可以下注。

你可以看到,如上所述,一个保守的方案需要越来越多的前轮,因此下注会越来越小,而有风险的方案,成功的概率很小,因此需要更少的轮数和允许为了更大的赌注。

最后一件有趣的事情是决定你应该选择一个方案的风险。基于我的所作所为,硬币的偏差越小(即头部或尾部的概率越接近50%),你应该有更高的风险,并且更多偏向硬币(即说90%的几率)尾巴或90%的几率)你的投注应该是风险。这种情况是有道理的,因为如果硬币是完全公平的,那么就没有通常会赢得的投注计划,所以你最好只做大赌注,并且有50%的机会让你名列前茅。另一方面,如果硬币极度偏向,则游戏本身风险不大,因此您的投注方案不需要非常危险。在后一种情况下,如果你倾向于进行大赌注,那么你增加了你失去一切的机会而不是那些几乎可以保证获得巨额回报的小赌注。请记住,随着你的底池越来越大,你可以在不增加赔钱风险的情况下进行越来越大的投注,因此如果硬币非常偏向,你的底池中的指数增长就很容易了。