多维缩放

1,根据皮尔逊相关系数计算出所有点之间的距离,称之为目标距离。

2,将所有点随机投放在二维界面(Xi,Yi),计算出随机点之间的距离,称为当前距离。

3,计算误差值:(目标距离-当前距离)/当前距离。

4,根据误差值按比例位移,直到误差值最小为止,获得所有点的二维图形。

Python代码:

def scaledown(data, distance=pearson, rate=0.01):
    n = len(data)

    # 每对数据之间的皮尔逊距离
    realdist = [[distance(data[i], data[j]) for j in range(n)]
                for i in range(0, n)]


    # 随机初始化二维空间位置
    loc = [[random.random(), random.random()] for i in range(n)]
    fakedist = [[0.0 for j in range(n)] for i in range(n)]

    lasterror = None
    for m in range(0, 1000):
        # 寻找投影后的距离
        for i in range(n):
            for j in range(n):
                fakedist[i][j] = sqrt(sum([pow(loc[i][x] - loc[j][x], 2)
                                           for x in range(len(loc[i]))]))

        # 移动节点
        grad = [[0.0, 0.0] for i in range(n)]

        totalerror = 0
        for k in range(n):
            for j in range(n):
                if j == k: continue
                # 误差值=(目标距离-差值)/差值
                errorterm = (fakedist[j][k] - realdist[j][k]) / realdist[j][k]

                # 每个节点都需要根据误差的多少,按比例移动
                grad[k][0] += ((loc[k][0] - loc[j][0]) / fakedist[j][k]) * errorterm
                grad[k][1] += ((loc[k][1] - loc[j][1]) / fakedist[j][k]) * errorterm

                # 总误差
                totalerror += abs(errorterm)
        print
        (totalerror)

        # 如果移动后,结果跟坏,则结束
        if lasterror and lasterror < totalerror: break
        lasterror = totalerror

        # 根据rate参数与grad值相乘结果,移动节点
        for k in range(n):
            loc[k][0] -= rate * grad[k][0]
            loc[k][1] -= rate * grad[k][1]

    return loc


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值