2021年-2022年第二学期《机器学习》课程大作业代码及注释

题目:神经网络预测游戏胜率

代码:

  1 import numpy 
  2 import scipy.special
  3  
  4 class neuralNetwork:
  5     # 初始化
  6     def __init__(self,inputnodes,hiddennodes,outputnodes,learningrate):
  7         # 输入维数
  8         self.inodes=inputnodes
  9         # 隐藏层数
 10         self.hnodes=hiddennodes
 11         # 输出维数
 12         self.onodes=outputnodes
 13         
 14         # 初始化权重值,创建两个链接权重矩阵
 15         self.wih=numpy.random.normal(0.0,pow(self.hnodes,-0.5),(self.hnodes,self.inodes))
 16         self.who=numpy.random.normal(0.0,pow(self.onodes,-0.5),(self.onodes,self.hnodes))
 17         
 18         # 学习率
 19         self.lr=learningrate
 20         
 21         # 激活函数
 22         self.activation_function=lambda x:scipy.special.expit(x)
 23        
 24         pass
 25     
 26     def train(self,inputs_list,targets_list):
 27 
 28         inputs=numpy.array(inputs_list,ndmin=2).T
 29         targets=numpy.array(targets_list,ndmin=2).T
 30         
 31         hidden_inputs=numpy.dot(self.wih,inputs)
 32         hidden_outputs=self.activation_function(hidden_inputs)
 33         
 34         final_inputs=numpy.dot(self.who,hidden_outputs)
 35         final_outputs=self.activation_function(final_inputs)
 36         
 37         output_errors=targets-final_outputs
 38         hidden_errors=numpy.dot(self.who.T,output_errors)
 39         
 40         self.who+=self.lr*numpy.dot((output_errors*final_outputs*(1.0-final_outputs)),numpy.transpose(hidden_outputs))
 41         self.wih+=self.lr*numpy.dot((hidden_errors*hidden_outputs*(1.0-hidden_outputs)),numpy.transpose(inputs))
 42         
 43         pass
 44     
 45     # 给定输入,得到输出
 46     def query(self,inputs_list):
 47         inputs=numpy.array(inputs_list,ndmin=2).T
 48         hidden_inputs=numpy.dot(self.wih,inputs)
 49         hidden_outputs=self.activation_function(hidden_inputs)
 50         
 51         final_inputs=numpy.dot(self.who,hidden_outputs)
 52         final_outputs=self.activation_function(final_inputs)
 53         
 54         return final_outputs
 55 
 56 def main():
 57     #初步准备,读入英雄数据
 58     d = dict()
 59     i = 1
 60     with open("champion.txt",'r',encoding="utf-8") as f:
 61         while(True):
 62             content = f.readline()[0:-1]
 63             if not content:
 64                 break
 65             d[content] = i
 66             i += 1
 67     #print(d)
 68 
 69     #数据准备,读入比赛数据,训练集
 70     X = []
 71     Y = []
 72     with open("match.txt",'r',encoding="utf-8") as f:
 73         while(True):
 74             pick = f.readline()
 75             if not pick:
 76                 break
 77             pick = pick.split(',')
 78             res = f.readline()
 79             for i in range(0,len(pick)):
 80                 if(i == len(pick)-1):
 81                     pick[i] = d[pick[i][0:-1]]
 82                 else:
 83                     pick[i] = d[pick[i]]
 84             X.append(pick)
 85             Y.append([int(res[0:-1])])
 86     #print(X)
 87     #print(Y)
 88 
 89     #训练模型
 90     # 参数,输入维数,输出维数,隐藏层数,学习率
 91     dmin_in = 5
 92     dmin_out = 2
 93     n_hide = 2
 94     learn_rate = 0.0001
 95     nw = neuralNetwork(dmin_in,n_hide,dmin_out,learn_rate)
 96     nw.train(X,Y)
 97 
 98     #测试模型
 99     while(True):
100         test = []
101         flag = 0
102         for i in range(5):
103             s = input("输入英雄全称:")
104             if s == "退出":
105                 flag = 1
106                 break
107             test.append(d[s])
108         if flag == 1:
109             break
110         res = nw.query(test)
111         #print(res)
112         print("该组合胜率为:",end='')
113         print(res[0][0]*100,end='')
114         print("%")
115 
116 main()

 

posted @ 2022-07-01 17:34  不敢说的梦  阅读(795)  评论(0)    收藏  举报