Beispiel #1
0
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
Beispiel #2
0
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=' ')
Beispiel #3
0
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=" ")