林轩田 机器学习基石 作业3 logistics回归(随机梯度下降法) 18-20题 python2.7

林轩田 机器学习基石 作业3 logistics回归(随机梯度下降法) 18-20题 python2.7

训练集来自https://d396qusza40orc.cloudfront.net/ntumlone%2Fhw3%2Fhw3_train.dat
测试集来自https://d396qusza40orc.cloudfront.net/ntumlone%2Fhw3%2Fhw3_test.dat

希望大家能够提建议,谢谢

草稿代码如下

# -- coding: utf-8 --
from numpy import *
def loadData(filename,Shuffle=False):
    fr=open(filename)
    data_feature=[]
    label=[]
    for line in fr.readlines():
        line=line.strip()##去掉头尾的空格或者Tab
        curLine=line.split(' ')##以‘ ’为标准将string转换成list

        # Numpy库的ndarray数组可以方便地进行各种多维数据处理工作
        # 可是它最大的缺点就是不可动态扩展——“NumPy的数组没有这种动态改变大小的功能,numpy.append()
        # 函数每次都会重新分配整个数组,并把原来的数组复制到新数组中。”
        curLine=map(float,curLine)
        label.append(curLine[-1])
        curLine[-1]=1
        data_feature.append(curLine)
    return array(data_feature),array(label)
 #普通梯度下降法的Ein计算方法
def Ein_Get_Wt(feature,label,W,k):
    Wt=W
    m, n = shape(feature)
    WtXn = dot(feature, Wt)
    WtXn = WtXn * (-label)
    WtXn = sigmod(WtXn)
    temp = label.repeat(n).reshape(m, n)
    YX = feature * (-temp)
    temp = WtXn.repeat(n).reshape(m, n)
    Ein = YX * temp
    Ein = average(Ein, axis=0)
    Wt=Wt-k*Ein
    return Wt

def stochastic_gradient_descent(w,feature,label):
    temp=sigmod(dot(w,feature)*(-label))
    Ein=(-label)*temp*feature
    return Ein

def sigmod(inx):
    return exp(inx)/(1+exp(inx))
##sgd为随机梯度下降法的开关
def logistic_train_model_gradient(feature,label,sgd=False,count=2000,k=0.01):
    m,n=shape(feature)
    Wt=zeros(n)
    if not sgd:
        for i in range(count):
            Wt=Ein_Get_Wt(feature,label,Wt,k)
    else:
        index=0
        for i in range(count):
            if index>=shape(feature)[0]:
                index=0
            Ein=stochastic_gradient_descent(Wt,feature[index],label[index])
            Wt=Wt-k*Ein
            index+=1
    return Wt
def error_rate(wt,test_feature,test_label):
    rate=0
    error_count=0
    total_num=shape(test_feature)[0]
    print total_num
    test_result=dot(test_feature,wt)
    for i in range(total_num):
        if test_result[i]>=0:
            test_result[i]=1
        else:
            test_result[i]=-1
        if test_result[i]!=test_label[i]:
            error_count+=1
    print error_count/float(total_num)
feature,label=loadData("train_data.txt")
Wt=logistic_train_model_gradient(feature,label,False)
test_feature,test_label=loadData("test_data.txt")
error_rate(Wt,test_feature,test_label)

猜你喜欢

转载自blog.csdn.net/m0_37534550/article/details/82949859