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

📄 fish.cpp

📁 fish算法,模式识别
💻 CPP
字号:
#include <iostream.h>
#include <math.h>
#include <stdlib.h>

#define NUM 8     //8维向量,每一维代表一路传感器的数据   
#define cnum 2     //2类
#define N1   60      //w1类模式个数(100A)
#define N2   60      //w2类模式个数(50A)

unsigned char  data[10][4][8][8][60]={
	{ 
#include "样本//rmb00.txt" 
	}, 
	{ 
#include "样本//rmb01.txt" 
	},
	{ 
#include "样本//rmb02.txt" 
	},
	{ 
#include "样本//rmb03.txt" 
	},
	{ 
#include "样本//rmb04.txt" 
	},
	{ 
#include "样本//rmb05.txt"
	},
	{ 
#include "样本//rmb06.txt"
	},
	{ 
#include "样本//rmb07.txt" 
	},
	{ 
#include "样本//rmb08.txt" 
	},
	{ 
#include "样本//rmb09.txt"
	}
};

void  PrintV(double x[N1][NUM])
{
	int i,j;
	for(i=0;i<N1;i++)
	{
		cout<<endl;
		for(j=0;j<NUM;j++)
			cout<<x[i][j]<<"  ";
	}
}

void  Getmj(double mj[NUM],double x[N1][NUM])
{
	int i,j;
	double d=0.0;
	for(i=0;i<NUM;i++)
	{
		d=0.0;
		for(j=0;j<N1;j++)
			d+=x[j][i];
		if(N1!=0)
		mj[i]=d/N1;
	}
}

void Printmj(double mj[NUM])
{
	int i;
	for(i=0;i<NUM;i++)
		cout<<mj[i]<<"  ";
	cout<<endl;
}

void PrintSW(double sw[NUM][NUM])
{
	int i,j;
	cout<<endl;
	for(i=0;i<NUM;i++)
	{
		
		for(j=0;j<NUM;j++)
			cout<<sw[i][j]<<"  ";
		cout<<endl;

	}
	cout<<endl;
}

void PrintY(double Y[N1])
{
	int i;
	for(i=0;i<N1;i++)
	{
		if(!(i%8)&&i>7)
			cout<<endl;
		cout<<Y[i]<<"  ";
	
	}
	cout<<endl;
}

void GetSWi(double sw1[NUM][NUM],double x[N1][NUM])
{
	double m[NUM];
	int i,j,k;
	double d=0.0;

	Getmj(m,x);

		for(j=0;j<NUM;j++)
			for(k=0;k<NUM;k++)
			{
				d=0.0;
				for(i=0;i<N1;i++)
		        	d+=(x[i][j]-m[j])*(x[i][k]-m[k]);
				sw1[j][k]=d/N1;
			}
}

void GetSW(double sw[NUM][NUM],double sw1[NUM][NUM],double sw2[NUM][NUM])
{
	int i,j;
	for(i=0;i<NUM;i++)
		for(j=0;j<NUM;j++)
			sw[i][j]=sw1[i][j]+sw2[i][j];
}

//****************************************************************************
//void SelectMain选主元
////求逆矩阵 void GetVi
//****************************************************************************
///选主元
void SelectMain(double A[NUM][2*NUM],int k)//choose main
{
	//共n行,m列,选第K列主元
	int n=NUM;
	int m=2*NUM;
	double d=0.0;//main
	double t;
	int l;//主元所在行
	int i,j;
	for(i=k;i<=n;i++)
	{
		if(fabs(A[i][k])>d)
		{
			d=A[i][k];
			l=i;
		}
	}
	if(d=0)
	{
		cerr<<"该矩阵为奇异矩阵!"<<endl;
		exit(1);
	}
	else if(l!=k)//交换行
	{
		for(j=k;j<=m;j++)
		{
			t=A[l][j];
			A[l][j]=A[k][j];
			A[k][j]=t;
		}
	}
}
double I[NUM][NUM];//8*8单位矩阵
	double H[NUM][2*NUM];
//求逆矩阵
void GetVi(double Vi[NUM][NUM],double V[NUM][NUM])
{
	
    int i,j,r;
	for( i=0;i<NUM;i++)
		for( j=0;j<NUM;j++)
		{
			I[i][j]=(i==j?1:0);
		}

     for( i=0;i<NUM;i++)
		 for( j=0;j<2*NUM;j++)
		 {
			 if(j>NUM-1)
                H[i][j]=I[i][j-NUM];
			 else
				 H[i][j]=V[i][j];
		 }

       
      for (r=0;r<NUM;r++)
	{
		SelectMain(H,r);//选第R列主元,并交换行
		
	   for(i=2*NUM-1;i>=r;i--)
			H[r][i]=H[r][i]/H[r][r];
          
		for( i=0;i<r;i++)
			for(j=2*NUM-1;j>=r;j--)
				H[i][j]=H[i][j]-H[i][r]*H[r][j];

		for( i=r+1;i<NUM;i++)
			for(j=2*NUM-1;j>=r;j--)
				H[i][j]=H[i][j]-H[i][r]*H[r][j];

			


	} 

	  for( i=0;i<NUM;i++)
	  for(j=0;j<NUM;j++)
	  {
		  Vi[i][j]=H[i][j+NUM];
	  }
	  
      
}
/*
void Gauss_Jordan(double matv[NUM][NUM],double matv1[NUM][NUM])
{
	double mat[NUM][2*NUM],d;
	int i,j,l,k;
	for (i=0;i<NUM;i++) {
		for (j=0;j<2*NUM;j++) {
			if (j<NUM) 
				mat[i][j]=matv[i][j];
			else 
				mat[i][j]=0.0;
		}
	}
	for (i=0;i<NUM;i++) mat[i][NUM+i]=1.0;
	for (k=0;k<NUM;k++) {
		d=fabs(mat[k][k]);
		j=k;
		for (i=k+1;i<NUM;i++) {//选主元
			if (fabs(mat[i][k])>d) {
				d=fabs(mat[i][k]);
				j=i;
			}
		}
		if (j!=k) { //交换
			for (l=0;l<2*NUM;l++) {
				d=mat[j][l];
				mat[j][l]=mat[k][l];
				mat[k][l]=d;
			}
		}
		for (j=k+1;j<2*NUM;j++) {
			mat[k][j]/=mat[k][k];
		}
		for (i=0;i<NUM;i++) {
			if (i==k) continue;
			for (j=k+1;j<2*NUM;j++) {
				mat[i][j]-=mat[i][k]*mat[k][j];
			}
		}
	}
	for (i=0;i<NUM;i++) {
		for (j=0;j<NUM;j++) {
			matv1[i][j]=mat[i][j+NUM];
		}
	}
}
*/
void GetU(double isw[NUM][NUM],double m1[NUM],double m2[NUM],double U[NUM])
{
	int i,j;
	double d=0.0;
	for(i=0;i<NUM;i++)
	{
		d=0.0;
		for(j=0;j<NUM;j++)
			d+=isw[i][j]*(m1[j]-m2[j]);
		U[i]=d;
	}
}

double GetYt(double U[NUM],double m1[NUM],double m2[NUM])
{
	double mm1[NUM],mm2[NUM];
	int j;
	double  d=0.0;
	
		for(j=0;j<NUM;j++)
		{
			d+=U[j]*(m1[j]+m2[j]);
		}
		return d/2;
}

void GetY(double U[NUM],double x[N1][NUM],double Y[N1])
{
	int i,j;
	double d=0.0;
	for(i=0;i<N1;i++)
	{
		d=0.0;
		for(j=0;j<NUM;j++)
			d+=U[j]*x[i][j];
		Y[i]=d;
	}
}

void main()
{
	double x[N1][NUM];//100A
	double y[N2][NUM];//50A
	double m1[NUM],m2[NUM],U[NUM];
	double sw1[NUM][NUM],sw2[NUM][NUM],sw[NUM][NUM],isw[NUM][NUM];
	double Yt;
	double Y1[N1],Y2[N2];

	int i,j;



	for(i=0;i<N1;i++)
		for(j=0;j<NUM;j++)
		{
			x[i][j]=data[0][0][0][j][i];
			y[i][j]=data[0][1][0][j][i];
		}

		Getmj(m1,x);
		cout<<"模式1的均值矢量m1为:"<<endl;
		Printmj(m1);

		Getmj(m2,y);
		cout<<"模式2的均值矢量m2为:"<<endl;
		Printmj(m2);


		GetSWi(sw1,x);
		cout<<"模式1的类内离差矩阵SW1为:"<<endl;
		PrintSW(sw1);

		GetSWi(sw2,y);
		cout<<"模式2的类内离差矩阵SW2为:"<<endl;
		PrintSW(sw2);

		GetSW(sw,sw1,sw2);
		cout<<"总类内离差矩阵SW=SW1+SW2为:"<<endl;
		PrintSW(sw);

		//Gauss_Jordan(sw,isw);
		GetVi(isw,sw);
		cout<<"总类内离差矩阵SW的逆矩阵SW-1为:"<<endl;
		PrintSW(isw);

		GetU(isw,m1,m2,U);
		cout<<"权矢量U为:"<<endl;
		Printmj(U);

		Yt=GetYt(U,m1,m2);
		cout<<"Yt="<<Yt<<endl;

		GetY(U,x,Y1);
		cout<<"100元A面60点的Y值:"<<endl;
		PrintY(Y1);

		GetY(U,y,Y2);
		cout<<"50元A面60点的Y值:"<<endl;
		PrintY(Y2);


}
/*模式1的均值矢量m1为:
69.3167  61.9333  83.5  70.8167  97.7167  91.4667  87.6333  82.3667
模式2的均值矢量m2为:
59.1833  55.4833  81.8833  63.9167  95.0833  91.0333  91.0667  86.4833
模式1的类内离差矩阵SW1为:

12.7831  27.2211  29.5917  24.2581  8.75639  10.9022  8.18278  1.90056
27.2211  109.529  109.733  88.3544  20.3644  36.4144  18.8922  1.20778
29.5917  109.733  133.217  103.342  22.125  33.3667  24.25  -2.2
24.2581  88.3544  103.342  97.4164  13.3147  24.0022  19.6994  4.28389
8.75639  20.3644  22.125  13.3147  14.1697  13.5322  10.3628  5.92056
10.9022  36.4144  33.3667  24.0022  13.5322  18.7156  10.5211  5.77889
8.18278  18.8922  24.25  19.6994  10.3628  10.5211  10.9656  6.61778
1.90056  1.20778  -2.2  4.28389  5.92056  5.77889  6.61778  12.4656

模式2的类内离差矩阵SW2为:

27.8164  44.9614  48.8214  47.8319  1.56806  17.0772  13.7378  14.9447
44.9614  121.883  62.1564  87.1069  6.10972  43.4006  15.5844  17.0997
48.8214  62.1564  117.27  81.2569  3.25972  25.4206  37.3744  28.2897
47.8319  87.1069  81.2569  107.11  -2.80972  32.4694  13.8389  28.1403
1.56806  6.10972  3.25972  -2.80972  4.84306  3.63056  5.12778  -1.50694
17.0772  43.4006  25.4206  32.4694  3.63056  17.4322  7.66444  6.60056
13.7378  15.5844  37.3744  13.8389  5.12778  7.66444  22.5956  8.91778
14.9447  17.0997  28.2897  28.1403  -1.50694  6.60056  8.91778  13.6831

总类内离差矩阵SW=SW1+SW2为:

40.5994  72.1825  78.4131  72.09  10.3244  27.9794  21.9206  16.8453
72.1825  231.412  171.89  175.461  26.4742  79.815  34.4767  18.3075
78.4131  171.89  250.486  184.599  25.3847  58.7872  61.6244  26.0897
72.09  175.461  184.599  204.526  10.505  56.4717  33.5383  32.4242
10.3244  26.4742  25.3847  10.505  19.0128  17.1628  15.4906  4.41361
27.9794  79.815  58.7872  56.4717  17.1628  36.1478  18.1856  12.3794
21.9206  34.4767  61.6244  33.5383  15.4906  18.1856  33.5611  15.5356
16.8453  18.3075  26.0897  32.4242  4.41361  12.3794  15.5356  26.1486

总类内离差矩阵SW的逆矩阵SW-1为:

0.105698  -0.00414574  -0.0117092  -0.0100391  0.0116707  -0.0298149  -0.0125424
  -0.0214614
-0.00414574  0.0495995  -0.000318188  -0.0204626  0.0284905  -0.097914  -0.00495
41  0.0381251
-0.0117092  -0.000318188  0.0288703  -0.0212018  -0.000479244  0.00727187  -0.03
92324  0.0251981
-0.0100391  -0.0204626  -0.0212018  0.0409428  0.00957827  0.0166787  0.0284444
 -0.0352334
0.0116707  0.0284905  -0.000479244  0.00957827  0.188321  -0.156279  -0.0680934
 0.0437917
-0.0298149  -0.097914  0.00727187  0.0166787  -0.156279  0.316827  0.0276207  -0
.0802034
-0.0125424  -0.0049541  -0.0392324  0.0284444  -0.0680934  0.0276207  0.133449
-0.0654466
-0.0214614  0.0381251  0.0251981  -0.0352334  0.0437917  -0.0802034  -0.0654466
 0.113386

权矢量U为:
1.10536  0.0288565  -0.187469  0.0943517  0.849043  -0.845735  -0.382306  -0.335
453
Yt=5.76249
100元A面60点的Y值:
3.67829  7.42418  12.0801  14.611  17.1855  19.2927  20.6103  20.8612
20.1756  18.2124  17.107  15.8688  16.1125  15.3289  15.3094  15.7975
13.9744  11.7536  9.23506  9.73144  9.4175  9.94929  8.88396  10.4935
11.1905  13.7153  15.329  14.8248  15.355  14.8211  16.3832  16.5142
18.0079  16.3482  15.4935  13.5393  12.5404  12.1495  12.1495  12.8658
14.5289  16.0123  16.799  14.2534  12.9987  11.6849  10.3149  11.2188
11.0314  11.1781  12.8125  13.7107  15.615  15.6896  14.1758  13.7346
14.0118  13.5028  13.8509  13.2417
50元A面60点的Y值:
-1.7166  -0.585735  1.92323  3.45935  2.02111  1.42452  -1.74104  -2.33013
-3.4909  -3.55516  -3.62065  -3.90861  -2.37468  0.146194  1.69481  2.02349
-1.14096  -3.55685  -3.89354  -4.31048  -3.78166  -3.04196  -3.88195  -3.50813

-2.65179  -1.85163  -2.79252  -2.99491  -2.86515  -3.0997  -3.29254  -2.13413
-1.9158  -1.95326  -1.57427  -1.57427  -1.48983  -2.86718  -2.33697  -2.69593
-3.09307  -4.83136  -3.30884  -5.59269  -7.91348  -9.88029  -9.33161  -5.51592

-2.59788  0.419927  1.19816  1.25056  -2.02526  -2.51988  -2.34575  -1.89433
-0.386882  -1.22763  -2.59262  -5.16365
Press any key to continue*/

	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -