基于流形距离的聚类算法

news/2024/5/20 7:02:02 标签: 流形, 黎曼, 聚类, python

在家蹲了一个月照顾小孩,完全被洗脑了,程序代码是神马,能吃么?

今天回来,决定练练脑,瞎看了会儿黎曼几何的入门知识,突然觉得没准儿可以用在聚类上,检索了一下,果然有相关的文章。

找到一篇论文,先试试看。《基于流形距离的聚类算法研究及其应用》 http://download.csdn.net/download/deltatang/7614279

通过流形聚类,主要是要解决一些特殊的情况:比如凹集合。

欧式几何的距离公式做出来的聚类在三维空间基本上是个球。高维空间就是超球。总之,聚类出来的结果很多时候让人感叹:有个球用啊。。。。。。

跳到二维空间看看形象的表示:

而用欧氏距离加上K-Means聚类出来的东东是这样的:


所以,先抄写一段公式:



所以要实现的距离公式就是 流形上的单源最短路径


参考公式加上 dijkstra 算法,实现的代码如下:


python">from math import *

_inf = float('inf')
_ldist_p = 1.1

def riemann_dist(Xi, Xj) :
    total = 0.0
    for i in range(len(Xi)) :
        total += (Xi[i] - Xj[i]) ** 2
    dist = sqrt(total)

    global _ldist_p
    return pow(_ldist_p, dist) - 1

def euclid_dist(Xi, Xj) :
    total = 0.0
    for i in range(len(Xi)) :
        total += (Xi[i] - Xj[i]) ** 2
    return sqrt(total)

def matrix(vexlist, dist_func) :
    array = []
    size = len(vexlist)
    for i in range(size) :
        vexi = vexlist[i]
        array.append([])
        for j in range(size) :
            if i == j :
                array[i].append(0)
            else :
                dist = dist_func(vexlist[i], vexlist[j])
                array[i].append(dist)
    return array
                

def dijkstra(start, end, matrix) :        
    path = [0]
    size = len(matrix)

    dist = [k for k in matrix[start]]
    
    while True :
        if len(path) > 1 :
            idx = path[-1]
            row = matrix[idx]
            val = dist[idx]
            
            for i in range(size) :
                if i in path :
                    continue
                orig = dist[i]
                caculate = val + row[i]
                if orig > caculate :
                    dist[i] = caculate

        curdist = []
        for i in range(size) :
            if i not in path :
                curdist.append(dist[i])
                
        cur = dist.index(min(curdist))
        path.append(cur)

        if cur == end or len(path) == size - 1 :
            break

    return dist[end]

def manifold_dist(vexlist, start, end) :
    m = matrix(vexlist, riemann_dist)
    return dijkstra(start, end, m)

'''---------------------------main---------------------------'''
if __name__ == '__main__':  
    print euclid_dist((0, 3), (4, 0))
    print riemann_dist((0, 3), (4, 0))

    vexlist = [(0, 0), (1, 1), (2, 2)]
    print matrix(vexlist, riemann_dist)

    m = [[0, _inf, 10, _inf, 30, 100],
         [_inf, 0, 5, _inf, _inf, _inf],
         [10, 5, 0, _inf, 50, _inf, _inf],
         [_inf, _inf, 50, 0, 20, 10],
         [30, _inf, _inf, 20, 0, 60],
         [100, _inf, _inf, 10, 60, 0]
         ]
    print dijkstra(0, 3, m)
    print manifold_dist(vexlist, 0, 2)

关于dijkstra的实现,看这里看这里 http://www.cppblog.com/eryar/archive/2013/01/01/196897.html


当然,完成了距离公式,还得往k-means里面套,

关于k-means, 看这里看这里 http://www.daniweb.com/software-development/python/threads/31449/k-means-clustering

英文麻烦?看这里看这里 http://www.blogjava.net/Skynet/archive/2009/08/07/290242.html


下做个记录, 改天有空再来填坑, 毕竟还没验证呢:) 现在该看球咯。荷兰队满赛!


http://www.niftyadmin.cn/n/1858563.html

相关文章

VS2012 Microsoft Git Provider 无法push: An error was raised by libgit2. Category = Net (Error).

VS2012 Update 5 中使用Microsoft Git Provider作为插件,push时报错: An error was raised by libgit2. Category Net (Error). This transport isnt implemented. Sorry 解决方法: git remote set-url origin https://github.com/username/…

留个纪念

今天无聊重新登录十年前混过的javaranch论坛,当时是为了scjp考试,考试完毕之后在论坛交流了一下学习的感受,得到了大家这样的回复,给我莫大鼓励哈。 现在看来,真是百感交集。 我的部分文段,自动忽视渣英语…

AI 能预测夫妻吵架,还会劝你冷静一下

By 超神经场景描述:夫妻、伴侣之间,吵架几乎是不可避免的。争吵时的情绪失控,常常会对双方都造成伤害,甚至导致昔日的爱人最终分道扬镳。而现在,AI 已经学会了察言观色,帮助夫妻避免吵架,它能够…

MySQL视图、事务

view(视图):虚拟表主要用来看(查)数据基表的数据变化会在视图中体现出来 权限控制将多表查询的结果整合在视图中方便用户查看 create view v1 as select ...查询语句WITH CHECK OPTION 选项-- 插入后的数据,通过视图能够查询出来就符合WITH CHECK OPTION 否则就不符…

开发,从需求出发 · 之一 所见即所得

从需求出发并不是一句空话,在开发过程中也是如此。 从需求出发,实质上是暗合了极限编程和测试驱动开发的一些思想。 鉴于网站开发是一个比较流行的方向,我打算从一个网站开始,阐述一下自己对“需求驱动开发“的理解,…

东京奥运会将利用 AI 识别可疑人员【智能快讯】

By 超神经AI 无处不在的时代,每天都有新的技术与研究成果出现。无论学术界还是商界,技术还是产品,AI 的新发现都源源不断,在带给我们全新视角的同时,也引起我们更深的思考。想知道最近的 AI 动态吗?HyperAI…

这些「知识点」,你 Get 到了吗?【本周神经回顾】

By 超神经在本周发布内容里,超神经进行了哪些报道?是否给你带来了别样的触动?我们接下来会做一个简单的盘点,通过对本周的信息回顾,看看在超神经的努力之下,你对人工智能是否有了新的认识与思考&#xff1f…

jdbc连接mysql

要导入相应的包] 1 public class ConnDB {2 private Connection ct null;3 //驱动程序名4 String driver "com.mysql.jdbc.Driver";5 // URL指向要访问的数据库名scutcs6 String url "jdbc:mysql://127.0.0.1:3306/develop";7 /…