根据最常见的标签快速标记一些元素

时间:2012-06-08 20:37:53

标签: c++ map vector

假设我有组件的向量(每个组件是浮点数的向量)

vector<vector<float> > components

我有一个数据向量(每个数据是一个与组件大小相同的浮点数)

vector< vector<float> > data

和与此数据相关联的标签

vector<string> labels

(我的意思是label[i]data[i])的标签。我还有一个距离函数,它返回两个向量之间的距离

float distance(vector<float> v1, vector<float> v2);

我想根据与此组件关联的数据中最常出现的标签为每个组件添加标签;即如下:

for each data d from data
{
   let c the nearest component from d according to distance.
   associate the label of d to c.
}

for each component c
{
   definitely give to c the label that occur the most among labels associated to it
   // example if labels {l1,l2,l1,l2,l1,l1,l1,l8,l1} were associated to c, then its label should be l1
}

应该返回的最终结果是标记组件的矢量(<component,label>对),描述为:

vector< pair< vector<float>, string > > labeledComponents.

在C ++中用简单快捷的方法做什么?

2 个答案:

答案 0 :(得分:1)

这个任务很复杂,所以在C ++中没有 super 简单快捷的方法,但这就是我得到的:

typedef vector<float> componenttype;
typedef vector<float> datatype;
typedef map<string, int> possiblenames;
typedef vector<pair<componenttype, string>> resulttype;

float vecdistance(datatype v1, componenttype v2) {return 1.0;}

resulttype user995434(vector<datatype> data, vector<string> labels, vector<componenttype> components) {
    map<componenttype, possiblenames> maybenames;
    resulttype resultnames;

    //for each data d from data
    for(auto d=data.begin(); d!=data.end(); ++d) {
       //let c the nearest component from d according to distance.
       auto closest=components.begin();
       float closedistance = FLT_MAX;
       for(auto it=components.begin(); it!=components.end(); ++it) {
           float dist = vecdistance(*d, *it);
           if (dist < closedistance) {
               closedistance = dist; 
               closest = it;
           }
        }
        //associate the label of d to c.
        int offset = std::distance(data.begin(), d);
        maybenames[*closest][labels[offset]]++;
    }
    //for each component c
    for(auto c=components.begin(); c!=components.end(); ++c) {
        //let mostname be the name with the most matches.
        auto posnames = maybenames[*c];
        posnames[""]=0; //guarantee each component has _something_
        auto mostname = posnames.begin();
        for(auto it=posnames.begin(); it!=posnames.end(); ++it) {
            if (it->second > mostname->second)
                mostname = it;
        }
        //associate mostname with c
        resultnames.push_back(make_pair(*c, mostname->first));
    }
    return resultnames;
}

Proof of compilation and execution here,虽然我没有以任何方式验证它的准确性。

我应该注意,由于您从未提及任何数据以任何方式排序,也没有任何其他可用作快捷方式的内容,因此该算法在任何语言中都不是“快速”。

答案 1 :(得分:0)

你几乎有根据数据元素找到C标签的算法。您将不得不遍历components的每个元素并查看距离是否小于当前最小值:如果是,请记住当前组件并将最小距离设置为当前距离。

注意:不要忘记多个组件可以达到相同的最小距离,因此请保留最小距离组件的集合,而不仅仅是一个

您可以构建组件的地图(请参阅std::map<>)(标签到出现次数的地图),然后从此映射中选择每个组件的最高出现次数