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

作业方面,暂时只关注需要编程的题目了,用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 ]
    halts = 0
    for line in open("train.dat").readlines():
        items = line.strip().split(‘\t‘)
        y = items[1].strip()
        X = items[0].strip().split(‘ ‘)
        X.insert(0,1)
        # gurantee the length of W and X
        if ( len(W)!=len(X) ):
            sys.exit(-1)
        # initial score 0
        score = 0.0
        # calculate W‘X
        for i in range(0,len(X)):
            score = score + float(X[i]) * float(W[i])
        print "score" + str(score)
        # transfer score to sign
        sign = 1 if score>0.0 else -1
        if sign != int(y) :
            halts = halts + 1
            for i in range(0,len(X)):
                W[i] = float(W[i]) + float(y)*float(X[i])
    for w in W:
        print w
    print "halts:" + str(halts)

代码2(随机打乱样本顺序)

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

if __name__ == ‘__main__‘:
    # params
    TIMES = 2000
    sum_halts = 0
    SPEED = 0.5
    # read raw data
    raw_data = []
    for line in open("train.dat").readlines():
        raw_data.append(line.strip())
    # iteratively
    a = Random()
    for i in range(0,TIMES):
        W = [ 0.0, 0.0, 0.0, 0.0, 0.0 ]
        halts = 0
        # randomly shuffle data
        a.seed(i)
        a.shuffle(raw_data)
        # pla process
        for line in raw_data:
            items = line.strip().split(‘\t‘)
            y = items[1].strip()
            X = items[0].strip().split(‘ ‘)
            X.insert(0,1)
            # gurantee the length of W and X
            if ( len(W)!=len(X) ):
                sys.exit(-1)
            # initial score 0
            score = 0.0
            # calculate W‘X
            for i in range(0,len(X)):
                score = score + float(X[i]) * float(W[i])
            # transfer score to sign
            sign = 1 if score>0.0 else -1
            if sign != int(y) :
                halts = halts + 1
                for i in range(0,len(X)):
                    W[i] = float(W[i]) + SPEED*float(y)*float(X[i])
        print "halts:" + str(halts)
        # accumulate sum of halts
        sum_halts = sum_halts + halts
    print "average halts:" + str(sum_halts/(TIMES-1))

这几道题的可以得到的结论就是:如果更新学习的速率,打乱样本顺序,可能会对收敛的次数产生影响。

另外,还有一个细节就是:一定不要忘记加上偏执W0(即常数项截距),否则会一直保持一个误差无法做到收敛。

==============================================

作业Q18~Q20考查的是pocket pla

即,train数据不是线性可分的情况(实际中也多是如此),改进成pocket pla的方法。

之前一直没理解好pocket的意思,后来参考了讨论区的内容,理解了Pocket的意思。

简而言之就是,“pocket不影响pla的正常运行,每轮W该更新还是要更新;pocket只需要维护历史出现的W中,在train_data上error最小的那个即可”

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

def error_on_data(data, W):
    error_W = 0
    for line in data:
        items = line.strip().split(‘\t‘)
        y = items[1].strip()
        X = items[0].strip().split(‘ ‘)
        X.insert(0,1)
        # calculate scores of W
        score_W = 0.0
        for i in range(0,len(X)): score_W = score_W + float(X[i]) * float(W[i])
        # judge W
        sign_W = 1 if score_W>0.0 else -1
        if sign_W != int(y) : error_W = error_W + 1
    return error_W

def pocket_algorithm(train_data, r):
    best_W = [ 0, 0, 0, 0, 0 ]
    best_error = error_on_data(train_data, best_W)
    W = [ 0, 0, 0, 0, 0 ]
    rounds = 0
    while rounds<100:
        line = train_data[r.randint(0,len(train_data)-1)]
        items = line.strip().split(‘\t‘)
        y = items[1].strip()
        X = items[0].strip().split(‘ ‘)
        X.insert(0,1)
        # initial score 0
        score = 0.0
        # calculate W‘X
        for i in range(0,len(X)): score = score + float(X[i]) * float(W[i])
        # wrong judgement : transfer score to sign
        sign = 1 if score>0.0 else -1
        if sign != int(y) :
            rounds = rounds + 1
            for i in range(0,len(X)): W[i] = float(W[i]) + float(y)*float(X[i])
            # update best_W
            curr_error = error_on_data(train_data,W)
            print "curr_error:" + str(curr_error) + ",best_error:" + str(best_error)
             if curr_error<best_error:
                for i in range(0,len(best_W)): best_W[i]=W[i]
                best_error = curr_error
    return best_W
    #return W

if __name__ == ‘__main__‘:
    # read raw data
    train_data = []
    for line in open("train2.dat").readlines(): train_data.append(line.strip())
    test_data = []
    for line in open("test2.dat").readlines(): test_data.append(line.strip())
    # iteratively pocket algorithm
    iterative_times = 100
    total_error_times = 0
    r = Random()
    for i in range(0,iterative_times):
        # each round initialize a random seed
        r.seed(i)
        # conduct one round pocket algorithm
        W = pocket_algorithm(train_data, r)
        # accmulate error times
        error_times = error_on_data(test_data, W)
        total_error_times = total_error_times + error_times
    print str( (1.0*total_error_times)/(iterative_times*len(test_data)) )

这个参考资料解释了Pocket 算法是怎么样运行的

https://class.coursera.org/ntumlone-002/forum/thread?thread_id=79

时间: 2024-10-03 20:22:24

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

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

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

【作业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 ( tra

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

作业一被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把几种情况分

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

关注了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+