機器學習基石 作業四
阿新 • • 發佈:2018-12-06
機器學習基石 作業四
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 對這個目標函式進行求導得到 ,因此得到答案。
13 從這裡開始是程式設計題。這裡要說一個問題。剛開始的時候我使用了np.mat來格式化X,結果在得到結果的時候無論如何也對不上選項。卡了好久,看了一下別人的實現,用的是np.dot來對array格式的資料進行矩陣運算結果就好了。想了一下是因為計算過程中精度的問題,因為 有的值很小,精度不夠的話結果可能體現不出區別。實現的過程其實沒什麼好說的,就是很簡單的套用公式即可,程式碼放在最後面。
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()
完結撒花,技法再會。