机器学习笔记--闵氏距离学习


在距离类聚类算法中应用颇广,最近重温了一下闵氏距离的计算,写了个小程序巩固一下。
关于闵氏距离的扫盲,这篇帖子讲的比较透彻: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做计算。

效果参见下图。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值