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

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

# calculate graident of Ein
def calculate_gradient(w, x, y):
    s = np.dot(w, x.transpose())*y
    theta = 1.0/(1+np.exp(s))
    gradient_all = theta.reshape(-1,1)*(-1)*y.reshape(-1,1)*x
    gradient_average = np.sum(gradient_all, axis=0)
    return gradient_average / gradient_all.shape[0]

# update W combine with gradient result and learning rate (ita)
def update_W(w, ita, gradient):
    return w - ita*gradient

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

if __name__ == ‘__main__‘:
    # read train data
    x,y = read_input_data("train.dat")
    # add ‘1‘ column
    x = np.hstack((np.ones(x.shape[0]).reshape(-1,1),x))

    ## fix learning rate gradient descent
    T1 = 2000
    ita1 = 0.01
    w1 = np.zeros(x.shape[1])
    for i in range(0,T1):
        gradient = calculate_gradient(w1, x, y)
        w1 = update_W(w1, ita1, gradient)

    ## fix learning rate stochastic gradient descent
    T2 = 20
    ita2 = 0.1
    w2 = np.zeros(x.shape[1])
    for i in range(0,T2):
        x_n = x[i%x.shape[0]]
        y_n = y[i%y.shape[0]]
        gradient = calculate_gradient(w2, x_n, y_n)
        w2 = update_W(w2, ita2, gradient)

    # test
    test_x,test_y = read_input_data("test.dat")
    test_x = np.hstack((np.ones(test_x.shape[0]).reshape(-1,1),test_x))
    Eout1 = calculate_Eout(w1, test_x, test_y)
    Eout2 = calculate_Eout(w2, test_x, test_y)
    print Eout1
    print Eout2

程序效率比较高,主要得益于python numpy非常便捷的各种矩阵操作运算。

通过这几道作业题

(1)熟悉了Logistic Regression的梯度求解公式:

(2)体会了learning rate的作用。如果learning rate很小,可能需要迭代很多次才能得到满意的结果(把Q18的迭代次数调整到20W次,可以达到0.22的error rate)

  但是,之前的经验是,learning rate不敢选太大(一般0.01就挺大了)。learning rate这个真是技术活儿,跟算法有关,跟实际的数据也有关。

时间: 2024-11-06 03:40:56

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

台大林轩田·机器学习基石记要

台大林轩田·机器学习基石记要 昨天开始看林轩田的机器学习基石,从今天起开始去粗取精 第一讲比较基础,一些概念自己早已经理解了,所以不再做笔记,有点印象的是讲到了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把几种情况分

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

作业方面,暂时只关注需要编程的题目了,用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

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

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

【Hazard of Overfitting】林轩田机器学习基石

首先明确了什么是Overfitting 随后,用开车的例子给出了Overfitting的出现原因 出现原因有三个: (1)dvc太高,模型过于复杂(开车开太快) (2)data中噪声太大(路面太颠簸) (3)数据量N太小(知道的路线太少) 这里(1)是前提,模型太复杂: (1)模型越复杂,就会捕获train data中越多的点(这当中当然包括更多的噪声点) (2)数据量N太小,根据VC Dimension理论,Eout会增大 这里的noise包括两类: 1. stochoastic noise:

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

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

【Regularization】林轩田机器学习基石

正则化的提出,是因为要解决overfitting的问题. 以Linear Regression为例:低次多项式拟合的效果可能会好于高次多项式拟合的效果. 这里回顾上上节nonlinear transform的课件: 上面的内容说的是,多项式拟合这种的假设空间,是nested hypothesis:因此,能否想到用step back的方法(即,加一些constraints的方法把模型给退化回去呢?) 事实上,是可以通过加入constraint使得模型退化回去的:但是,再优化的过程中涉及到了“判断每

【Linear Models for Binary Classification】林轩田机器学习基石

首先回顾了几个Linear Model的共性:都是算出来一个score,然后做某种变化处理. 既然Linear Model有各种好处(训练时间,公式简单),那如何把Linear Regression给应用到Classification的问题上呢?到底能不能迁移呢? 总结了如下的集中Linear Model的error functions的表达式: 这里都提炼出来了ys这一项,y表示需要更正的方向{+1,-1},s表示需要更正的幅度(score) 三种error function可以这么理解: (