Fisher 判断算法c++实现

该代码示例展示了如何在C++中使用Eigen库对两组数据进行主成分分析(PCA)。首先定义了一个自定义结构体myvector,然后计算了两组数据的平均值和类内离散矩阵。接着,求解了最优投影方向并确定了阈值,最后将两个二维向量映射到判别函数上,根据阈值判断它们所属的类别。
摘要由CSDN通过智能技术生成

#include <iostream>
#include<Eigen\dense>
#include<vector>
using namespace std;
using namespace Eigen;

struct myvector
	{
		double x;
		double y;
	};
int main()
	{
	    vector<myvector> data1, data2;
		myvector p[10];
		p[0].x = 1; p[0].y = 1;
		p[1].x = 1; p[1].y = 1.5;
		p[2].x = 1; p[2].y = 0.5;
		p[3].x = 0.5; p[3].y = 1;
		p[4].x = 1.5; p[4].y = 1;
		p[5].x = 1; p[5].y = 0;
		p[6].x = 1; p[6].y = 0.5;
		p[7].x = 1; p[7].y = -0.5;
		p[8].x = 0.5; p[8].y = 0;
		p[9].x = 1.5; p[9].y = 0;
 
		for (int i = 0; i < 10; i++)
		{
			if (i < 5)
				data1.push_back(p[i]);
			else
				data2.push_back(p[i]);
		}

		vector<double> Xarr1, Yarr1;
		vector<double> Xarr2, Yarr2;
		double sumX1 = 0;
		double sumX2 = 0;
		double sumY1 = 0;
		double sumY2 = 0;
		for (int i = 0; i < 5; i++)
		{
			sumX1 = sumX1 + data1[i].x;
			sumY1 = sumY1 + data1[i].y;
			Xarr1.push_back(data1[i].x);
			Yarr1.push_back(data1[i].y);
		}
		for (int i = 0; i < 5; i++)
		{
			sumX2 = sumX2 + data2[i].x;
			sumY2 = sumY2 + data2[i].y;
			Xarr2.push_back(data2[i].x);
			Yarr2.push_back(data2[i].y);
		}
		double xmean1 = sumX1 / data1.size();
		double ymean1 = sumY1 / data1.size();
		double xmean2 = sumX2 / data2.size();
		double ymean2 = sumY2 / data2.size();
		//类内离散矩阵
		
		MatrixXd u1(2, 1), u2(2, 1);
		u1 << xmean1, ymean1;
		u2 << xmean2, ymean2;
		double sum1=0, sum2=0, sum3=0, sum4=0;

		for (int i = 0; i < 5 ; i++)
		{
			sum1 += Xarr1[i] * xmean1 + Xarr2[i] * xmean2;
			sum2 += Xarr1[i] * ymean1 + Xarr2[i] * ymean2;
			sum3 += Yarr1[i] * xmean1 + Yarr2[i] * xmean2;
			sum4 += Yarr1[i] * ymean1 + Yarr2[i] * ymean2;
		}
		Matrix2d Sw(2, 2);
		Sw << sum1, sum2, sum3, sum4;
		cout << "类内总离散矩阵:" << endl << Sw << endl;
		MatrixXd w(0, 0);
		w = Sw.inverse() * (u2 - u1);
		MatrixXd w0(0, 0);
		w0 = (w.transpose() * u1 + w.transpose() * u2) / 2;
		cout << "最佳投影方向:" << endl << w << endl << "阈值为:" << endl << w0 << endl;
		MatrixXd x_(2, 1), y_(2, 1);
		x_ << 1.25, 1.25;
		y_ << 0.75, 0.25;
		MatrixXd wx(0, 0), wy(0, 0);
		wx = w.transpose() * x_;
		wy = w.transpose() * y_;
		cout << "二维向量(1.25, 1.25)和二维向量(0.75,0.25)在判别函数上的映射分别为:" 
			<< endl << wx <<"  " << wy << endl;
		cout << "由于: " << endl << wx << "<" << w0 
             << "  " << wy << ">" << w0 << endl
			<< "所以二维向量(1.25,1.25)属于第一类,二维向量(0.75,0.25)属于第二类。" 
			<< endl;
	}


输出结果如下:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值