机器学习基石笔记:Homework #2 Decision Stump相关习题

问题描述

图1 16-18

图2 19-20

程序实现

17-18

# coding: utf-8

import numpy as np
import matplotlib.pyplot as plt


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

def gen_data():
    data_X=np.random.uniform(-1,1,(20,1))# [-1,1)
    data_Y=np.zeros((20,1))
    idArray=np.random.permutation([i for i in range(20)])
    for i in range(20):
        if(i<20*0.2):
            data_Y[idArray[i]][0]=-sign(data_X[idArray[i]][0])
        else:
            data_Y[idArray[i]][0] = sign(data_X[idArray[i]][0])
    data=np.concatenate((data_X,data_Y),axis=1)
    return data

def decision_stump(dataArray):
    minErrors=20
    min_s_theta_list=[]
    num_data=dataArray.shape[0]
    data=dataArray.tolist()
    data.sort(key=lambda x:x[0])
    for s in [-1.0,1.0]:
        for i in range(num_data):
            if(i==num_data-1):
                theta=(data[i][0]+1.0)/2
            else:
                theta=(data[i][0]+data[i+1][0])/2
            errors=0
            for i in range(20):
                pred=s*sign(data[i][0]-theta)
                if(pred!=data[i][1]):
                    errors+=1
            if(minErrors>errors):
                minErrors=errors
                min_s_theta_list=[]
            elif(minErrors<errors):
                continue
            min_s_theta_list.append((s, theta))
    i=np.random.randint(low=0,high=len(min_s_theta_list))
    min_s,min_theta=min_s_theta_list[i]
    return minErrors,min_s,min_theta

def computeEinEout(minErrors,min_s,min_theta):
    Ein=minErrors/20
    Eout=0.5+0.3*min_s*(abs(min_theta)-1)
    return Ein,Eout


if __name__=="__main__":
    Ein_list=[]
    Eout_list=[]
    for i in range(5000):
        dataArray=gen_data()
        minErrors,min_s,min_theta=decision_stump(dataArray)
        Ein,Eout=computeEinEout(minErrors,min_s,min_theta)
        Ein_list.append(Ein)
        Eout_list.append(Eout)

    # show results
    # 17 & 18
    print("the average Ein: ",sum(Ein_list)/5000)
    print("the average Eout: ",sum(Eout_list)/5000)

    plt.figure(figsize=(16,6))
    plt.subplot(121)
    plt.hist(Ein_list)
    plt.xlabel("Ein")
    plt.ylabel("frequency")
    plt.subplot(122)
    plt.hist(Eout_list)
    plt.xlabel("Eout")
    plt.ylabel("frequency")
    plt.savefig("EinEout.png")

19-20

# coding: utf-8

import numpy as np

def read_data(dataFile):
    with open(dataFile, 'r') as file:
        data_list = []
        for line in file.readlines():
            line = line.strip().split()
            data_list.append([float(l) for l in line])
        data_array = np.array(data_list)
        return data_array

def predict(s,theta,dataX):
    num_data=dataX.shape[0]
    res=s*np.sign(dataX-theta)
    return res

def decision_stump(dataArray):
    min_s_theta_list=[]
    num_data=dataArray.shape[0]
    minErrors=num_data
    data=dataArray.tolist()
    data.sort(key=lambda x:x[0])
    dataArray=np.array(data)
    dataX=dataArray[:,0].reshape(num_data,1)
    dataY=dataArray[:,1].reshape(num_data,1)
    for s in [-1.0,1.0]:
        for i in range(num_data):
            if(i==num_data-1):
                theta=(dataX[i][0]*2+1)/2
            else:
                theta=(dataX[i][0]+dataX[i+1][0])/2
            pred=predict(s,theta,dataX)
            errors=np.sum(pred!=dataY)
            if(minErrors>errors):
                minErrors=errors
                min_s_theta_list=[]
            elif(minErrors<errors):
                continue
            min_s_theta_list.append((s, theta))
    i=np.random.randint(low=0,high=len(min_s_theta_list))
    min_s,min_theta=min_s_theta_list[i]
    return minErrors,min_s,min_theta

def best_of_best(candidate):
    candidate.sort(key=lambda x:x[1])
    counts=0
    for i in range(len(candidate)):
        if(candidate[i][1]!=candidate[0][1]):
            break
        counts+=1
    i=np.random.randint(low=0,high=counts)
    return candidate[i][0],candidate[i][1],candidate[i][2],candidate[i][3]


if __name__=="__main__":
    data_array=read_data("hw2_train.dat")
    num_data=data_array.shape[0]
    num_dim=data_array.shape[1]-1
    candidate=[]
    dataY=data_array[:,-1].reshape(num_data,1)
    for i in range(num_dim):
        dataX=data_array[:,i].reshape(num_data,1)
        min_errors,min_s,min_theta=decision_stump(np.concatenate((dataX,dataY),axis=1))
        candidate.append([i,min_errors,min_s,min_theta])
    min_id,min_errors,min_s,min_theta=best_of_best(candidate)
    print("the optimal decision stump:\n","s: ",min_s,"\ntheta: ",min_theta)
    print("the Ein of the optimal decision stump:\n",min_errors/num_data)

    test_array=read_data("hw2_test.dat")
    num_test=test_array.shape[0]
    testY=test_array[:,-1].reshape(num_test,1)
    num_dim=test_array.shape[1]-1
    testX=test_array[:,min_id].reshape(num_test,1)
    pred=predict(min_s,min_theta,testX)
    print("the Eout of the optimal decision stump by Etest:\n",np.sum(pred!=testY)/num_test)

运行结果

17-18

图3 17-18结果1

图4 17-18结果2

19-20

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

推荐阅读更多精彩内容