题目来源:华为2020软挑热身赛
题目源文件:https://github.com/CatKungfu/huawei2020-LR
神经网络思路分析请看上一个解说视频:https://www.bilibili.com/video/BV1CK4y1A7jS/
本期博客视频版:https://www.bilibili.com/video/BV1xg411G7Dx/
#date:2021-05-31 #author:会武术的白猫 #theme:神经网络 import numpy as np def read_train_data():#读取txt数据并整理成可以处理类型 with open("data/train_data.txt",'r')as f: content=f.readlines() result_x=[] answer_Y=[] for item in content: jtem=item.split(',') answer_Y.append(int(jtem[-1])) jtem.pop(-1) result_x.append([float(i) for i in jtem]) return [result_x,answer_Y] def read_predict_data():#同上 with open("data/test_data.txt",'r')as f: content=f.readlines() result_x=[] for item in content: jtem=item.split(',') result_x.append([float(i) for i in jtem]) return result_x def read_answer_data():#同上 with open("data/answer.txt",'r')as f: content=f.readlines() answer_Y=[int(i) for i in content] return answer_Y def sigmod(x):#激活函数计算 return 1/(1+np.exp(-x)) def der_sigmod(x):#激活函数的导数计算 return sigmod(x)*(1-sigmod(x)) def train():#训练函数,算出k权值矩阵和w权值矩阵 res=read_train_data() result_x=res[0] answer_Y=res[1] n=len(result_x[0]) error_min=0.001 study=0.1 nerve_num=8 weight_k=np.random.random(size=(n,4)) weight_w=np.random.random(size=(4,1)) for i in range(len(result_x)): item=np.array(result_x[i]) nerve_a=np.dot(item,weight_k).reshape(1,4) nerve_o=np.array([sigmod(j) for j in nerve_a]).reshape(1,4) y1=np.dot(nerve_o,weight_w) y2=sigmod(y1) L=(answer_Y[i]-y2)*(answer_Y[i]-y2)/float(2) if L<error_min:break mid=(y2-answer_Y[i])*der_sigmod(y1) weight_w-=study*mid*nerve_o.T mid_w=weight_w*(np.array([sigmod(j) for j in nerve_a]).T) weight_k-=study*mid*np.dot(mid_w,item.reshape(1,n)).T #return [weight_k,weight_w] return [weight_k,weight_w] def predict():#读取数据给出预测二分类,计算正确率 result_x=read_predict_data() res=train() weight_k=res[0] weight_w=res[1] nerve_a=np.dot(np.array(result_x),weight_k) nerve_o=np.array([sigmod(nerve_a[i][j]) for i in range(len(result_x)) for j in range(4)]).reshape(len(result_x),4) y1=np.dot(nerve_o,weight_w) y2=[sigmod(i) for i in y1] answer_Y=read_answer_data() num=0 for i in range(len(answer_Y)): if (y2[i]>=0.5 and answer_Y[i]==1) or (y2[i]<0.5 and answer_Y[i]==0): num+=1 result=num/float(len(result_x)) print("正确率为{}%".format(result*100)) #read_train_data() #read_predict_data() #read_answer_data() #train() predict()