E028

曼哈顿距离、欧氏距离、闵可夫斯基距离、上确界距离、马氏距离

 

#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应用。

书籍 姜维. 《数据分析与数据挖掘》、《数据分析与数据挖掘实践》
软件 orsci开发包(C++语言、Delphi语言和C语言)。