机器学习技法笔记:Homework #5 特征变换&Soft-Margin SVM相关习题

特征变换

问题描述

图1 2-3

图2 4-5

程序实现

# coding: utf-8

import numpy as np
from cvxopt import matrix, solvers
from sklearn import svm


def gen_data():
    X = [[1, 0], [0, 1], [0, -1], [-1, 0], [0, 2], [0, -2], [-2, 0]]
    X = np.array(X)
    y = [-1, -1, -1, 1, 1, 1, 1]
    y = np.array(y)
    assert X.shape[0] == y.shape[0] and X.shape[1] == 2, "wrong data shape!"
    return X, y


def explict_transform(X):
    assert X.shape[1] == 2, "wrong shape of X!"
    num = X.shape[0]
    X1 = X[:, 0]
    X2 = X[:, 1]
    new_X1 = X2 ** 2 - 2 * X1 + 3
    new_X2 = X1 ** 2 - 2 * X2 - 3
    new_X = np.concatenate((new_X1.reshape((num, 1)), new_X2.reshape(num, 1)), axis=1)
    return new_X


def svm_hard_linear(X, y):
    num, dim = X.shape
    P = matrix(np.concatenate((np.zeros((1, 1 + dim)),
                               np.concatenate((np.zeros((dim, 1)), np.eye(dim)), axis=1)), axis=0), tc='d')
    q = matrix(np.zeros((1 + dim, 1)), tc='d')
    G = matrix(-y * np.concatenate((np.ones((num, 1), dtype=np.float), X), axis=1), tc='d')
    h = matrix(-np.ones((num, 1)), tc='d')
    sol = solvers.qp(P, q, G, h)
    return sol['x']


def implicit_transform(X):
    assert X.shape[1] == 2, "wrong shape of X!"
    num=X.shape[0]
    X1 = X[:, 0]
    X2 = X[:, 1]
    new_X1=np.ones((num,1))
    new_X2=2**(0.5)*X1
    new_X3=2**(0.5)*X2
    new_X4=X1**2
    new_X5=X2**2
    new_X6=2**(0.5)*X1*X2
    new_X = np.concatenate((new_X1.reshape((num, 1)), new_X2.reshape(num, 1),new_X3.reshape(num, 1),
                            new_X4.reshape(num, 1),new_X5.reshape(num, 1),new_X6.reshape(num, 1)), axis=1)
    return new_X

if __name__ == "__main__":
    np.set_printoptions(precision=6,suppress=True)
    X, y = gen_data()

    # explicit
    # 2
    exp_X= explict_transform(X)
    u = np.array(svm_hard_linear(exp_X, y.reshape(y.shape[0],1)))
    b = u[0, :]
    w = u[1:, :]
    print("b:\n", b)
    print("w:\n", w)

    # implicit
    clf=svm.SVC(C=1000000,kernel='poly',degree=2,gamma=1,coef0=1)
    clf.fit(X,y)
    # 3
    alpha_y=clf.dual_coef_
    alpha_y=alpha_y.reshape((alpha_y.shape[1],))
    sv_ID=clf.support_
    sv_y=[]
    for i in range(sv_ID.shape[0]):
        sv_y.append(y[sv_ID[i]])
    alpha=[alpha_y[i]/sv_y[i] for i in range(sv_ID.shape[0])]
    print("alpha*y:\n",alpha_y)
    print("alpha:\n",alpha)
    sv_X=clf.support_vectors_
    print("support vectors:\n",sv_X)
    # 4
    b=clf.intercept_
    print("b:\n",b)
    w=np.dot(alpha_y,implicit_transform(sv_X)).reshape((6,1))
    print("w:\n",w)

运行结果

图3 运行结果

Soft-Margin SVM

问题描述

图4 15

图5 16-17

图6 18-20

程序实现

# coding: utf-8


import numpy as np
from sklearn import svm
import matplotlib.pyplot as plt


def read_data(dataFile):
    with open(dataFile,'r') as f:
        lines=f.readlines()
        data_list=[]
        for line in lines:
            line=line.strip().split()
            data_list.append([float(l) for l in line])
        dataArray=np.array(data_list)
        num_data=dataArray.shape[0]
        num_dim=dataArray.shape[1]-1
        dataX=dataArray[:,1:].reshape((num_data,num_dim))
        dataY=dataArray[:,0].reshape((num_data,))
        return dataX,dataY

data_X,data_Y=read_data("features.train")
test_X,test_Y=read_data("features.test")


def convert_label(dataY,chosen_class):
    num=dataY.shape[0]
    new_Y=-np.ones_like(dataY)
    for i in range(num):
        if dataY[i]==chosen_class:
            new_Y[i]=1
    return new_Y


def zero_one_cost(pred,Y):
    assert pred.shape==Y.shape,"wrong shape of pred and Y!"
    return np.sum(np.not_equal(pred,Y))/Y.shape[0]


def question15():
    c_list=[-6,-4,-2,0,2]
    w_list=[]
    new_Y=convert_label(data_Y,0)
    for i in c_list:
        clf=svm.LinearSVC(loss="hinge",C=10**i)
        clf.fit(data_X,new_Y)
        w_list.append(np.sqrt(np.sum(clf.coef_**2)))
    plt.figure(figsize=(10,6))
    plt.plot(c_list,w_list,'b')
    plt.plot(c_list,w_list,'ro')
    for (c,w) in zip(c_list,w_list):
        plt.text(c+0.1,w,str(round(w,4)))
    plt.xlabel("log10(C)")
    plt.ylabel("||w||")
    plt.xlim(-8,4)
    plt.title("||w|| versus log10(C)")
    plt.savefig("15.png")


