#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;
}
输出结果如下: