【作业4】林轩田机器学习基石

作业四的代码题目主要是基于ridge regression来做的,并加上了各种cross-validation的情况。

由于ridge regression是有analytic solution,所以直接求逆矩阵就OK了,过程并不复杂。只有在做cross-validation的时候遇上了些问题。

#encoding=utf8
import sys
import numpy as np
import math
from random import *

# read input data ( train or test )
def read_input_data(path):
    x = []
    y = []
    for line in open(path).readlines():
        items = line.strip().split(‘ ‘)
        tmp_x = []
        for i in range(0,len(items)-1): tmp_x.append(float(items[i]))
        x.append(tmp_x)
        y.append(float(items[-1]))
    return np.array(x),np.array(y)

def calculate_W_rigde_regression(x,y,LAMBDA):
    Z_v = np.linalg.inv(np.dot(x.transpose(),x)+LAMBDA*np.eye(x.shape[1]))
    return  np.dot(np.dot(Z_v,x.transpose()),y)

# test result
def calculate_E(w, x, y):
    scores = np.dot(w, x.transpose())
    predicts = np.where(scores>=0,1.0,-1.0)
    Eout = sum(predicts!=y)
    return (Eout*1.0) / predicts.shape[0]

if __name__ == ‘__main__‘:

    # prepare train and test data
    x,y = read_input_data("train.dat")
    x = np.hstack((np.ones(x.shape[0]).reshape(-1,1),x))
    test_x,test_y = read_input_data("test.dat")
    test_x = np.hstack((np.ones(test_x.shape[0]).reshape(-1,1),test_x))
    # lambda
    LAMBDA_set = [ i for i in range(2,-11,-1) ]

    ## Q13~Q15
    min_Ein = 1
    min_Eout = 1
    target_lambda = 2
    for LAMBDA in LAMBDA_set:
        # calculate ridge regression W
        W = calculate_W_rigde_regression(x,y,pow(10, LAMBDA))
        Ein = calculate_E(W, x, y)
        Eout = calculate_E(W, test_x, test_y)
        # update Ein Eout lambda
        if Eout<min_Eout:
            target_lambda = LAMBDA
            min_Ein = Ein
            min_Eout = Eout
    #print min_Ein
    #print min_Eout
    #print target_lambda

    ## Q16~Q18
    min_Etrain = 1
    min_Eval = 1
    min_Eout = 1
    target_lambda = 2
    split = 120
    for LAMBDA in LAMBDA_set:
        # calculate ridge regression W
        W = calculate_W_rigde_regression(x[:split], y[:split], pow(10, LAMBDA))
        Etrain = calculate_E(W, x[:split], y[:split])
        Eval = calculate_E(W, x[split:], y[split:])
        Eout = calculate_E(W, test_x, test_y)
        # update Ein Eout lambda
        if Eval<min_Eval:
            target_lambda = LAMBDA
            min_Etrain = Etrain
            min_Eval = Eval
            min_Eout = Eout
    #print min_Etrain
    #print min_Eval
    #print min_Eout
    #print target_lambda

    W = calculate_W_rigde_regression(x,y,pow(10,target_lambda))
    optimal_Ein = calculate_E(W,x,y)
    optimal_Eout = calculate_E(W,test_x,test_y)
    #print optimal_Ein
    #print optimal_Eout

    ## Q19~Q20
    min_Ecv = 1
    target_lambda = 2
    V = 5
    V_range = []
    for i in range(0,V): V_range.append([i*(x.shape[0]/V),(i+1)*(x.shape[0]/V)])

    for LAMBDA in LAMBDA_set:
        total_Ecv = 0
        for i in range(0,V):
            # train x, y
            train_x = []
            train_y = []
            for j in range(0,V):
                if j!=i :
                    train_x.extend( x[range(V_range[j][0],V_range[j][1])].tolist() )
                    train_y.extend( y[range(V_range[j][0],V_range[j][1])].tolist() )
            train_x = np.array(train_x)
            train_y = np.array(train_y)
            # test x, y
            test_x = x[range(V_range[i][0],V_range[i][1])]
            test_y = y[range(V_range[i][0],V_range[i][1])]
            W = calculate_W_rigde_regression(train_x, train_y, pow(10,LAMBDA))
            Ecv = calculate_E(W, test_x, test_y)
            total_Ecv = total_Ecv + Ecv
        print "total Ecv:" + str(total_Ecv)
        if min_Ecv>(total_Ecv*1.0)/V:
            min_Ecv = (total_Ecv*1.0)/V
            target_lambda = LAMBDA
    print min_Ecv
    print target_lambda

    W = calculate_W_rigde_regression(x, y, pow(10,target_lambda))
    Ein = calculate_E(W, x, y)
    test_x,test_y = read_input_data("test.dat")
    test_x = np.hstack((np.ones(test_x.shape[0]).reshape(-1,1),test_x))
    Eout = calculate_E(W, test_x, test_y)
    print Ein
    print Eout 

这里还留有一个疑问:

在讲Linear Regression的时候有:

X‘X这个矩阵当时说,可能是可逆的,也可能不是?但是肯定是实对称阵,跟正定有什么关系?

这里又说到这个矩阵了Z‘Z是半正定的矩阵,配上单位阵就一定是正定的了?这个是怎么得来的。

时间: 2024-10-21 17:58:45

【作业4】林轩田机器学习基石的相关文章

台大林轩田&#183;机器学习基石记要

台大林轩田·机器学习基石记要 昨天开始看林轩田的机器学习基石,从今天起开始去粗取精 第一讲比较基础,一些概念自己早已经理解了,所以不再做笔记,有点印象的是讲到了ML.DL.AI的一些联系与区别,ML主要是想从数据中学习/逼近一个理想的函数f(x) 第二讲讲到了PLA,感知器学习算法,并且证明了线性可分时感知器收敛定理(与Haykin的Neural Networks and Learning Machines证明相同,另外补充的是学习速率不一定为1,只要非负即可,但是这个地方还有一些疑问,在Hay

【作业二】林轩田机器学习基石

作业一被bubuko抓取了,要是能注明转载就更好了() 作业二关注的题目是需要coding的Q16~Q20 Q16理解了一段时间,题目阐述的不够详细.理解了题意之后,发现其实很简单. 理解问题的关键是题目中给的's'是啥意思: (1)如果s=1,则意味着x>theta y预测为1,x<theta y预测为-1: (2)如果s=2,则以为着x<theta y预测为1,x<theta y预测为1 想明白这个事情之后,直接分theta大于0,小于0讨论,s=1 or s=-1把几种情况分

【作业一】林轩田机器学习基石

作业方面,暂时只关注需要编程的题目了,用python完成代码. Q15~Q17应用的是传统PLA算法,给定的数据集也是保证线性可分的. 代码需要完成的就是实现一个简单的PLA,并且“W = W + speed*yX”中的speed是可以配置的(即学习速率) 代码1 #encoding=utf8 import sys import numpy as np import math if __name__ == '__main__': W = [ 0.0, 0.0, 0.0, 0.0, 0.0 ] h

【作业三】林轩田机器学习基石

关注了Q18~Q20三道编程作业题.这三道题都与Logistic Regression相关. Q18~19是用全量梯度下降实现Logistic Regression:Q20要求用随机梯度下降实现Logistic Regression. 这三题的代码都何在一个py文件中了.个人觉得,这道题的程序设计,完全用了矢量化编程的路子:运行效率很快,迭代2000次,基本是1秒完成. #encoding=utf8 import sys import numpy as np import math from r

【The VC Dimension】林轩田机器学习基石

首先回顾上节课末尾引出来的VC Bound概念,对于机器学习来说,VC dimension理论到底有啥用. 三点: 1. 如果有Break Point证明是一个好的假设集合 2. 如果N足够大,那么Ein跟Eout的表现会比较接近 3. 如果算法A选的g足够好(Ein很小),则可能从数据中学到了东西 ================================================== 现在正式引出VC Dimension的概念:啥叫VC Dimension: VC Dimensi

【Linear Regression】林轩田机器学习基石

这一节开始讲基础的Linear Regression算法. (1)Linear Regression的假设空间变成了实数域 (2)Linear Regression的目标是找到使得残差更小的分割线(超平面) 下面进入核心环节:Linear Regression的优化目标是minimize Ein(W) 为了表达简便,首先需要把这种带Σ符号的转换成matrix form,如下: 1~2:多个项的平方和可以转换成向量的平方 2~3:把每个列向量x都横过来,组成一个新的X矩阵 最后转换成了最终的min

【Training versus Testing】林轩田机器学习基石

接着上一讲留下的关子,机器学习是否可行与假设集合H的数量M的关系. 机器学习是否可行的两个关键点: 1. Ein(g)是否足够小(在训练集上的表现是否出色) 2. Eout(g)是否与Ein(g)足够接近(在训练集上的表现能否迁移到测试集上) (1)如果假设集合数量小(M小),可知union bound后,Ein与Eout是接近的:但由于可选择的假设集合少,Ein(g)效果可能不佳: (2)如果假设集合数量大(M大),有可能Ein(g)会获得更多的选择,测试集上效果更好:但由于M数量过大,训练集

【Feasibility of Learning】林轩田机器学习基石

这一节的核心内容在于如何由hoeffding不等式 关联到机器学习的可行性. 这个PAC很形象又准确,描述了“当前的可能性大概是正确的”,即某个概率的上届. hoeffding在机器学习上的关联就是: 如果样本数量足够大,那么在训练集上获得的学习效果是可以平移到测试集上的.即如下, 这里保证的仅仅是“训练集的效果平移到测试集”,平移的仅仅是效果,没说效果好坏:如果训练效果是垃圾的,那么测试效果也基本是垃圾的. 如果假设空间是有限的,那么结果又如何呢?如下, 如果假设空间是有限的,根据公式推导:当

【Perceptron Learning Algorithm】林轩田机器学习基石

直接跳过第一讲.从第二讲Perceptron开始,记录这一讲中几个印象深的点: 1. 之前自己的直觉一直对这种图理解的不好,老按照x.y去理解. a) 这种图的每个坐标代表的是features:features的值是有物理意义的. b) 而圈圈和叉叉是为了标注不同的样本(正样本 负样本),即label:为了后续的很多简便表示,这里正样本取+1,负样本取-1 2. Perceptron Learning策略的几何意义:表示临界线(面)的法向量旋转方向 由于label设为了+1和-1,可以直接用w+