def question16and17():
    # 16
    c_list = [-6, -4, -2, 0, 2]
    Ein_list=[]
    alpha_sum_list=[]
    new_Y=convert_label(data_Y,8)
    for i in c_list:
        clf=svm.SVC(C=10**i,kernel='poly',degree=2,gamma=1,coef0=1)
        clf.fit(data_X,new_Y)
        pred=clf.predict(data_X)
        Ein_list.append(zero_one_cost(pred,new_Y))
        alpha_sum_list.append(np.sum(np.abs(clf.dual_coef_)))
        # print(np.sum(clf.dual_coef_))
        # print(clf.n_support_)
    plt.figure(figsize=(10,6))
    plt.plot(c_list,Ein_list,'b')
    plt.plot(c_list,Ein_list,'ro')
    for (c,e) in zip(c_list,Ein_list):
        plt.text(c+0.1,e,str(round(e,4)))
    plt.xlabel("log10(C)")
    plt.ylabel("Ein")
    plt.xlim(-8, 4)
    plt.title("Ein versus log10(C)")
    plt.savefig("16.png")
    # 17
    plt.figure(figsize=(10,6))
    plt.plot(c_list,alpha_sum_list,'b')
    plt.plot(c_list,alpha_sum_list,'ro')
    for (c,a) in zip(c_list,alpha_sum_list):
        plt.text(c+0.1,a,str(round(a,6)))
    plt.xlabel("log10(C)")
    plt.ylabel("sum of alpha")
    plt.xlim(-8, 4)
    plt.title("sum of alpha versus log10(C)")
    plt.savefig("17.png")


def question18():
    c_list=[-3,-2,-1,0,1]
    dis_list=[]
    new_Y=convert_label(data_Y,0)
    for i in c_list:
        clf=svm.SVC(C=10**i,kernel='rbf',gamma=100)
        clf.fit(data_X,new_Y)
        sv_ID=clf.support_
        dis_list.append(new_Y[sv_ID[0]]*clf.decision_function(data_X)[sv_ID[0]])
    plt.figure(figsize=(10,6))
    plt.plot(c_list,dis_list,'b')
    plt.plot(c_list,dis_list,'ro')
    for (c,w) in zip(c_list,dis_list):
        plt.text(c+0.1,w,str(round(w,4)))
    plt.xlabel("log10(C)")
    plt.ylabel("free sv's function distance to hyperplane")
    plt.xlim(-5, 3)
    plt.ylim(ymax=1.01)
    plt.title("free sv's function distance to hyperplane versus log10(C)")
    plt.savefig("18.png")


def question19():
    new_Y=convert_label(data_Y,0)
    new_test_Y=convert_label(test_Y,0)
    gamma_list=[0,1,2,3,4]
    Eout_list=[]
    for i in gamma_list:
        clf=svm.SVC(C=0.1,kernel='rbf',gamma=10**i)
        clf.fit(data_X,new_Y)
        pred=clf.predict(test_X)
        Eout_list.append(zero_one_cost(pred,new_test_Y))
    plt.figure(figsize=(10,6))
    plt.plot(gamma_list,Eout_list,'b')
    plt.plot(gamma_list,Eout_list,'ro')
    for (c,w) in zip(gamma_list,Eout_list):
        plt.text(c+0.1,w,str(round(w,4)))
    plt.xlabel("log10(gamma)")
    plt.ylabel("Eout")
    plt.xlim(-1, 5)
    plt.ylim(ymax=0.19)
    plt.title("Eout versus log10(C)")
    plt.savefig("19.png")


def question20():
    new_Y=convert_label(data_Y,0)
    gamma_list=[0,1,2,3,4]
    chosen_gamma=[]
    for t in range(100):
        np.random.seed(t)
        chosenID=np.random.randint(0,data_X.shape[0],1000)
        train_X=[]
        train_Y=[]
        val_X=[]
        val_Y=[]
        for i in range(data_X.shape[0]):
            if(i not in chosenID):
                train_X.append(data_X[i,:])
                train_Y.append(new_Y[i])
            else:
                val_X.append(data_X[i,:])
                val_Y.append(new_Y[i])
        train_X=np.array(train_X)
        train_Y=np.array(train_Y)
        val_X=np.array(val_X)
        val_Y=np.array(val_Y)
        Eval_list=[]
        for g in gamma_list:
            clf=svm.SVC(C=0.1,kernel='rbf',gamma=10**g)
            clf.fit(train_X,train_Y)
            pred=clf.predict(val_X)
            Eval_list.append(zero_one_cost(pred,val_Y))
        chosen_gamma.append(gamma_list[Eval_list.index(min(Eval_list))])
    times=[]
    for i in gamma_list:
        times.append(chosen_gamma.count(i))
    plt.figure(figsize=(10,6))
    plt.bar(left=(gamma_list),height=(times),width=1,align="center",yerr=0.000001)
    for (c,w) in zip(gamma_list,times):
        plt.text(c,w*1.03,str(round(w,4)))
    plt.xlabel("log10(gamma)")
    plt.ylabel("the number of chosen times")
    plt.xlim(-1, 5)
    plt.ylim(0,80)
    plt.title("the number of chosen times for gamma")
    plt.savefig("20.png")


if __name__=="__main__":

    question15()
    question16and17()
    question18()
    question19()
    question20()

运行结果

图7 15结果

图8 16结果

图9 17结果

图10 18结果

图11 19结果

图12 20结果
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容