1. 程式人生 > >機器學習基石 作業四

機器學習基石 作業四

機器學習基石 作業四

1 假設函式空間變小了,固定噪聲大體上會變大。因為假設函式與真實函式之間的差距可能變大了。
在這裡插入圖片描述
2 從第三項就等於0的假設函式包含於從第四項係數才等於0的。
在這裡插入圖片描述
3 直接求導
在這裡插入圖片描述
4 因為加正則項相當於對係數加了個限制。如果最優點在那個限制的球內則相等,否則肯定小於不加限制的時候。具體可以看圖理解:
在這裡插入圖片描述
在這裡插入圖片描述
5 計算即可
在這裡插入圖片描述
6.整體過程為,每次隨機猜測兩種結果,下一輪只再發給上次說準的人。也就是從32個開始跟16個人說勝利,另外16個說失敗。第二次在剩下猜對的16人裡繼續對半。所以選擇該項。
在這裡插入圖片描述
7 成本是32+16+8+4+2+1 ×10=630,因此獲利370。
在這裡插入圖片描述


8 這題比較神奇。據說是因為自己推算了一個數學公式,只有一個假設。因此選1。(看了別人的才知道,一臉懵逼)
在這裡插入圖片描述
9 根據Heoffding不等式直接算得。
在這裡插入圖片描述
10 因為原來銀行有的資料是以前使用a(x)篩選後下發銀行卡的人的資料,因此使用AND之後能夠保證跟推算的效果一樣。
在這裡插入圖片描述
11 加正則項求導即可,和原來的推導過程一樣。
在這裡插入圖片描述
12 對這個目標函式進行求導得到 w = ( X
T X + λ I ) 1 X
T
y w=(X^{T}X+\lambda I)^{-1}X^{T}y
,因此得到答案。
在這裡插入圖片描述
13 從這裡開始是程式設計題。這裡要說一個問題。剛開始的時候我使用了np.mat來格式化X,結果在得到結果的時候無論如何也對不上選項。卡了好久,看了一下別人的實現,用的是np.dot來對array格式的資料進行矩陣運算結果就好了。想了一下是因為計算過程中精度的問題,因為 λ \lambda 有的值很小,精度不夠的話結果可能體現不出區別。實現的過程其實沒什麼好說的,就是很簡單的套用公式即可,程式碼放在最後面。
在這裡插入圖片描述

14
在這裡插入圖片描述
15
在這裡插入圖片描述
16
在這裡插入圖片描述
17
在這裡插入圖片描述
18
在這裡插入圖片描述
19
在這裡插入圖片描述
20
在這裡插入圖片描述
程式碼如下:

import numpy as np 
import requests

def getData(url):
    content = requests.get(url).content
    content = content.decode('utf-8')
    x = []
    y = []
    content = content.split('\n')
    for line in content[:-1]:
        data = line.split(' ')
        y.append(int(data[-1]))
        x1 = data[:-1]
        for i in range(len(x1)):
            x1[i] = float(x1[i])
        x.append([1]+x1)
    x = np.array(x)
    y = np.array(y)
    return x,y

def ridgeReg(x,y,lamda):
    identity = lamda*np.eye(len(x[0]))
    w = np.dot(np.dot(np.linalg.inv(np.dot(x.transpose(),x)+identity),x.transpose()),y)
    return w

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

def errorRate(w,x,y):
    yHat = np.dot(w,x.transpose())
    yHat = np.where(yHat>=0,1,-1)
    errorNum = np.sum(np.array(y) != np.array(yHat))
    return errorNum/len(y)

def main():
    print("#13")
    lamda = 10
    trainUrl = 'https://www.csie.ntu.edu.tw/~htlin/mooc/datasets/mlfound_algo/hw4_train.dat'
    testUrl = 'https://www.csie.ntu.edu.tw/~htlin/mooc/datasets/mlfound_algo/hw4_test.dat'
    X,Y = getData(trainUrl)
    testX,testY = getData(testUrl)
    w = ridgeReg(X,Y,lamda)
    errorIn = errorRate(w,X,Y)
    errorOut = errorRate(w,testX,testY)
    print("in sample error:",errorIn)
    print("out of sample error:",errorOut)

    print("#14,15")
    for i in range(13):
        lamda = pow(10,i-10)
        w = ridgeReg(X,Y,lamda)
        errorIn = errorRate(w,X,Y)
        errorOut = errorRate(w,testX,testY)
        print("log:",i-10,"in:",errorIn,"out:",errorOut)
    
    print("#16,17")
    valX = X[120:]
    valY = Y[120:]
    trainX = X[:120]
    trainY = Y[:120]
    for i in range(13):
        lamda = pow(10,i-10)
        w = ridgeReg(trainX,trainY,lamda)
        errorIn = errorRate(w,trainX,trainY)
        errorVal = errorRate(w,valX,valY)
        errorOut = errorRate(w,testX,testY)
        print("log:",i-10)
        print("in:",errorIn,"validataion:",errorVal,"out:",errorOut)

    print("#18")
    lamda = 1
    w = ridgeReg(X,Y,lamda)
    errorIn = errorRate(w,X,Y)
    errorOut = errorRate(w,testX,testY)
    print("in:",errorIn,"out:",errorOut)

    print("#19")
    lamda = 1
    for k in range(13):
        lamda = pow(10,k-10)
        errorVal = 0
        for i in range(1,6):
            XL = X.tolist()
            YL = Y.tolist()
            trainX = XL[:(i-1)*40]+XL[i*40:]
            trainX = np.array(trainX)
            trainY = YL[:(i-1)*40]+YL[i*40:]
            trainY = np.array(trainY)
            valX = XL[(i-1)*40:i*40]
            valX = np.array(valX)
            valY = YL[(i-1)*40:i*40]
            valY = np.array(valY)
            w = ridgeReg(trainX,trainY,lamda)
            errorVal += errorRate(w,valX,valY)
        print("log:",k-10,"cv:",errorVal/5)

    print("#20")
    lamda = pow(10,-8)
    w = ridgeReg(X,Y,lamda)
    errorIn = errorRate(w,X,Y)
    errorOut = errorRate(w,testX,testY)
    print("in:",errorIn,"out:",errorOut)


if __name__ == '__main__':
    main()

完結撒花,技法再會。