SFA——慢特征分析及代码实现
最近在看SFA的相关知识,网上的资料很杂,整理一下便于以后翻看:
看了这三篇大致了解了SFA的原理
第一篇:视频识别算法:慢特征分析算法
第二篇:慢特征分析(SFA)
第三篇:机器学习教程 之 慢特征分析:时序特征挖掘
准备用SFA做时序数据预测,等搞懂实现再来追加啦~
哈哈哈,代码搞懂了,其实就几行简单的代码,先做特征值计算,接着再把想要的成分提取出来,参考网上的代码整理一下:
import numpy as npclass SFA: # slow feature analysis classdef __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 = ibreaks = s[0:count]s = s ** 0.5S = (np.mat(np.diag(s))).IU = U[:, 0:count]whiten = S * U.TZ = (whiten * data.T).Tself.getZ(Z)PT, O, P = np.linalg.svd(self._Z)self._eigenVector = P * whitenself._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)
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
