SFA——慢特征分析及代码实现

最近在看SFA的相关知识,网上的资料很杂,整理一下便于以后翻看:

看了这三篇大致了解了SFA的原理

第一篇:视频识别算法:慢特征分析算法

第二篇:慢特征分析(SFA)

第三篇:机器学习教程 之 慢特征分析:时序特征挖掘

准备用SFA做时序数据预测,等搞懂实现再来追加啦~

哈哈哈,代码搞懂了,其实就几行简单的代码,先做特征值计算,接着再把想要的成分提取出来,参考网上的代码整理一下:

import numpy as np

class SFA:  # slow feature analysis class
    def __init__(self):
        self._Z = []
        self._B = []
        self._eigenVector = []

    def getB(self, data):
        self._B = np.matrix(data.T.dot(data)) / (data.shape[0] - 1)

    def getZ(self, data):
        derivativeData = self.makeDiff(data)
        self._Z = np.matrix(derivativeData.T.dot(derivativeData)) / (derivativeData.shape[0] - 1)

    def makeDiff(self, data):
        diffData = np.mat(np.zeros((data.shape[0], data.shape[1])))
        for i in range(data.shape[1] - 1):
            diffData[:, i] = data[:, i] - data[:, i + 1]
        diffData[:, -1] = data[:, -1] - data[:, 0]
        return np.mat(diffData)

    def fit_transform(self, data, threshold=1e-7, conponents=-1):
        if conponents == -1:
            conponents = data.shape[0]
        self.getB(data)
        U, s, V = np.linalg.svd(self._B)

        count = len(s)
        for i in range(len(s)):
            if s[i] ** (0.5) < threshold:
                count = i
                break
        s = s[0:count]
        s = s ** 0.5
        S = (np.mat(np.diag(s))).I
        U = U[:, 0:count]
        whiten = S * U.T
        Z = (whiten * data.T).T

        self.getZ(Z)
        PT, O, P = np.linalg.svd(self._Z)

        self._eigenVector = P * whiten
        self._eigenVector = self._eigenVector[-1 * conponents:, :]

        return data.dot(self._eigenVector.T)

    def transfer(self, data):
        return data.dot(self._eigenVector.T)

以上就是SFA的代码,调用也很简单:

# 首先定义SFA()
sfa = SFA()
# 接着利用训练集使用SFA提取慢特征,x_train是训练集的输入,conponents是要提取的前n个慢特征
trainDataS = sfa.fit_transform(x_train, conponents=25)
# transfer函数是利用SFA提取数据的慢特征
testDataS = sfa.transfer(x_test)

 

提取完慢特征之后就可以进行回归或者分类了,可以采用多层感知机、偏最小二乘等方法,下面展示利用PLS进行预测的代码:

# 从sklearn中直接导入PLS
from sklearn.cross_decomposition import PLSRegression
# 定义模型结构
pls = PLSRegression(n_components=21)
# 模型训练
pls.fit(trainDataS, y_train)
# 模型预测
test_predict = pls.predict(testDataS).squeeze(1)

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值