- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经完成了距离的计算并存储在推力 vector 中,例如,我有 2 个质心和 5 个数据点,我计算距离的方法是,对于每个质心,我首先计算 5 个数据点的距离并存储在阵列,然后与距离一维阵列中的另一个质心,就像这样:
for (int i = 0; i < centroids.size(); ++i)
{
computeDistance(Data, distances, centroids[i], nDataPoints, nDimensions);
}
产生 vector 1d,例如:
DistancesValues = {10, 15, 20, 12, 10, 5, 17, 22, 8, 7}
DatapointsIndex = {1, 2, 3, 4, 5, 1, 2, 3, 4, 5}
其中前 5 个值代表质心 1,其他 5 个值代表质心 2。
我想知道是否有一个推力函数,我可以在其中将计数存储在每个质心的另一个最小值数组中?
比较各个指标的值,结果应该是:
Counts = {2, 3}
哪里:
CountOfCentroid 1 = 2
CountOfCentroid 2 = 3
最佳答案
这是一种可能的方法:
创建一个额外的质心索引 vector :
DistancesValues = {10, 15, 20, 12, 10, 5, 17, 22, 8, 7}
DatapointsIndex = {1, 2, 3, 4, 5, 1, 2, 3, 4, 5}
CentroidIndex = {1, 1, 1, 1, 1, 2, 2, 2, 2, 2}
现在做一个 sort_by_key,使用 DatapointsIndex
作为键,其他两个 vector 压缩在一起作为值。这具有重新排列所有 3 个 vector 的效果,以便 DatapointsIndex
具有类似的索引组合在一起:
DatapointsIndex = {1, 1, 2, 2, 3, 3, 4, 4, 5, 5}
(另外2个 vector 相应重新排列)。
现在做一个 reduce_by_key。如果我们选择 thrust::minimum
运算符,我们会得到一个减少,它有效地选择组中的最小值(而不是对组中的值求和)。 reduce_by_key 意味着这种类型的缩减是在每组连续的相似键上完成的。因此,我们将再次使用 DatapointsIndex
作为我们的键 vector ,并将其他两个 vector 压缩在一起作为我们的值 vector 。我们不关心 reduce_by_key 的大部分输出,除了从 CentroidIndex
vector 发出的结果 vector 。通过计算此结果 vector 中的质心索引,我们可以获得所需的输出。
这是一个完整的例子:
$ cat t428.cu
#include <thrust/host_vector.h>
#include <thrust/device_vector.h>
#include <thrust/sort.h>
#include <thrust/reduce.h>
#include <thrust/copy.h>
#include <thrust/iterator/zip_iterator.h>
#include <thrust/iterator/discard_iterator.h>
#include <stdio.h>
#define NUM_POINTS 5
#define NUM_CENTROID 2
#define DSIZE (NUM_POINTS*NUM_CENTROID)
int main(){
int DistancesValues[DSIZE] = {10, 15, 20, 12, 10, 5, 17, 22, 8, 7};
int DatapointsIndex[DSIZE] = {1, 2, 3, 4, 5, 1, 2, 3, 4, 5};
int CentroidIndex[DSIZE] = {1, 1, 1, 1, 1, 2, 2, 2, 2, 2};
thrust::device_vector<int> DV(DistancesValues, DistancesValues + DSIZE);
thrust::device_vector<int> DI(DatapointsIndex, DatapointsIndex + DSIZE);
thrust::device_vector<int> CI(CentroidIndex, CentroidIndex + DSIZE);
thrust::device_vector<int> Ra(NUM_POINTS);
thrust::device_vector<int> Rb(NUM_POINTS);
thrust::sort_by_key(DI.begin(), DI.end(), thrust::make_zip_iterator(thrust::make_tuple(DV.begin(), CI.begin())));
thrust::reduce_by_key(DI.begin(), DI.end(), thrust::make_zip_iterator(thrust::make_tuple(DV.begin(), CI.begin())), thrust::make_discard_iterator(), thrust::make_zip_iterator(thrust::make_tuple(Ra.begin(), Rb.begin())), thrust::equal_to<int>(), thrust::minimum<thrust::tuple<int, int> >());
printf("CountOfCentroid 1 = %d\n", thrust::count(Rb.begin(), Rb.end(), 1));
printf("CountOfCentroid 2 = %d\n", thrust::count(Rb.begin(), Rb.end(), 2));
return 0;
}
$ nvcc -arch=sm_20 -o t428 t428.cu
$ ./t428
CountOfCentroid 1 = 2
CountOfCentroid 2 = 3
$
正如 Eric 在他的回答中指出的那样 here (您的问题几乎与那个问题重复),sort_by_key
可能是不必要的。此数据的重新排序遵循规则模式,因此我们无需利用排序的复杂性,因此可以巧妙地使用迭代器对数据重新排序。在这些情况下,只需一次调用 reduce_by_key
就可以(大约)完成整个操作。
关于c++ - 使用推力库获取最近的质心? (K-均值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23970593/
前言 一年一度的虐狗节终于过去了,朋友圈各种晒,晒自拍,晒娃,晒美食,秀恩爱的。程序员在晒什么,程序员在加班。但是礼物还是少不了的,送什么好?作为程序员,我准备了一份特别的礼物,用以往发的微博数据
默认情况下,我有一个 V3 map 加载并以特定的经度/纬度为中心。加载后,用户可以输入他们的地址以获取前往该地点的路线。发生这种情况时, map 会调整大小以适应其左侧的方向框。因此,路线在 map
我是一名优秀的程序员,十分优秀!