📄 isodata.h
字号:
// ISODATA.h
#pragma once
#include "stdafx.h"
#include <time.h>
#include <stdlib.h>
#include "Pattern.h"
#include "Sort.h"
/******************************************************************
// class name: ISODATA
// description: ISODATA类,该类为实现ISODATA算法的主要类
算法的流程按照教材所给出的步骤进行,主要流程执行函数为:
int ISODATA::Process();
// limitation: 算法中流程在执行时使用了 goto 命令,难以替换为while或for的循环。
******************************************************************/
class ISODATA
{
// 参数
int c; // 预期的类数;
int Nc; // 初始聚类中心个数(可以不等于c);
int theta_n; // 每一类中允许的最少模式数目(若少于此数,就不能单独成为一类);
double theta_s; // 类内各分量分布的标准差上限(大于此数就分裂);
double theta_D; // 两类中心间的最小距离下限(若小于此数,这两类应合并);
int L; // 在每次迭代中可以合并的类的最多对数;
int I; // 允许的最多迭代次数;
Sort w[MAXNUM]; // 类
Pattern x[MAXNUM]; // 模式
double _d; // 总体平均距离
int Ip; // 迭代次数
double D[MAXNUM][MAXNUM]; // 各类对中心间的距离
public:
ISODATA();
~ISODATA();
// 设置样本
int SetupPattern(Pattern * x);
// ISODATA算法流程
int Process();
private:
// step1: 设定聚类分析控制参数
void SetupParameter();
// 3)选定初始聚类中心
void InitCenter();
// step2: 按最小距离原则将模式集(xi)中每个模式分到某一类中
void Clustering();
// step3: 依据theta_n判断合并。如果类wj中样本数nj<theta_n,则取消该类的中心zj,Nc = Nc - 1;转至 step2.
bool CombinBytheta_n();
// step4: 计算分类后的参数:各类中心、类内平均距离及总体平均距离。
void CalParameter();
// step6: 计算各类类内距离的标准差矢量
void CalSigma();
// step7: 求出每一聚类类内距离标准差矢量sigma中的最大分量sigma_max
void CalMaxSigma();
// step8: 判断分裂
bool Split();
// step9: 计算各类对中心间的距离
void CalCenterDis();
// step10: 依据theta_D判断合并
bool CombinBytheta_D();
// 输出当前模式分类情况
void PrintSort();
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -