本次作业主要针对的是二分类的问题,所以激活函数选用的是sigmoid函数,误差函数使用的是cross entropy,可以很方便的计算weight和bias的偏导。
最后的结果在0.91左右。
# -*- coding: utf-8 -*-
"""
Created on Wed May 16 16:51:13 2018
@author: 被遗弃的庸才
"""
import numpy as np
#import matplotlib.pyplot as plt
xandy=[]
with open('train-classification.txt') as files:
while True:
line=files.readline()
if line.strip():
for j in range(1,59):
xandy.append(float(line.split(',')[j]))
#pass
#print()#换行
else:
break
xandy=np.array(xandy).reshape(4001,58)#得到的是4001行,57x,1列y的值
#随机给出x和y的值
#w=np.random.randn(57,1)
w=np.random.randn(57,1)
b=np.random.randn(1)
lr=10#手动调学习率
literator=10000#迭代次数为10000次
sum_gradient_w1=np.zeros([57,1])
sum_gradient_b=0
cost=[]
hen=[]
for j in range(literator):
y=np.dot(xandy[:,0:57],w)+b
active=1/(1+np.exp(-y))
#print(np.log(1-active))
#cost.append(-sum(xandy[:,57].reshape(4001,1)*np.log(active)+(1-xandy[:,57]).reshape(4001,1)*np.log(1-active))/xandy[:,57].size)
gradient_w=-np.dot(xandy[:,0:57].transpose(),(xandy[:,57].reshape(4001,1)-active))/xandy[:,57].size
gradient_b=-sum((xandy[:,57].reshape(4001,1)-active))/xandy[:,57].size
# w-=gradient_w*lr
#b-=gradient_b*lr
hen.append(j)
#print(sum_gradient_w1.shape)
sum_gradient_w1+=gradient_w**2
ada_w=np.sqrt(sum_gradient_w1)
w=w-lr*gradient_w/ada_w
sum_gradient_b+=gradient_b**2
ada_b=np.sqrt(sum_gradient_b)
b=b-lr*gradient_b/ada_b
#print(cost)
for i in range(xandy[:,57].size):
if active[i]>0.5:
active[i]=1
else:
active[i]=0
contss=0
for i in range(xandy[:,57].size):
if active[i]== xandy[i,57]:
contss+=1
print(contss)
#plt.plot(hen[100:1000],cost[100:1000])