机器学习基石笔记:Homework #3 LinReg&LogReg相关习题

问题描述

图1 13

图2 14-15

图3 18

图4 19-20

程序实现

13-15

# coding: utf-8

import numpy as np
import numpy.random as random
import matplotlib.pyplot as plt

def sign(x):
    if(x>=0):
        return 1
    else:
        return -1

def gen_data():
    x1=random.uniform(-1,1,1000)
    x2=random.uniform(-1,1,1000)
    id_array=random.permutation([i for i in range(1000)])
    dataY=np.zeros((1000,1))
    for i in range(1000):
        if(i<1000*0.1):
            i = id_array[i]
            dataY[i][0]=-sign(x1[i]**2+x2[i]**2-0.6)
        else:
            i = id_array[i]
            dataY[i][0]=sign(x1[i]**2+x2[i]**2-0.6)
    dataX=np.concatenate((np.ones((1000,1)),np.array(x1).reshape((1000,1)),np.array(x2).reshape((1000,1))),axis=1)
    return dataX,dataY

def w_lin(dataX,dataY):
    dataX_T=np.transpose(dataX)
    tmp=np.dot(np.linalg.inv(np.dot(dataX_T,dataX)),dataX_T)
    return np.dot(tmp,dataY)

def pred(dataX,wLIN):
    pred=np.dot(dataX,wLIN)
    num_data=dataX.shape[0]
    for i in range(num_data):
        pred[i][0]=sign(pred[i][0])
    return pred

def zero_one_cost(pred,dataY):
    return np.sum(pred!=dataY)/dataY.shape[0]

def feat_transform(dataX):
    num_data=dataX.shape[0]
    tmp1=dataX[:,1]*dataX[:,2]
    tmp2=dataX[:,1]**2
    tmp3=dataX[:,2]**2
    new_dataX=np.concatenate(
        (dataX,tmp1.reshape((num_data,1)),tmp2.reshape((num_data,1)),tmp3.reshape((num_data,1))),axis=1)
    return new_dataX


if __name__=="__main__":

    cost_list=[]
    for i in range(1000):
        dataX,dataY=gen_data()
        wLIN=w_lin(dataX,dataY)
        cost_list.append(zero_one_cost(pred(dataX,wLIN),dataY))
    # show results
    print("the average Ein over 1000 experiments: ",sum(cost_list)/len(cost_list))
    plt.figure()
    plt.hist(cost_list)
    plt.xlabel("zero_one Ein")
    plt.ylabel("frequency")
    plt.title("13")
    plt.savefig("13.png")

    W=[]
    cost_list=[]
    for i in range(1000):
        # train
        dataX,dataY=gen_data()
        dataX=feat_transform(dataX)
        wLIN=w_lin(dataX,dataY)
        W.append(wLIN[:,0].tolist())
        # test
        testX, testY = gen_data()
        testX = feat_transform(testX)
        cost_list.append(zero_one_cost(pred(testX, wLIN), testY))
    min_cost=min(cost_list)
    min_id=cost_list.index(min_cost)
    print(W[min_id])
    W=np.array(W)
    # show w3
    print("the average w3 over 1000 experiments: ",np.average(W,axis=0)[3])
    plt.figure()
    plt.hist(W[:,3].tolist())
    plt.xlabel("w3")
    plt.ylabel("frequency")
    plt.title("14")
    plt.savefig("14.png")
    # show Eout
    print("the average Eout over 1000 experiments: ",sum(cost_list)/len(cost_list))
    plt.figure()
    plt.hist(cost_list)
    plt.xlabel("Eout")
    plt.ylabel("frequency")
    plt.title("15")
    plt.savefig("15.png")

18-20

# coding: utf-8

import numpy as np

def sigmoid(x):
    return 1/(1+np.e**(-x))

