最近在看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)