64,648
社区成员
发帖
与我相关
我的任务
分享
//位置信息
struct Tuple {
long float attr1;
long float attr2;
};
//获得当前簇的质心
Tuple getMeans(vector<Tuple> cluster) {
int num = cluster.size();
long float meansX = 0, meansY = 0;
Tuple t;
for (int i = 0; i < num; i++)
{
meansX += cluster[i].attr1;
meansY += cluster[i].attr2;
}
t.attr1 = meansX / num;
t.attr2 = meansY / num;
return t;
}
//获得给定簇集的平方误差(vector版)
float V_getVar(vector<Tuple> clusters[], vector<Tuple> means) {
float var = 0;
for (int i = 0; i < k; i++)
{
vector<Tuple> t = clusters[i];
for (int j = 0; j< t.size(); j++)
{
var += getDistXY(t[j], means[i]);
}
}
//cout<<"sum:"<<sum<<endl;
return var;
}
float oldVar = -1;
float newVar = V_getVar(cluster, tuple);
while (abs(newVar - oldVar) >= 1) //当新旧函数值相差不到1即准则函数值不发生明显变化时,算法终止
{
tuple.clear();
for (int j = 0; j < k; j++) //更新每个簇的中心点
{
tuple.push_back(getMeans(cluster[j]));
cout << "更新" << tuple[j].attr1 <<" "<<tuple[j].attr2<< endl;//问题就在这里,当k大于6的时候控制台就会输出-(nan)ind
}
for (int i = 0; i < k; i++) //清空每个簇
{
cluster[i].clear();
}
//根据新的质心获得新的簇
for (int i = 0; i < clusters.size(); i++) {
lable = clusterofTuple(tuple, clusters[i]);//means->initial
cluster[lable].push_back(clusters[i]);
}
oldVar = newVar;
newVar = V_getVar(cluster, tuple); //计算新的准则函数值
}
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
unsigned long ulrand(void) {
return (
(((unsigned long)rand()<<24)&0xFF000000ul)
|(((unsigned long)rand()<<12)&0x00FFF000ul)
|(((unsigned long)rand() )&0x00000FFFul));
}
unsigned __int64 ullrand(void) {
return (
(((unsigned __int64)ulrand())<<32)
| ((unsigned __int64)ulrand()));
}
int i;
unsigned long ul;
unsigned __int64 ull;
void main() {
srand(time(NULL));
for (i=0;i<10;i++) {
ul=ulrand();
printf("%010lu 0x%08x\n",ul,ul);
}
for (i=0;i<10;i++) {
ull=ullrand();
printf("%020I64u 0x%016I64x\n",ull,ull);
}
}
//3971076432 0xecb1d150
//2433428051 0x910b2a53
//1415415336 0x545d8628
//1312330759 0x4e389407
//1845758378 0x6e0409aa
//0008069933 0x007b232d
//4202720757 0xfa806df5
//2669855255 0x9f22c217
//0312068736 0x1299ca80
//2084555989 0x7c3fccd5
//03502077880857307931 0x3099e1472040ab1b
//16884702393146816355 0xea52835e19b43763
//01877364819396611730 0x1a0dbd5b45f34e92
//07839440151924835771 0x6ccb4948756a05bb
//09471412086917299176 0x8371371c820bfbe8
//04411255971577469925 0x3d37edef2f321be5
//13735846279546091130 0xbe9f876a65b7367a
//04512980766520059820 0x3ea15418aa9927ac
//15821377118299441610 0xdb90d2a9f1bb49ca
//15512417228822200185 0xd7472d480398bf79