|
#include "stdafx.h"
#include "orsciJWVCL.h"
#include "orsciVM.h"
using namespace orsci;
using namespace orsci::vmt;
int main()
{
cout << " orsci:曼哈顿距离、欧氏距离、闵可夫斯基距离、上确界距离、马氏距离" << endl
<< " --- http://www.orsci.cn" << endl;
vdouble x, y;
x = "2,3";
y = "3,5";
cout << "x = " << endl;
cout << x << endl;
cout << "y = " << endl;
cout << y << endl;
cout << "曼哈顿距离:" << endl;
cout << vmt::dist_Manhattan(x, y) << endl;
cout << " 欧氏距离:" << endl;
cout << vmt::dist_Euclid(x, y) << endl;
cout << "闵可夫斯基距离:" << endl;
cout << vmt::dist_Minkowski(x, y, 1) << endl;
cout << vmt::dist_Minkowski(x, y, 2) << endl;
cout << vmt::dist_Minkowski(x, y, 3) << endl;
cout << vmt::dist_Minkowski(x, y, 4) << endl;
cout << "上确界距离:" << endl;
cout << vmt::dist_Supermum(x, y) << endl;
cout << endl << "马氏距离求解..." << endl;
mdouble X;
X = "1,2; 1,3; 2, 2; 3, 1";
cout << "X = " << endl;
cout << X << endl;
cout << "马氏距离矩阵:" << endl;
cout << vmt::dist_Mahalanobis(X) << endl;
cout << "求X的马氏距离中的协方差逆S_inv和均值u:" << endl;
mdouble S_inv;
rowdouble u;
bool mFlag = vmt::dist_Mahalanobis(X, S_inv, u);
cout << "求解标记:" << mFlag << endl;
cout << "S_inv = " << endl;
cout << S_inv << endl;
cout << "u = " << endl;
cout << u << endl;
cout << "计算X的每一行到中心u的马氏距离!" << endl;
for (int k = 0; k < X.rowCount(); k ++)
{
cout << vmt::dist_Mahalanobis(X.Row(k), u, S_inv) << endl;
}
cout << "计算一个新的点(2,4)到(1,2)的马氏距离。(注依照X的属性相关性)" << endl;
rowdouble new_x = "2,4";
rowdouble new_y = "1,2";
cout << vmt::dist_Mahalanobis(new_x, new_y, S_inv) << endl;
cout << endl;
cout << "press any key to stop..." << endl;
char pp;
cin >> pp;
return 0;
}
void demo_dist_Mahalanobis()
{
mdouble X;
X = "1,2; 1,3; 2, 2; 3, 1";
cout << X << endl;
mdouble Y = vmt::cov(X);
cout << Y << endl;
mdouble S = inv(Y);
cout << S << endl;
rowdouble x1 = X.Row(0);
rowdouble x2 = X.Row(1);
cout << x1 - x2 << endl;
rowdouble x1_2 = x1 - x2;
cout << x1_2 * S * (x1_2).T() << endl;
} |
输出 |
(一)运行结果
orsci:曼哈顿距离、欧氏距离、闵可夫斯基距离、上确界距离、马氏距离
--- http://www.orsci.cn
x =
2 3
y =
3 5
曼哈顿距离:
3
欧氏距离:
2.23607
闵可夫斯基距离:
3
2.23607
2.08008
2.03054
上确界距离:
2
马氏距离求解...
X =
rowCount = 4 colCount = 2
1 2
1 3
2 2
3 1
马氏距离矩阵:
rowCount = 4 colCount = 4
0 2.34521 2 2.34521
0 0 1.22474 2.44949
0 0 0 1.22474
0 0 0 0
求X的马氏距离中的协方差逆S_inv和均值u:
求解标记:1
S_inv =
rowCount = 2 colCount = 2
4 4
4 5.5
u =
1.75 2
计算X的每一行到中心u的马氏距离!
1.5
1.32288
0.5
1.32288
计算一个新的点(2,4)到(1,2)的马氏距离。(注依照X的属性相关性)
6.48074
press any key to stop...
(二)用到的函数
"曼哈顿距离:"
vmt::dist_Manhattan(x, y) " 欧氏距离:"
vmt::dist_Euclid(x, y) "闵可夫斯基距离:";
vmt::dist_Minkowski(...) "上确界距离:"
vmt::dist_Supermum(...)
"马氏距离:"
vmt::dist_Mahalanobis(...)
(二)说明:
(1)距离的应用非常广,在KNN分类、聚类等许多数据分析和数据挖掘上都有重要应用。
(2)几种常用距离已集成在orsci中,同时还提供定制距离表示。
(3)orsci包支持向量和矩阵计算,可下载配套软件orsci应用。 |