def read_data(dataFile):
    with open(dataFile,'r') as f:
        lines=f.readlines()
        data_list=[]
        for line in lines:
            line=line.strip().split()
            data_list.append([1.0] + [float(l) for l in line])
        dataArray=np.array(data_list)
        num_data=dataArray.shape[0]
        num_dim=dataArray.shape[1]-1
        dataX=dataArray[:,:-1].reshape((num_data,num_dim))
        dataY=dataArray[:,-1].reshape((num_data,1))
        return dataX,dataY

def gradient_descent(w,dataX,dataY,eta):
    assert w.shape[0]==dataX.shape[1],"wrong shape!"
    assert w.shape[1]==1,"wrong shape of w!"
    num_data=dataX.shape[0]
    num_dim=dataX.shape[1]
    tmp1=-dataY*dataX
    tmp2=-dataY*np.dot(dataX,w)
    for i in range(num_data):
        tmp2[i][0]=sigmoid(tmp2[i][0])
    tmp3=np.average(tmp1 * tmp2, axis=0)
    new_w=w-eta*tmp3.reshape((num_dim,1))
    return new_w

def s_gradient_descent(w,dataX,dataY,eta):
    assert w.shape[0]==dataX.shape[1],"wrong shape!"
    assert w.shape[1]==1,"wrong shape of w!"
    assert dataX.shape[0]==1,"wrong shape of x!"
    assert dataY.shape[0]==1,"wrong shape of y!"
    num_dim=dataX.shape[1]
    tmp1=-dataY*dataX
    tmp2=-dataY*np.dot(dataX,w)
    tmp2[0][0]=sigmoid(tmp2[0][0])
    tmp3=np.average(tmp1 * tmp2, axis=0)
    new_w=w-eta*tmp3.reshape((num_dim,1))
    return new_w

def pred(wLOG,dataX):
    pred=np.dot(dataX,wLOG)
    num_data=dataX.shape[0]
    for i in range(num_data):
        pred[i][0]=sigmoid(pred[i][0])
        if(pred[i][0]>=0.5):
            pred[i][0]=1
        else:
            pred[i][0]=-1
    return pred

def zero_one_cost(pred,dataY):
    return np.sum(pred!=dataY)/dataY.shape[0]


if __name__=="__main__":
    # train
    dataX,dataY=read_data("hw3_train.dat")
    num_dim=dataX.shape[1]
    w=np.zeros((num_dim,1))
    print("\n18")
    for i in range(2000):
        w=gradient_descent(w,dataX,dataY,eta=0.001)
    print("the weight vector within g: ",w[:,0])
    # test
    testX,testY=read_data("hw3_test.dat")
    Eout=zero_one_cost(pred(w,testX),testY)
    print("the Eout(g) on the test set: ",Eout)

    print("\n18.1")
    w = np.zeros((num_dim, 1))
    for i in range(20000):
        w = gradient_descent(w, dataX, dataY, eta=0.001)
    print("the weight vector within g: ", w[:, 0])
    # test
    Eout = zero_one_cost(pred(w, testX), testY)
    print("the Eout(g) on the test set: ", Eout)

    print("\n19")
    w=np.zeros((num_dim,1))
    for i in range(2000):
        w = gradient_descent(w, dataX, dataY, eta=0.01)
    print("the weight vector within g: ", w[:, 0])
    # test
    Eout = zero_one_cost(pred(w, testX), testY)
    print("the Eout(g) on the test set: ", Eout)

    print("\n20")
    w=np.zeros((num_dim,1))
    num_data=dataX.shape[0]
    for i in range(2000):
        i%=num_data
        x=dataX[i,:].reshape((1,num_dim))
        y=dataY[i,:].reshape((1,1))
        w=s_gradient_descent(w,x,y,eta=0.001)
    print("the weight vector within g: ", w[:, 0])
    # test
    Eout = zero_one_cost(pred(w, testX), testY)
    print("the Eout(g) on the test set: ", Eout)

运行结果及分析

13-15

图5 13-15结果1

图6 13-15结果2

图7 13-15结果3

图8 13-15结果4

18-20

图9 18-20结果

对比18和18.1,可知迭代步长较小时,需要较多迭代次数才能达到较优效果。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容