训练神经网络预测纸牌游戏的赢家
Training a neural net to predict the winner of a card game
在拼牌游戏中有 2 名玩家,每人发 5 张牌(标准的 52 张牌),之后一些任意函数决定获胜玩家。目标是根据每个玩家持有的 5 张牌来预测游戏的结果。训练数据可能如下所示:
Player A Player B Winner
AsKs5d3h2d JcJd8d7h6s 1
7h5d8s9sTh 2c3c4cAhAs 0
6d6s6h6cQd AsKsQsJsTs 0
其中'Player'列为5手牌,'Winner'列为1
玩家A赢,0
玩家A输。
应该对手的顺序无差异,这样在训练后,向网络提供镜像输入数据,如:
Player A Player B
2d3d6h7s9s TsTdJsQc3h
和
Player A Player B
TsTdJsQc3h 2d3d6h7s9s
总是会预测相反的结果。
也应该不关心手牌本身的顺序,例如AsKsQsJsTs
与JsTsAsKsQs
相同,与JsQsTsAsKs
相同等。
构建神经网络及其训练数据以解决此类问题的合理方法有哪些?
首先,在继续这个问题之前,您应该了解神经网络 (NN) 的使用。 NN 试图找出输入和输出之间的复杂关系。 (这里你的输入是五张牌,输出是预测 class)。
在这个问题中,输入和输出之间的关系很容易表述。也就是说,您可以轻松地选择一些规则来宣布最终获胜者。
还是和其他问题一样,这个问题也可以用NN来处理。首先你需要准备你的数据。
共有 52 种可能的输入类型。因此,在数据集中取 52 列。现在在这 52 列中,您可以填写三种类型的分类数据。它要么属于 'A' 或 'B',要么不属于主体。 'C' 和输出可以是赢家。
现在您可以使用神经网络对其进行训练了。
您将需要一个具有 104 个输入(玩家 * 卡片数量)的网络
前 52 个输入对应玩家 A,接下来的 52 个对应玩家 B。
将所有输入初始化为0,然后对于每个玩家拥有的每张牌,将相应的输入设置为1。
对于输出层,二进制分类通常有两种选择。你可以有一个输出神经元,如果这个神经元的输出大于某个阈值,则玩家 A 获胜,否则玩家 B 获胜。或者你可以有两个输出神经元,只看哪一个产生最高的输出。两者通常都可以正常工作。
对于训练数据,而不是 "AsKs5d3h2d",您将需要一个单热编码,例如“0001000001000000100100000100000000011001000000001001”(假设有 104 个数字,其中 10 个为 1,其余为 0 ) 对于输出数据,你只需要一个 1 或 0 对应于谁赢了(在有一个输出神经元的情况下)
这将使您的网络对牌的顺序不变(给定手牌的所有可能顺序将创建相同的输入)至于交换玩家 A 和 B 的手牌并得到相反的结果,这是任何训练有素的网络都应该很自然。
在拼牌游戏中有 2 名玩家,每人发 5 张牌(标准的 52 张牌),之后一些任意函数决定获胜玩家。目标是根据每个玩家持有的 5 张牌来预测游戏的结果。训练数据可能如下所示:
Player A Player B Winner
AsKs5d3h2d JcJd8d7h6s 1
7h5d8s9sTh 2c3c4cAhAs 0
6d6s6h6cQd AsKsQsJsTs 0
其中'Player'列为5手牌,'Winner'列为1
玩家A赢,0
玩家A输。
应该对手的顺序无差异,这样在训练后,向网络提供镜像输入数据,如:
Player A Player B
2d3d6h7s9s TsTdJsQc3h
和
Player A Player B
TsTdJsQc3h 2d3d6h7s9s
总是会预测相反的结果。
也应该不关心手牌本身的顺序,例如AsKsQsJsTs
与JsTsAsKsQs
相同,与JsQsTsAsKs
相同等。
构建神经网络及其训练数据以解决此类问题的合理方法有哪些?
首先,在继续这个问题之前,您应该了解神经网络 (NN) 的使用。 NN 试图找出输入和输出之间的复杂关系。 (这里你的输入是五张牌,输出是预测 class)。
在这个问题中,输入和输出之间的关系很容易表述。也就是说,您可以轻松地选择一些规则来宣布最终获胜者。
还是和其他问题一样,这个问题也可以用NN来处理。首先你需要准备你的数据。
共有 52 种可能的输入类型。因此,在数据集中取 52 列。现在在这 52 列中,您可以填写三种类型的分类数据。它要么属于 'A' 或 'B',要么不属于主体。 'C' 和输出可以是赢家。
现在您可以使用神经网络对其进行训练了。
您将需要一个具有 104 个输入(玩家 * 卡片数量)的网络 前 52 个输入对应玩家 A,接下来的 52 个对应玩家 B。 将所有输入初始化为0,然后对于每个玩家拥有的每张牌,将相应的输入设置为1。
对于输出层,二进制分类通常有两种选择。你可以有一个输出神经元,如果这个神经元的输出大于某个阈值,则玩家 A 获胜,否则玩家 B 获胜。或者你可以有两个输出神经元,只看哪一个产生最高的输出。两者通常都可以正常工作。
对于训练数据,而不是 "AsKs5d3h2d",您将需要一个单热编码,例如“0001000001000000100100000100000000011001000000001001”(假设有 104 个数字,其中 10 个为 1,其余为 0 ) 对于输出数据,你只需要一个 1 或 0 对应于谁赢了(在有一个输出神经元的情况下)
这将使您的网络对牌的顺序不变(给定手牌的所有可能顺序将创建相同的输入)至于交换玩家 A 和 B 的手牌并得到相反的结果,这是任何训练有素的网络都应该很自然。