机器学习基石 作业四

机器学习基石 作业四

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()

完结撒花,技法再会。

猜你喜欢

转载自blog.csdn.net/qq_25037903/article/details/84110895
今日推荐