⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 isodata.h

📁 用C语言实现了ISODATA算法,包括ISODATA.vcproj
💻 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 + -