您的位置:首页 > 编程语言 > Go语言

An Algorithm Summary of Programming Collective Intelligence (4)

2008-03-11 13:12 561 查看
继续

Multidimensional Scaling 多维标度

ms是用来降低向量空间维度的,一般是降低到二维,降低的过程中要尽量保证各个向量之间的距离在许可范围之内保持相对不变。

可以很形象的把ms的方法用特殊的作用力方式来说明。

首先还是要计算出n维向量空间里面各个向量的距离作为标准距离。

然后把向量看作在二维平面里的一个个粒子,开始的时候粒子的分布是随机的。

粒子之间有引力和斥力。当两个粒子之间的距离大于其标准距离时,表现为引力;当小于标准距离时表现为斥力;力的大小与标准距离和实际距离的差值成正比。

所有粒子在平面内相互作用,使其分布发生变化,直至最后达到某种平衡或者与标准距离的误差之和最小。这时我们就可以认为现在二维平面内各个粒子的距离和n维空间中各个向量的原始距离是相对一致的。

计算调整粒子分布的过程是一个迭代过程。每次都在每一个粒子上计算在横轴和纵轴两个维度上与所有其他粒子相对作用力的合成,根据合成力计算出粒子新的位置。

贴一个Python的粗略实现(from PCI):

def scaledown(data,distancef,ratio=0.01):
    n = len(data)
    realdist = [[distancef(data[i], data[j])
                 for j in range(n)]
                for i in range(n)]

    loc=[(random(), random()) for i in range(n)]

    for p in range(1000):
        fakedist = [[sqrt(pow(loc[i][0]-loc[j][0], 2) + pow(loc[i][1]-loc[j][1], 2))
                     for j in range(n)]
                    for i in range(n)]

        grad = [[0.0,0.0] for i in range(n)]
        totalerror = 0.0
        lasterror = None
        for i in range(n):
            for j in range(n):
                if i==j: break

                errorterm = (fakedist[i][j]-realdist[i][j])/realdist[i][j]

                grad[i][0]+=(loc[i][0]-loc[j][0])/fakedist[i][j]*errorterm
                grad[i][1]+=(loc[i][1]-loc[j][1])/fakedist[i][j]*errorterm

                totalerror+=abs(errorterm)

        if lasterror and lasterror<totalerror: break

        lasterror = totalerror

        for i in range(n):
            loc[i]=(loc[i][0]+=ratio*grad[i][0]
                    loc[i][1]+=ratio*grad[i][1])

    return loc

Non-negative Matrix Factorization 非负矩阵分解

nmf,顾名思义,分解矩阵。M = B * H,已知M,给定B的秩,求B,H。B和H具体代表什么要具体问题具体分析。

PCI给了两个例子:文章类别发现和股市事件分析。

文章类别发现:有很多文章,我们可以构造一个文章和词汇的矩阵,里面的值是在一个文章中某个词汇的出现次数。

我们假定这些文章属于r个类别,这样我们就可以用nmf来分解文章词汇矩阵,得到B,文章和类别的权重矩阵,H,类别和词汇的权重矩阵。

这样我们就能够通过观察在某个类别中权重较大的文章所代表的实际内容来判断这个类别的实际意义。而H矩阵则可以用来对其他新文章分类。

股市事件分析:这里有个假设:当一个股市事件发生时,会对若干相关股票产生影响,而影响会反映在成交量的变化上。我们要做的是通过成交量数据来发现股票之间的相关性。

选取若干股票在一段时间内的日交易量数据构成一个股票和日期的成交量矩阵。

假定所选取股票存在r个类别,nmf分解矩阵,得到B,股票和类别的权重矩阵,H,类别和时期的权重矩阵。

这样我们就会观察到在某一天,某类股票曾经发生了某些事件导致了相关股票成交量的变化。通过结合实际情况,我们就可以发现股票之间和股市事件之间的关系。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息