【作业一】林轩田机器学习技术

关注的是编程题目Q15~Q20

这里需要借用libsvm的python包,需要一下几个处理步骤:

(1)到libsvm官网(http://www.csie.ntu.edu.tw/~cjlin/libsvm/)下载.gz包,解压缩到一个目录

(2)在解压的根目录make命令

(3)再到解压缩根目录下的python文件夹make命令

(4)把根目录下的libsvm.so.2,python文件夹下的svm.py和svmutil.py,三个文件提取出来,存放到一个新的文件夹(我的文件夹命名为libsvm)下面

(5)为了让libsvm目录被识别为一个包,需要建立名为__init__.py的空文件

(6)修改svm.py的Line 19为 “libsvm = CDLL(path.join(dirname, ‘libsvm.so.2‘))”

(7)如果要在新建的.py文件中使用libsvm的包,需要加入如下的语句(蓝色字的部分为你建立libsvm目录的路径):  

      import sys
      sys.path.append(‘/Users/xiabofei/Documents/libsvm‘)
      from svmutil import *

整体代码如下(读数据公用一个函数,其余的按照每个Question的要求,各自写成一块)

#encoding=utf8
import sys
sys.path.append(‘/Users/xiabofei/Documents/libsvm‘)
from svmutil import *
import numpy as np
import math
from random import *

# read raw data from local file
# return scaled data
def read_input_data(path, target_class):
    x = []
    y = []
    # read first line & get x column size & prepare for scaling
    x_size = -1
    f = open(path)
    for line in f.readlines():
        fields = line.strip().split(‘ ‘)
        for field in fields:
            if field!=‘‘:
                x_size = x_size + 1
        break;
    f.close()
    f = open(path)
    # record each x column‘s max value for scaling
    x_min_max = []
    for i in range(x_size):
        x_min_max.append([float("inf"),float("-inf")])
    for line in f.readlines():
        fields = line.strip().split(‘ ‘)
        items = []
        for field in fields:
            if field!=‘‘:
                items.append(field)
        y.append(1 if float(items[0])==target_class else -1)
        tmp_x = []
        for i in range(1,len(items)):
            val = float(items[i])
            # check each column‘s min value and max value
            if val<x_min_max[i-1][0]:
                x_min_max[i-1][0] = val
            elif val>x_min_max[i-1][1]:
                x_min_max[i-1][1] = val
            tmp_x.append(val)
        x.append(tmp_x)
    #for min_max in x_min_max:
    #    print "min:"+str(min_max[0])+";max:"+str(min_max[1])
    # scaling x & y
    f.close()
    return x,y,x_size
    for non_scaled in x:
        for i in range(len(non_scaled)):
            non_scaled[i] = (non_scaled[i]-x_min_max[i][0]) / (x_min_max[i][1]-x_min_max[i][0])
    return x,y,x_size

if __name__ == ‘__main__‘:
    ‘‘‘
    print "success import"
    y,x = svm_read_problem(‘heart_scale‘)
    model = svm_train(y,x,‘-c 4‘)
    print "success train"
    p_label, p_acc, p_val = svm_predict(y, x, model)
    print "success predict"
    ‘‘‘
    ## Q15~Q17
    ‘‘‘
    fw = open(‘result‘,‘w‘)
    # read raw data & reset labels according to the problem
    max_sum_of_alhpha = float("-inf")
    for target_class in range(0,10,2):
        x,y,x_size = read_input_data(‘train.dat‘,target_class)
        problem = svm_problem(y,x)
        # set SVM parameter
        params = svm_parameter(‘-c 0.01 -t 1 -g 1 -r 1‘)
        model = svm_train(problem, params)
        svm_save_model(‘model‘,model)
        # get W
        f = open(‘model‘)
        W = [0 for i in range(x_size)];
        sum_of_alpha = 0
        if_reach_SV = False
        for line in f.readlines():
            if line.strip()=="SV":
                if_reach_SV = True
                continue
            if if_reach_SV:
                items = line.strip().split(‘ ‘)
                alphan_yn = float(items[0])
                sum_of_alpha = sum_of_alpha + abs(alphan_yn)
                for i in range(x_size):
                    W[i] = W[i] + alphan_yn*float(items[i+1].split(‘:‘)[1].strip())
        fw.writelines(str(sum_of_alpha)+‘\n‘)
        max_sum_of_alhpha = sum_of_alpha if sum_of_alpha>max_sum_of_alhpha else max_sum_of_alhpha
        f.close()
        #test_x,test_y,test_x_size = read_input_data(‘test.dat‘,target_class)
        #if x_size!= test_x_size: sys.exit(-1)
        p_label, p_acc, p_val = svm_predict(y, x, model)
        fw.writelines("class:"+str(target_class)+";Ein:"+str(1-p_acc[0]/100.0)+‘\n‘)
    fw.writelines(str(max_sum_of_alhpha)+‘\n‘)
    fw.close()
    ‘‘‘
    ‘‘‘
    ## Q18
    fw = open(‘result‘,‘w‘)
    c = 0.001
    while c<=10:
        x,y,x_size = read_input_data(‘train.dat‘,0)
        problem = svm_problem(y,x)
        params = svm_parameter("-c "+str(c)+" -t 2 -g 100")
        model = svm_train(problem, params)
        SV = model.get_SV()
        print SV
        svm_save_model(‘model‘,model)
        test_x,test_y,test_x_size = read_input_data(‘test.dat‘,0)
        if x_size!= test_x_size: sys.exit(-1)
        # calculate Eout
        p_label, p_acc, p_val = svm_predict(test_y, test_x, model)
        fw.writelines("Eout:"+str(1-p_acc[0]/100.0)+‘\n‘)
        # calculate sum of
        p_label, p_acc, p_val = svm_predict(test_y, test_x, model)
        c = c*10
    fw.close()
    ‘‘‘
    ‘‘‘
    ## Q19
    fw = open(‘result‘,‘w‘)
    gamma = 1
    x,y,x_size = read_input_data(‘train.dat‘,0)
    test_x,test_y,test_x_size = read_input_data(‘test.dat‘,0)
    if test_x_size!=x_size: sys.exit(-1)
    while gamma<=10000:
        problem = svm_problem(y,x)
        params = svm_parameter("-c 0.1 -t 2 -g "+str(gamma))
        model = svm_train(problem, params)
        p_label, p_acc, p_val = svm_predict(test_y, test_x, model)
        fw.writelines("gamma:"+str(gamma)+"\tEout:"+str(1-p_acc[0]/100.0)+‘\n‘)
        gamma = gamma * 10
    fw.close()
    ‘‘‘
    ## Q20
    fw = open(‘result‘,‘w‘)
    T = 50
    test_size = 1000
    gamma_minEvalTimes = dict()
    x,y,x_size = read_input_data(‘train.dat‘,0)
    for i in range(T):
        # prepare train and test data
        test_indexs = np.random.random_integers(0,len(x)-1,test_size)
        train_x = []
        train_y = []
        for i in range(len(x)):
            if not (i in test_indexs):
                train_x.append(x[i])
                train_y.append(y[i])
        test_x = np.array(x)[test_indexs].tolist()
        test_y = np.array(y)[test_indexs].tolist()
        problem = svm_problem(train_y,train_x)
        # find which gamma perfroms best Eval
        min_Eval = float("inf")
        min_gamma = -1
        gamma = 1
        while gamma<=10000:
            params = svm_parameter("-c 0.1 -t 2 -g "+str(gamma))
            model = svm_train(problem, params)
            p_label, p_acc, p_val = svm_predict(test_y, test_x, model)
            Eval = 1-p_acc[0]/100.0
            fw.writelines("gamma:"+str(gamma)+"\t Eval:"+str(Eval)+‘\n‘)
            if min_Eval>Eval:
                min_Eval = Eval
                min_gamma = gamma
            gamma = gamma * 10
        # update each gamma‘s best perform times
        if gamma_minEvalTimes.has_key(min_gamma):
            gamma_minEvalTimes[min_gamma] += 1
        else:
            gamma_minEvalTimes[min_gamma] = 1
    for k,v in gamma_minEvalTimes.items():
        fw.writelines("gamma:"+str(k)+"\ttimes:"+str(v))
    fw.close()
    ‘‘‘
    print W
    w_1_F = 0
    for i in range(x_size):
        w_1_F = w_1_F + math.pow(W[i],2)
    print math.sqrt(w_1_F)
    ‘‘‘

    ‘‘‘
    print len(x)
    print len(y)
    for i in range(len(x)):
        out_str = str(y[i])
        for j in range(len(x[i])):
            out_str = out_str + ‘\t‘ + str(x[i][j])
        print out_str
    ‘‘‘
时间: 2024-10-29 11:42:14

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

【Gradient Boosted Decision Tree】林轩田机器学习技术

GBDT之前实习的时候就听说应用很广,现在终于有机会系统的了解一下. 首先对比上节课讲的Random Forest模型,引出AdaBoost-DTree(D) AdaBoost-DTree可以类比AdaBoost-Stump模型,就可以直观理解了 1)每轮都给调整sample的权重 2)获得gt(D,ut) 3)计算gt的投票力度alphat 最后返回一系列gt的线性组合. weighted error这个比较难搞,有没有不用动原来的模型,通过输入数据上做文章就可以达到同样的目的呢? 回想bag

【Kernel Logistic Regression】林轩田机器学习技术

最近求职真慌,一方面要看机器学习,一方面还刷代码.还是静下心继续看看课程,因为觉得实在讲的太好了.能求啥样搬砖工作就随缘吧. 这节课的核心就在如何把kernel trick到logistic regression上. 首先把松弛变量的表达形式修改一下,把constrained的形式改成unconstrained的形式. 改成这种'unconstrained' form of soft-margin SVM之后,突然发现很像L2 regularization 如果用regularized mode

【Soft-Margin Support Vector Machine】林轩田机器学习技术

Hard-Margin的约束太强了:要求必须把所有点都分开.这样就可能带来overfiiting,把noise也当成正确的样本点了. Hard-Margin有些“学习洁癖”,如何克服这种学习洁癖呢? 沿用pocket算法的思想,修改一下优化目标函数的形式,补上一个错分点的惩罚项CΣ.... (1)C越大,对错误的容忍度就越小,margin越小 (2)C越小,对错误容忍度就越高,margin越大 因此引入的参数C是在large margin和noise tolerance之间做了一个权衡. 但是上

【Kernal Support Vector Machine】林轩田机器学习技术

考虑dual SVM 问题:如果对原输入变量做了non-linear transform,那么在二次规划计算Q矩阵的时候,就面临着:先做转换,再做内积:如果转换后的项数很多(如100次多项式转换),那么耗费的时间就比较多. 能否在计算Q矩阵这一步的时候,把transform+inner product合成一步呢? 这里就用到了一些kernel trick. 简单来说:某些特殊形式的transfrom,利用kernel trick就是只用计算一次transform之前的输入向量内积(X'X),tr

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

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

台大林轩田机器学习课程笔记----机器学习初探及PLA算法

机器学习初探 1.什么是机器学习 学习指的是一个人在观察事物的过程中所提炼出的技能,相比于学习,机器学习指的就是让计算机在一堆数据中通过观察获得某些经验(即数学模型),从而提升某些方面(例如推荐系统的精度)的性能(可测量的). 2.机器学习使用的条件 需要有规则可以学习 有事先准备好的数据 编程很难做到 3.机器学习所组成的元素 输入X 输出 Y 目标函数f:X->Y 数据(训练集):D={(x1,y1),(x2,y2),-.(xn,yn)}假设(skill):g:X->Y 4.如何使用机器学

【作业四】林轩田机器学习技法 + 机器学习公开新课学习个人体会

这次作业的coding任务量比较大,总的来说需要实现neural network, knn, kmeans三种模型. Q11~Q14为Neural Network的题目,我用单线程实现的,运行的时间比较长,因此把这几道题的正确答案记录如下: Q11: 6 Q12: 0.001 Q13: 0.01 Q14: 0.02 ≤ Eout ≤ 0.04 其中Q11和Q14的答案比较明显,Q12和Q13有两个答案比较接近(参考了讨论区的内容,最终也调出来了) neural network的代码实现思路如下:

【作业三】林轩田机器学习技法

这次关注的作业题目是Q13~Q20,主要是实现basic C&RT分类树,以及由其构成的Random Forest. 其中basic C&RT分类树的实现思路如下: (一)先抽象出来几个功能: 1)从local file读数据并转化成numpy.array的形式(考虑空行容错)(def read_input_data(path)) 2)如何根据某个维度的feature,计算这个feature产生的branch criteria(此题中为decision stump)(def learn_d

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