机器学习HW2,logistic二分类的问题,使用adagrad进行梯度下降

本次作业主要针对的是二分类的问题,所以激活函数选用的是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]) 

猜你喜欢

转载自blog.csdn.net/qq_37353105/article/details/80345578