在距离类聚类算法中应用颇广,最近重温了一下闵氏距离的计算,写了个小程序巩固一下。
关于闵氏距离的扫盲,这篇帖子讲的比较透彻:http://blog.youkuaiyun.com/eric41050808/article/details/24365765#0-tsina-1-3368-397232819ff9a47a7b7e80a40613cfe1。
小程序用python写成,功能很简单,就是绘制一个二维的图形,形象的表示闵氏距离不同的p值含义。由于是二维图形,所以维度为2,即两个点PQ只有x/y两个属性,绘图时,设P点为(0,0),距离固定为1,绘制Q点的轨迹集合。
def drawminkowski(sampling =10, p = [2]):
print "minkowski, p = %s, sampling = %d"%(str(p), sampling);
X = np.linspace(-1, 1, sampling);
plt.figure(figsize=(8,8), dpi=80);
plt.xlabel("X");
plt.ylabel("Y");
plt.ylim(-1,1)
plt.title("minkowski distance, distance = 1, p = " + str(p));
plt.plot(np.linspace(-1, 1, 100), np.zeros(100), "k,", linewidth = 2);
plt.plot(np.zeros(100), np.linspace(-1, 1, 100), "k,", linewidth = 2);
for pi in p:
if pi <= 0:
continue;
print pi;
Y = np.power(1- np.power(np.abs(X), pi), 1/float(pi));
print X;
print Y;
color = random.randint(1, 0xffffff);
plt.plot(X,Y, label ="p=" + str(pi), color = "#" + format(color, "06x"), linewidth = 1);
plt.plot(X,-Y, color = "#" + format(color, "06x"), linewidth = 1);
plt.legend();
plt.show();
参数sampling是取样个数,即点Q的x属性在(-1,1)之间取十个点。
参数p是一个数组,即在一张图上画多个p值得图形做比较。
算法本身比较简单,就不描述了,绘图用的是matplotlib,另外还用了numpy做计算。
效果参见下图。