📄 som.h
字号:
// Som.h: interface for the Som class.
/*****************************************************************
* 名称:自组织特征影射神经网络Som
* 作者:湘潭大学信息工程学院李▲▲ xtulbd@yahoo.com.cn
* 时间:2004-07-26
* 功能:识别鼠标书写的文字,识别结果为网络记忆的S个模式之一。
* DS:
网络输入层具有N(row×col)个神经元,网络竞争层具有m×m=M个神经元。
网络的学习样本为S个文字的二维掩膜的一维化向量sampleBins[N](N=row×col)与所对应的文字sampleWords[N]。
网络的输入层神经元为input[N],网络的竞争层神经元为compete[m][m],
网络的输出为output[M]。
输入层与竞争层之间的连接权为weight[N][M]。
学习率为beta;
总学习次数time;
领域大小为neighbor;
获胜神经元gain;
* 学习算法:
初始化连接权、学习率、邻域大小、总学习次数;
给网络提供一个输入样本;
计算输入样本与到输出层的连接权向量之间的距离;
选择最小距离对应的输出层神经元为获胜神经元;
调整到获胜神经元及其邻域内的神经元的连接权;
给网络提供下一个输入样本,直至S个样本全部学习一遍;
全部学习一遍之后,更新学习率、邻域大小学;
进入下一轮学习,直至学习time回。
附:回想时,选择与输入模式距离最近的竞争层神经元为获胜神经元,对应的输出文字与输入文字最相似。
* 方法(函数):
1)学习
设置学习样本;
//void SetSample(int sampleBins[S][N], CString sampleWords[S]);
void SetSample(int **sampleBins, sampleWords[]);
void SetSample(int **sampleBins, sampleWords);
初始化网络;
void InitNet();
计算输入与到竞争层的连接权之间的距离;
double *distance;
void CalDiatance(int input[]);
选取获胜神经元;
int *gain;
void SetGains();
调整到获胜神经元及其邻域内的神经元的连接权;
2)回想
设置输入;
//void SetInput(int input[]);
获取输出;
CString GetOutput(int input[]);
3) 其它
构造函数;
Som(int S, int N, int m, int sampleBins[], CString sampleWords[], double beta=0.9, int time=1000 );
保存连接权为文件;
WeightToFile(CString fileName);
******************************************************************/
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_SOM_H__E8769C48_91F9_419C_BC93_F0FB5A0FA71A__INCLUDED_)
#define AFX_SOM_H__E8769C48_91F9_419C_BC93_F0FB5A0FA71A__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class Som
{
/**********************************************
Som--|--Som--|--SetSamples
| |
| |--Study--|--InitNet
| |--CalDiatances
| |--SetGains
| |--ChangeGainsWeight
|--GetSample
|--WeightsToFile
|--GetOutput
***********************************************/
public:
Som();
virtual ~Som();
Som(int S, int N, int m, int **sampleBins, CString sampleWords[], double beta=0.9, int time=10000 );
Som(int S, int N, int m, int **sampleBins, CString sampleWords , double beta=0.9, int time=10000 );
private:
int S;
int N;
int m,M;
int **sampleBins;
CString **sampleWords;
//int *input;
//int *compete;
double *distance;
int *output;
double **weight;
double beta,beta0;;
int time;
int neighbor,neighbor0;
int *gains;
//void SetSamples(int sampleBins[S][N], CString sampleWords[S]);
void SetSamples(int **sampleBins, CString sampleWords[]);//设置学习样本;
void SetSamples(int **sampleBins, CString sampleWords);
void Study();//学习
void InitNet();//初始化网络;
void CalDiatances(int input[]);//计算输入与到竞争层的连接权之间的距离;
void SetGains(int sample); //选取获胜神经元;
void ChangeGainsWeight(int input[]);//调整到获胜神经元及其邻域内的神经元的连接权;
public:
void GetSample(int sampleNum, int sampleBin[]);
void GetResult(int g, int Bin[]);
void WeightsToFile(CString fileName); //保存连接权为文件;
void GainsToFile(CString fileName); //保存连接权为文件;
//void SetInput(int input[]);//设置输入;
int GetOutput(int input[]);//获取输出;
CString GetOutputWord(int input[]);//获取输出;
};
#endif // !defined(AFX_SOM_H__E8769C48_91F9_419C_BC93_F0FB5A0FA71A__INCLUDED_)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -