0

假设我有分量向量(每个分量都是一个浮点向量)

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++ 中简单快捷的方法是什么?

4

2 回答 2

1

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

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;
}

这里的编译和执行证明,尽管我没有以任何方式验证它的准确性。

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

于 2012-06-08T21:23:19.107 回答
0

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

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

您可以构建一个std::map<>组件映射(参见 )到(标签映射到出现编号),然后从此映射中为每个组件选择最高出现编号

于 2012-06-08T20:52:07.417 回答