资源简介
ISODATA算法VC++实现,我用的260个小数点坐标做了测试!能够实现1.2特快专递业务(含完整数据)这个程序,为了方便大家下载!把它提供到了网上
代码片段和文件信息
// ISODATA.cpp : 定义控制台应用程序的入口点。
//
#include “stdafx.h“
#include “ISODATA.h“
#include “Sort.h“
#include
using namespace std;
// class ISODATA
extern int N;
extern int dim;
ISODATA::ISODATA()
{
c = 2; // 预期的类数;
Nc = 1; // 初始聚类中心个数(可以不等于c);
theta_n = 2; // 每一类中允许的最少模式数目(若少于此数,就不能单独成为一类);
theta_s = 1; // 类内各分量分布的标准差上限(大于此数就分裂);
theta_D = 4; // 两类中心间的最小距离下限(若小于此数,这两类应合并);
L = 1; // 在每次迭代中可以合并的类的最多对数;
I = 4; // 允许的最多迭代次数;
_d = 100; // 总体平均距离
Ip = 0; // 迭代次数
double D[MAXNUM][MAXNUM]; // 各类对中心间的距离
for(int i=0;i for(int j=0;j D[i][j] = MAXDOUBLE;
}
ISODATA::~ISODATA()
{
}
// 设置参数
int ISODATA::SetupPattern(Pattern * pattern)
{
for(int i=0;i x[i] = pattern[i];
return N;
}
// 算法实现步骤
int ISODATA::Process()
{
bool changed = true;
// 1.预置
// 2)将待分类的模式特征矢量x1x2...xn读入;
// SetupPattern();
// 3)选定初始聚类中心,可从待分类的模式特征矢量集{xi}中任选Nc个模式特征矢量作为初始聚类中心zj(j=12...Nc).
InitCenter();
step1:
// 1)设定聚类分析控制参数:
SetupParameter();
step2:
// 2.按最小距离原则将模式集(xi)中每个模式分到某一类中
changed = false;
Clustering();
if(Ip == 0)
cout << endl << “------------- 选取初始聚类中心 ---------------“ << endl;
else
cout << endl << “-------------第“ << Ip << “次迭代-------------“ << endl;
PrintSort();
step3:
// 3.依据theta_n判断合并。如果类wj中样本数nj if(CombinBytheta_n())
goto step2;
step4:
// 计算分类后的参数:各类中心、类内平均距离及总体平均距离。
CalParameter();
step5:
// 依据Ip Nc 判断停止\分裂或合并。
if(Ip == I)
{
theta_D = 0;
goto step9;
}
else if(Nc <= c/2)
goto step6;
else if(Nc >= 2*c)
goto step9;
else if(Ip%2 == 1) //Nc> c/2 && Nc < 2*c
goto step6;
else
goto step9;
step6:
// 计算各类类内距离的标准差矢量
CalSigma();
step7:
// 求出每一聚类类内距离标准差矢量sigma中的最大分量sigma_max
// CalMaxSigma(); // 由于在Sort类中已进行计算,这里不做任何处理
step8:
// 判断分裂
if(Split())
{
changed = true;
Ip++;
goto step2;
}
step9:
// 计算各类对中心间的距离
CalCenterDis();
step10:
// 依据theta_D判断合并
if(CombinBytheta_D())
changed = true;
step11:
// 判断循环还是退出
if(Ip >= I)
{
cout << endl << endl << “==========经过“ << Ip << “次迭代,达到迭代次数===========“ << endl;
goto over;
}
else if(changed == false)
{
Ip++;
cout << endl << endl << “==========经过“ << Ip << “次迭代,算法收敛===========“ << endl;
goto over;
}
else
{
Ip++;
char ch;
cout << “本次迭代完成,是否需要改变参数(Y/N)?: “;
cin >> ch;
if(ch == ‘y‘ || ch == ‘Y‘)
goto step1;
else
goto step2;
}
over:
PrintSort();
return Ip;
}
// 3)选定初始聚
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2013-05-07 16:00 ISODATA\
目录 0 2013-05-07 16:00 ISODATA\Debug\
文件 136192 2013-05-07 15:40 ISODATA\Debug\ISODATA.exe
文件 850708 2013-05-07 15:40 ISODATA\Debug\ISODATA.ilk
文件 977920 2013-05-07 15:40 ISODATA\Debug\ISODATA.pdb
文件 3649024 2013-04-05 23:10 ISODATA\Debug\opencv_core245d.dll
文件 3818496 2013-04-05 23:11 ISODATA\Debug\opencv_highgui245d.dll
文件 3357696 2013-04-05 23:10 ISODATA\Debug\opencv_imgproc245d.dll
目录 0 2013-05-07 16:00 ISODATA\ISODATA\
目录 0 2013-05-07 16:00 ISODATA\ISODATA\Debug\
文件 11206 2013-05-07 15:40 ISODATA\ISODATA\Debug\CL.read.1.tlog
文件 3400 2013-05-07 15:40 ISODATA\ISODATA\Debug\CL.write.1.tlog
文件 1423 2013-05-07 15:40 ISODATA\ISODATA\Debug\ISODATA.Build.CppClean.log
文件 95 2013-05-07 15:40 ISODATA\ISODATA\Debug\ISODATA.lastbuildstate
文件 3512 2013-05-07 15:40 ISODATA\ISODATA\Debug\ISODATA.log
文件 240626 2013-05-07 15:40 ISODATA\ISODATA\Debug\ISODATA.obj
文件 13631488 2013-05-07 15:40 ISODATA\ISODATA\Debug\ISODATA.pch
文件 220702 2013-05-07 15:40 ISODATA\ISODATA\Debug\MAIN.obj
文件 14284 2013-05-07 15:40 ISODATA\ISODATA\Debug\Pattern.obj
文件 17588 2013-05-07 15:40 ISODATA\ISODATA\Debug\Sort.obj
文件 4074 2013-05-07 15:40 ISODATA\ISODATA\Debug\cl.command.1.tlog
文件 2 2013-05-07 15:40 ISODATA\ISODATA\Debug\li
文件 2 2013-05-07 15:40 ISODATA\ISODATA\Debug\li
文件 2 2013-05-07 15:40 ISODATA\ISODATA\Debug\li
文件 2 2013-05-07 15:40 ISODATA\ISODATA\Debug\li
文件 2994 2013-05-07 15:40 ISODATA\ISODATA\Debug\li
文件 5978 2013-05-07 15:40 ISODATA\ISODATA\Debug\li
文件 1358 2013-05-07 15:40 ISODATA\ISODATA\Debug\li
文件 155905 2013-05-07 15:40 ISODATA\ISODATA\Debug\stdafx.obj
文件 379904 2013-05-07 15:40 ISODATA\ISODATA\Debug\vc110.idb
文件 536576 2013-05-07 15:40 ISODATA\ISODATA\Debug\vc110.pdb
............此处省略23个文件信息
评论
共有 条评论