Beispiel #1
0
void    KPCA::compPrimalAdd(const float* feature,size_t featureDim_,size_t firstEigen_,size_t eigenCount_)
{
    if (featureDim == 0)
        compPrimalBegin(featureDim_,firstEigen_,eigenCount_);
    if (featureDim != featureDim_)
        retinThrowException2("Bad featureDim %d != %d",featureDim_,featureDim);
    if (firstEigen != firstEigen_)
        retinThrowException2("Bad firstEigen %d != %d",firstEigen_,firstEigen);
    if (eigenCount != eigenCount_)
        retinThrowException2("Bad eigenCount %d != %d",eigenCount_,eigenCount);
    if (featureCount > dim)
        retinThrowException1("Wrong number of features (%ld expected)",dim);
    vector_add_float(&primalMean[0],feature,featureDim_);
    for (size_t j=0;j<eigenCount;j++) {
        double eig = 1.0 / sqrt(eigens[firstEigen+j].getValue());
        const double* eigv = eigens[firstEigen+j].getVector();
        vector_addm_float(&primalVectors[j*featureDim],eigv[featureCount] * eig,feature,featureDim);
    }
    featureCount ++;
}
Beispiel #2
0
    size_t SparseVlatCluster::getVlat(float* buf,const std::string& format) const{
        size_t featureDim = getTensorDim(1);
        size_t vlatDim = getTensorDim(mainOrder);
        vector<float> sparseVlat(vlatDim);
        vector<int> sparseMask;
        
        if (buf){
            memcpy(&sparseVlat[0], &vlat[0], vlatDim*sizeof(float));
            vector<pair<size_t, float> > sortTable;
            if(mainOrder == 1 || sparsityOn == SparseVlatCluster::sparsityOnDiag){
                sortTable.reserve(featureDim);
                sparseMask.reserve(featureDim);
                for(size_t i = 0 ; i < featureDim ; i++){
                        sortTable[i].first = i;
                        sortTable[i].second = varDual[i];
                }
                sort(sortTable.begin(), sortTable.end(), myfunction);
            }
            else if(sparsityOn == SparseVlatCluster::sparsityOnFull){
                sortTable.reserve(featureDim*featureDim);
                sparseMask.reserve(featureDim*featureDim);
                for(size_t i = 0 ; i < featureDim*featureDim ; i++){
                        sortTable[i].first = i;
                        sortTable[i].second = varDual[i];
                }
                sort(sortTable.begin(), sortTable.end(), myfunction);
            }

            if(sparsityStrategy == SparseVlatCluster::sparsityStrategyDim){
                for(size_t i = 0 ; i < sparsityDim ; i++)
                    sparseMask[sortTable[i].first] = 1;
                for(size_t i = sparsityDim ; i < sortTable.size() ; i++)
                    sparseMask[sortTable[i].first] = 0;
            }
            else if(sparsityStrategy == SparseVlatCluster::sparsityStrategyEnergy){
                float sumVar = 0;
                for(size_t i = 0 ; i < sortTable.size() ; i++)
                    sumVar += varDual[i];
                size_t i;
                float sum;
                for(i=0, sum = 0; i < sortTable.size() && sum<sumVar*sparsityEnergy ; i++){
                    sparseMask[sortTable[i].first] = 1;
                    sum += sortTable[i].second;
                }
                for( ; i < sortTable.size() ; i++)
                    sparseMask[sortTable[i].first] = 0;
            }
        }
        
        if (mainOrder == 1) {
            if (buf){
                memcpy(&sparseVlat[0], &vlat[0], featureDim*sizeof(float));
                for(size_t i = 0 ; i < featureDim; i++){
                    if(sparseMask[i] == 0){
                        sparseVlat[i] = 0.0f;
                    }
                }
            
                memcpy(buf, &sparseVlat[0], featureDim*sizeof(float));
            }
            return featureDim;
        }
        else if (mainOrder == 2) {
            if (buf){
                if(sparsityOn == SparseVlatCluster::sparsityOnDiag){
                    memcpy(&sparseVlat[0], &vlat[0], vlatDim*sizeof(float));
                    for(size_t i = 0 ; i < featureDim; i++){
                        if(sparseMask[i] == 0){
                            for(size_t j = 0 ; j < featureDim ; j++){
                                sparseVlat[j+featureDim*i] = 0.0f;
                                sparseVlat[i+featureDim*j] = 0.0f;
                            }
                        }
                    }
                }
                else if(sparsityOn == SparseVlatCluster::sparsityOnFull){
                    memcpy(&sparseVlat[0], &vlat[0], vlatDim*sizeof(float));
                    for(size_t i = 0 ; i < vlatDim; i++){
                         if(sparseMask[i] == 0){
                             sparseVlat[i] = 0.0f;
                        }
                    }
                }
                for(size_t i = 0; i < featureDim ; i++)
                        sparseVlat[i*featureDim + i] -= counter*L[i];
            }
            
            if (format == "full") {
                if (buf)
                    memcpy(buf,&sparseVlat[0],featureDim*featureDim*sizeof(float));
                return featureDim*featureDim;
            }
            else if (format == "LD") {
                if (buf) {
                    for (size_t i=0;i<featureDim;i++) {
                        for (size_t j=i;j<featureDim;j++)
                            *buf++ = sparseVlat[i+j*featureDim];
                    }
                }
                return (featureDim*(featureDim+1))/2;
            }
            else if (format == "L") {
                if (buf) {
                    for (size_t i=0;i<featureDim;i++) {
                        for (size_t j=i+1;j<featureDim;j++)
                            *buf++ = sparseVlat[i+j*featureDim];
                    }
                }
                return (featureDim*(featureDim-1))/2;
            }
            else {
                retinThrowException1("Unsupported format %s", format.c_str());
            }
        }
        else {
            retinThrowException1("Unsupported order %d", mainOrder);
        }
    }
Beispiel #3
0
PackedVlatBuilder::PackedVlatBuilder(size_t order,size_t dictSize,size_t featureDim)
             : VlatBuilder<PackedVlatCluster>(order,dictSize,featureDim)
{
    if (order != 2)
        retinThrowException1("Invalid order %d for PackedVlat",order);
}