def kpca(Y, k, params): """KPCA driver. Runs KPCA on the input data matrix and UPDATES the KPCA parameters given by the user. See [1] B. Schoelkopf, A. Smola, and K. R. Muller. "Nonlinear component analysis as a kernel eigenvalue problem", Neural Computation, vol. 10, pp. 1299-1319, 1998 for technical details on KPCA. Parameters: ----------- Y : numpy array, shape = (N, D) Input matrix of D N-dimensional signals. k : int Compute k KPCA components. params : KPCAParam instance KPCA parameters. Upon completion, the params is updated. The following fields are set: _data : numpy.array, shape = (N, D) - Original data _A : numpy.array, shape = (N, k) - KPCA weight matrix _l : numpy.array, shape = (k,) - Eigenvalues of kernel matrix The following fields need to be set already: _kPar : Kernel parameters (depends on the kernel) _kFun : Kernel function (depends on the kernel) Since the kernel will be called interally, the kernel parameters will also be updated (see kernel documentation). Returns: -------- Xhat : numpy array, shape (k, D) NLDS state parameters. """ if not isinstance(params, KPCAParam): raise ErrorDS('wrong KCPA parameters!') if (params._kPar is None or params._kFun is None): raise ErrorDS('KPCA not properly configured!') # save data params._data = Y # calls kernel fun params._kFun(Y, Y, params._kPar) kpcaObj = KernelPCA(kernel="precomputed") kpcaObj.fit(params._kPar._kMat) params._A = kpcaObj.alphas_[:,0:k] params._l = kpcaObj.lambdas_[0:k] if np.any(np.where(kpcaObj.lambdas_ <= 0)[0]): dsinfo.warn("some unselected eigenvalues are negative!") if np.any(np.where(params._l < 0)[0]): dsinfo.warn("some eigenvalues are negative!") # normalize KPCA weight vectors normalize(params._A, params._l) return params._A.T*params._kPar._kMat
def main(argv=None): if argv is None: argv = sys.argv parser = OptionParser(add_help_option=False) parser.add_option("-s", dest="inFile") parser.add_option("-d", dest="dbFile") parser.add_option("-m", dest="models") parser.add_option("-v", dest="videos") parser.add_option("-c", dest="config") parser.add_option("-o", dest="mdFile") parser.add_option("-h", dest="doUsage", action="store_true", default=False) parser.add_option("-x", dest="verbose", action="store_true", default=False) options, args = parser.parse_args() if options.doUsage: usage() # read config file config = json.load(open(options.config)) # get DS config settings dynType = config["dynType"] shiftMe = config["shiftMe"] numIter = config["numIter"] verbose = options.verbose # I/O configuration inFile = options.inFile dbFile = options.dbFile models = options.models videos = options.videos mdFile = options.mdFile # check if the required options are present if (inFile is None or dbFile is None or models is None or videos is None): dsinfo.warn('Options missing!') usage() inVideo, inVideoSize = dsutil.loadDataFromVideoFile(inFile) if verbose: dsinfo.info("Loaded source video with %d frames!" % inVideo.shape[1]) (db, winSize, nStates, dynType) = loadDB(videos, models, dbFile) if verbose: dsinfo.info("#Templates: %d #States: %d, WinSize: %d, Shift: %d" % (len(db), nStates, winSize, shiftMe)) if dynType.__name__ == "LinearDS": # create online version of LinearDS ds = OnlineLinearDS(nStates, winSize, shiftMe, False, verbose) elif dynType.__name__ == "NonLinearDS": kpcaP = KPCAParam() # select kernel if config["kdtKern"] == "rbf": kpcaP._kPar = RBFParam() kpcaP._kFun = rbfK else: dsinfo.fail("Kernel %s not supported!" % kdtKern) return -1 # configure kernel if config["kCenter"] == 1: kpcaP._kPar._kCen = True else: kpcaP._kPar._kCen = False # create online version of KDT ds = OnlineNonLinearDS(nStates, kpcaP, winSize, shiftMe, verbose) else: dsinfo.fail('System type %s not supported!' % options.dsType) return -1 dList = [] for f in range(inVideo.shape[1]): ds.update(inVideo[:, f]) if ds.check() and ds.hasChanged(): dists = np.zeros((len(db), )) for j, dbentry in enumerate(db): dists[j] = { "LinearDS": dsdist.ldsMartinDistance, "NonLinearDS": dsdist.nldsMartinDistance }[dynType.__name__](ds, dbentry["model"], numIter) dList.append(dists) # write distance matrix if not mdFile is None: np.savetxt(mdFile, np.asmatrix(dList), fmt='%.5f', delimiter=' ')
def main(argv=None): if argv is None: argv = sys.argv parser = OptionParser(add_help_option=False) parser.add_option("-s", dest="inFile") parser.add_option("-d", dest="dbFile") parser.add_option("-m", dest="models") parser.add_option("-v", dest="videos") parser.add_option("-c", dest="config") parser.add_option("-o", dest="mdFile") parser.add_option("-h", dest="doUsage", action="store_true", default=False) parser.add_option("-x", dest="verbose", action="store_true", default=False) options, args = parser.parse_args() if options.doUsage: usage() # read config file config = json.load(open(options.config)) # get DS config settings dynType = config["dynType"] shiftMe = config["shiftMe"] numIter = config["numIter"] verbose = options.verbose # I/O configuration inFile = options.inFile dbFile = options.dbFile models = options.models videos = options.videos mdFile = options.mdFile # check if the required options are present if inFile is None or dbFile is None or models is None or videos is None: dsinfo.warn("Options missing!") usage() inVideo, inVideoSize = dsutil.loadDataFromVideoFile(inFile) if verbose: dsinfo.info("Loaded source video with %d frames!" % inVideo.shape[1]) (db, winSize, nStates, dynType) = loadDB(videos, models, dbFile) if verbose: dsinfo.info("#Templates: %d #States: %d, WinSize: %d, Shift: %d" % (len(db), nStates, winSize, shiftMe)) if dynType.__name__ == "LinearDS": # create online version of LinearDS ds = OnlineLinearDS(nStates, winSize, shiftMe, False, verbose) elif dynType.__name__ == "NonLinearDS": kpcaP = KPCAParam() # select kernel if config["kdtKern"] == "rbf": kpcaP._kPar = RBFParam() kpcaP._kFun = rbfK else: dsinfo.fail("Kernel %s not supported!" % kdtKern) return -1 # configure kernel if config["kCenter"] == 1: kpcaP._kPar._kCen = True else: kpcaP._kPar._kCen = False # create online version of KDT ds = OnlineNonLinearDS(nStates, kpcaP, winSize, shiftMe, verbose) else: dsinfo.fail("System type %s not supported!" % options.dsType) return -1 dList = [] for f in range(inVideo.shape[1]): ds.update(inVideo[:, f]) if ds.check() and ds.hasChanged(): dists = np.zeros((len(db),)) for j, dbentry in enumerate(db): dists[j] = {"LinearDS": dsdist.ldsMartinDistance, "NonLinearDS": dsdist.nldsMartinDistance}[ dynType.__name__ ](ds, dbentry["model"], numIter) dList.append(dists) # write distance matrix if not mdFile is None: np.savetxt(mdFile, np.asmatrix(dList), fmt="%.5f", delimiter=" ")