3. 基于Advanced LST-KSVC的模型迁移学习算法

本文是基于Advanced LST-KSVC引入了模型迁移学习的策略,将此算法改为可用于模型迁移的算法,改进方式采用的是常规的措施。

1. 模型迁移学习定义

       依据迁移内容的方式划分为:基于样本的迁移学习、基于特征的迁移学习、基于模型的迁移学习、基于相关知识的迁移学习。此种分类方式最为直观。

        基于样本的迁移学习方法前提条件是源领域和目标领域中样本分布不同但是具有一定相似,具体做法是对源领域样本集进行评估,选取可以被目标领域学习的样本,并将这些样本迁移到目标领域,扩大目标领域训练样本数量。此方法的关键问题是对领域间样本分布的评估,经典方法是基于提升方法(Boosting)提出TrAdaboost算法,更新源领域样本的权重,降低与目标领域分布差异大的样本权重,提升与目标领域分布差异小的样本权重;

        基于特征的迁移学习方法关注的是源领域和目标领域特征知识,利用领域间的共享特征实现迁移。经典方法有迁移主成分分析算法,将PCA与最大均值差异进行结合实现了共享特征的抽取和知识的迁移;联合分布调整算法,通过最大均值差异度量在迭代过程中,同时缩小领域间的边缘分布差异和条件分布差异;深度迁移网络算法,通过在网络结构中设计了共享特征抽取层和判别层来缩小领域间的边缘分布差异和条件分布差异;

        基于模型的迁移学习方法前提条件是源领域和目标领域共享某些算法模型参数或者先验知识,通过寻找此类参数或者先验知识进行迁移。

        基于相关知识方法的前提条件是源领域和目标领域具有相关的知识信息,通过这些共性信息完成知识的迁移。当前基于相关知识的迁移学习受到的关注程度还较小。

2. 模型迁移学习常用策略

        通过正则化的方式将两个领域的模型参数进行拉近,从而实现模型参数的迁移过程。此类基于模型参数逼近正则项的模型迁移方式,在目前已有的模型迁移研究方法中属于比较常用的方式。所以,本人对LST-KSVC算法的改进也是基于此策略进行改进的。

        将LST-KSVC目标函数中使得当前类数据接近超平面项替换为权重逼近迁移项和L2正则项。当源领域和目标领域具有相似性时,通过权重逼近迁移项项使得目标领域的各类参数逼近带有权重的源领域参数来实现模型知识的迁移;最小化L2正则化项保证各类分离超平面的几何间隔最大。因此,模型迁移过程可公式化为三个最小化结构风险的问题:

        其中,belta控制源领域模型对目标领域模型的影响程度;模型迁移项保证当前类数据接近源领域超平面wx+b=0;约束函数保证其他类数据接近超平面wx+b=1。

        当训练数据集近似线性可分时,可利用软间隔最大化进行多分类;当训练数据集非线性时,可利用核技巧及软间隔最大化进行多分类,即将输入欧式空间的超曲面模型对应于希尔伯特空间的超平面模型。本章可通过定义任意核函数将上述公式中的数据集进行重新定义建立非线性模型, 则二次规划问题可描述为:

      最终,求解方式与求解LST-KSVC算法的过程一样,可得解的矩阵为:

3. 代码实现

       本次实验使用的是TE过程的数据,且保证源领域和目标领域的数据集具有分布差异。

# -*-coding:utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

def load_TE_set(data_path,label_path):
    X = pd.read_csv(data_path,header=None)
    Y = pd.read_csv(label_path,header=None)
    return np.array(X).T,np.array(Y).squeeze()

def split_set(X,Y,ratio = 0.8):
    cls1 = np.argwhere(Y==1).squeeze()
    cls2 = np.argwhere(Y==2).squeeze()
    cls3 = np.argwhere(Y==3).squeeze()

    idx1 = int(len(cls1)*ratio)
    A_train = X[cls1[:idx1]]
    A_test = X[cls1[idx1:len(cls1)]]

    idx2 = int(len(cls2)*ratio)
    B_train = X[cls2[:idx2]]
    B_test = X[cls2[idx2:len(cls2)]]

    idx3 = int(len(cls3)*ratio)
    C_train = X[cls3[:idx3]]
    C_test = X[cls3[idx3:len(cls3)]]
    return A_train,A_test,B_train,B_test,C_train,C_test

def train_model_src(A,B,C):
    l1,m = A.shape
    l2,_ = B.shape
    l3,_ = C.shape

    e1 = np.ones((l1,1))
    e2 = np.ones((l2,1))
    e3 = np.ones((l3,1))

    E = np.hstack((A,e1))
    F = np.hstack((B,e2))
    G = np.hstack((C,e3))

    c5 = c3 = c1 = pow(2,5)
    c6 = c4 = c2 = pow(2,-5)

    w1b1 = np.dot(np.linalg.inv(c1*np.dot(F.T,F)+np.dot(E.T,E)+c2*np.dot(G.T,G)),\
                  (c1*np.dot(F.T,e2)+c2*np.dot(G.T,e3)))

    w2b2 = np.dot(np.linalg.inv(c3*np.dot(E.T,E)+np.dot(F.T,F)+c4*np.dot(G.T,G)),\
                  (c3*np.dot(E.T,e1)+c4*np.dot(G.T,e3)))

    w3b3 = np.dot(np.linalg.inv(c5*np.dot(E.T,E)+np.dot(G.T,G)+c6*np.dot(F.T,F)),\
                  (c5*np.dot(E.T,e1)+c6*np.dot(F.T,e2)))

    return w1b1,w2b2,w3b3

def train_model_tar(A,B,C,w1b1_src, w2b2_src, w3b3_src):
    w1_src = w1b1_src[:-1]
    w2_src = w2b2_src[:-1]
    w3_src = w3b3_src[:-1]

    l1,m = A.shape
    l2,_ = B.shape
    l3,_ = C.shape

    e1 = np.ones((l1,1))
    e2 = np.ones((l2,1))
    e3 = np.ones((l3,1))

    E = np.hstack((A,e1))
    F = np.hstack((B,e2))
    G = np.hstack((C,e3))
    # print(np.diag(np.ones(m)))
    temp1 = np.hstack((np.diag(np.ones(m)),np.zeros((m,1))))
    temp2 = np.zeros((1,m+1))
    K = np.vstack((temp1,temp2))

    c5 = c3 = c1 = pow(2,-8)
    c6 = c4 = c2 = pow(2,-6)
    belta = 1

    temp3 = c1*np.dot(F.T,e2)+c2*np.dot(G.T,e3)+np.vstack((belta*w1_src,0))
    w1b1 = np.dot(np.linalg.inv(c1*np.dot(F.T,F)+K+c2*np.dot(G.T,G)),temp3)

    temp4 = c3*np.dot(E.T,e1)+c4*np.dot(G.T,e3)+np.vstack((belta*w2_src,0))
    w2b2 = np.dot(np.linalg.inv(c3*np.dot(E.T,E)+K+c4*np.dot(G.T,G)),temp4)

    temp5 = c5*np.dot(E.T,e1)+c6*np.dot(F.T,e2)+np.vstack((belta*w3_src,0))
    w3b3 = np.dot(np.linalg.inv(c5*np.dot(E.T,E)+K+c6*np.dot(F.T,F)),temp5)
    return w1b1,w2b2,w3b3

def cal_accuracy(label_test,result1,result2,result3):
    num = result1.shape[0]
    pre_test = np.zeros(num)
    i = 0
    for x1,x2,x3 in zip(result1,result2,result3):
        if x1<x2 and x1<x3:
            pre_test[i] = 1
        elif x2<x1 and x2<x3:
            pre_test[i] = 2
        elif x3<x1 and x3<x2:
            pre_test[i] = 3
        i = i+1
    count = 0
    for x,y in zip(pre_test,label_test):
        if x==y:
            count+=1
    return count/num

def test_model(data_test,label_test,w1b1,w2b2,w3b3):
    w1 = w1b1[:-1]
    b1 = w1b1[-1]
    w2 = w2b2[:-1]
    b2 = w2b2[-1]
    w3 = w3b3[:-1]
    b3 = w3b3[-1]
    e = np.ones((data_test.shape[0],1))

    # 决策函数
    num = data_test.shape[0]

    result1 = (np.dot(data_test,w1)+b1*e).squeeze()
    result2 = (np.dot(data_test,w2)+b2*e).squeeze()
    result3 = (np.dot(data_test,w3)+b3*e).squeeze()

    # 计算准确率
    acc = cal_accuracy(label_test, result1, result2, result3)
    print("the predict accuracy is :", acc)

    # 绘图显示结果
    x = np.arange(0,num)
    plt.plot(x,result1,color='b')
    plt.plot(x,result2,color='g')
    plt.plot(x,result3,color='k')

    plt.show()

if __name__=='__main__':
    '''源领域'''
    # 读入数据集
    data_path = "C:\\Code_py\\ML\\te_2_data\\src\\X_src.csv"
    label_path = "C:\\Code_py\\ML\\te_2_data\\src\\Y_src.csv"
    X,Y = load_TE_set(data_path, label_path)
    # 切分数据集为训练集和测试集
    A_train, _, B_train, _, C_train, _ = split_set(X, Y)
    # 计算模型参数
    w1b1_src, w2b2_src, w3b3_src = train_model_src(A_train, B_train, C_train)


    '''目标领域'''
    # 读入数据集
    data_path = "C:\\Code_py\\ML\\te_2_data\\tar\\X_tar.csv"
    label_path = "C:\\Code_py\\ML\\te_2_data\\tar\\Y_tar.csv"
    X,Y = load_TE_set(data_path, label_path)
    # 切分数据集为训练集和测试集
    A_train, A_test, B_train, B_test, C_train, C_test = split_set(X, Y)
    # 计算模型参数
    w1b1, w2b2, w3b3 = train_model_tar(A_train, B_train, C_train, w1b1_src, w2b2_src, w3b3_src)


    # 获得训练集和测试集
    data_test = np.vstack((np.vstack((A_test,B_test)),C_test))
    label_test = np.hstack((np.hstack((np.ones(A_test.shape[0]),\
                    np.ones(B_test.shape[0])*2)),np.ones(C_test.shape[0])*3))

    data_train = np.vstack((np.vstack((A_train,B_train)),C_train))
    label_train = np.hstack((np.hstack((np.ones(A_train.shape[0]),\
                    np.ones(B_train.shape[0])*2)),np.ones(C_train.shape[0])*3))

    # 测试模型
    test_model(data_train, label_train, w1b1, w2b2, w3b3)
    test_model(data_test, label_test, w1b1, w2b2, w3b3)

4. 仿真结果

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值