# -*- coding: utf-8 -*-
"""
Created on Tue Dec 18 09:55:16 2018 @author: Mark,LI
"""
import numpy as np
from sklearn.datasets import load_iris class Chameleon:
W = None; # weight矩阵(方阵)
Conn = None; # 连接矩阵(方阵)
clusters = None;
MI = 0; # 综合指数 # 构造函数,初始化变量
def __init__(self,datanum, mi):
self.W = np.ones((datanum,datanum));
self.Conn = np.zeros((datanum,datanum));
self.clusters = [];
self.MI = mi;
self.inter_EC = None; # 构造weight矩阵。根据两点间距离的倒数计算两点的相似度,作为连接权重
def buildWeightMatrix(self,data):
for i in range(data.shape[0]):
row = data[i];
temp = data - row;
temp = np.multiply(temp,temp);
temp = np.sum(temp,axis=1);
self.W[i] = 1/np.sqrt(temp);
self.W[i][i] = 1.0; # CHAMELEON第一阶段,按照K(包括自己)最邻近建立较小的子簇
def buildSmallCluster(self):
for i in range(self.W.shape[0]):
row = self.W[i];
index = np.argsort(row);
index = index[-K:];
index = list(index);
self.Conn[i,index] = 1;
self.Conn[i][i] = 0; visited = [False for i in range(self.W.shape[0])];
visited = np.array(visited);
for i in range(self.Conn.shape[0]):
if(not visited[i]):
cluster = [];
findConnectGraph(self.Conn.copy(),i,cluster);
self.clusters.append(list(set(cluster)));
visited[cluster] = True; # 打印子簇
def printClusters(self):
for i in range(len(self.clusters)) :
print("以下数据点属于第" + str(i) + "簇:");
item = self.clusters[i];
print(item); # CHAMELEON第二阶段,合并相对互联度RI和相对紧密度RC都较高的簇
def cluster(self):
self.interConnectivity();
l = len(self.clusters);
end = True;
i = 0;
while(i<l):
EC_i = self.inter_EC[i];
j = i + 1;
while(j<l):
EC_j = self.inter_EC[j];
vec1 = self.clusters[i];
vec2 = self.clusters[j];
EC = 0.0;
RI = 0.0;
SEC = 0.0;
RC = 0.0;
for k in range(len(vec1)):
for m in range(len(vec2)):
EC += self.W[vec1[k]][vec2[m]]; RI = 2 * EC / (EC_i + EC_j);
RC = (len(vec1) + len(vec2)) * EC / (len(vec2) * EC_i + len(vec1) * EC_j);
# 以RI*RC作为综合指数
if (RI * RC > self.MI) :
self.mergeClusters(i, j);
l = l - 1;
end = False;
break;
j = j + 1;
i = i + 1;
# 递归合并子簇
if (not end):
self.cluster(); def interConnectivity(self):
l = len(self.clusters);
self.inter_EC = [0 for i in range(l)];
for i in range(l):
vec = self.clusters[i];
for j in range(len(vec)):
for k in range(len(vec)):
self.inter_EC[i] += self.W[vec[j]][vec[k]]; # 把簇b合并到簇a里面去
def mergeClusters(self,a, b) :
item = self.clusters[b];
self.clusters.pop(b);
#self.clusters[b] = [];
self.clusters[a].extend(item); def findConnectGraph(matrix,r,cluster):
row = matrix[r];
cluster.append(r);
index_r = np.where(row==1)[0];
for j in index_r:
temp = matrix[j];
temp_index = np.where(temp==1)[0];
if(len(temp_index)>1):
matrix[r,j] = matrix[j,r] = 0;
findConnectGraph(matrix,j,cluster);
else:
cluster.append(j); if __name__ == '__main__':
K = 2; # 2最邻近,这里面包括它自己
iris = load_iris();
data = iris.data;
label = iris.target;
# #综合指数0.1
cham = Chameleon(data.shape[0], 0.1);
cham.buildWeightMatrix(data);
cham.buildSmallCluster();
print("==============第一阶段后的分类结果==============");
cham.printClusters();
for c in cham.clusters:
print(label[c]);
cham.cluster();
print("==============第二阶段后的分类结果==============");
cham.printClusters();
for c in cham.clusters:
print(label[c]);

用python实现Chameleon算法,改进了Orisun java实现方式,不知道对不对,有问题请交流学习。通过结果发现Chameleon算法的召回率还不错,准确率有待提高。

参考文献:

https://www-users.cs.umn.edu/~hanxx023/dmclass/chameleon.pdf

http://www.cnblogs.com/zhangchaoyang/articles/2182752.html

Chameleon的更多相关文章

  1. 神舟K650c i7(W350STQ)上成功装好Mac OS X 10.9,兼谈如何安装WinXP、7、8.1、OSX、Ubuntu五系统(Chameleon、MBR)

    作者:zyl910 参考教程——http://bbs.pcbeta.com/viewthread-1432534-1-4.html笔记本SNB和IVY平台Win7/Win8/Win8.1安装OS X ...

  2. 变色龙安装程序 Chameleon Install 2.2 svn 2281发布

    变色龙安装程序 Chameleon Install 2.2 svn 2281发布 1.更好的支持10.9 Mavericks2.更新ATi.nVidia显卡支持列表3.添加新的 CPU Model I ...

  3. 会吓人的概念证明病毒: Chameleon

    近期有这么一条新闻指出,有一对家长发现,黑客入侵了他们为10个月女儿所准备的婴儿监视器(baby monitor).该黑客除了远程操控该监视器的录像角度,还大声对着小孩喊叫.婴儿的爸爸冲进女儿房间后, ...

  4. 小程序多端框架全面测评:chameleon、Taro、uni-app、mpvue、WePY

    摘要: 微信小程序开发技巧. 作者:coldsnap 原文:小程序多端框架全面测评 Fundebug经授权转载,版权归原作者所有. 最近前端届多端框架频出,相信很多有代码多端运行需求的开发者都会产生一 ...

  5. ObjectT5:在线随机森林-Multi-Forest-A chameleon in track in

    原文::Multi-Forest:A chameleon in tracking,CVPR2014  下的蛋...原文 使用随机森林的优势,在于可以使用GPU把每棵树分到一个流处理器里运行,容易并行化 ...

  6. 重磅!滴滴跨端框架Chameleon 1.0正式发布

    滴滴在 GitHub 上开源的跨端解决方案 Chameleon(简写 CML)正式发布 1.0 版本,中文名卡梅龙:中文意思变色龙,意味着就像变色龙一样能适应不同环境的企业级跨端整体解决方案,具有易用 ...

  7. 开源 iOS 项目分类索引大全 - 待整理

    开源 iOS 项目分类索引大全 GitHub 上大概600个开源 iOS 项目的分类和介绍,对于你挑选和使用开源项目应该有帮助 系统基础库 Category/Util sstoolkit 一套Cate ...

  8. Python 资源大全中文版

    Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列的资源整理.awesome-python 是 vinta 发起维护的 Python 资源列 ...

  9. iOS比较常用的第三方及实例(不断更新中)

    把平时看到或项目用到的一些插件进行整理,文章后面分享一些不错的实例,若你有其它的插件欢迎分享,不断的进行更新: 一:第三方插件 1:基于响应式编程思想的oc 地址:https://github.com ...

随机推荐

  1. Spring源码学习资料

    未完待续.. github地址 https://github.com/spring-projects 学习地址 https://github.com/code4craft/tiny-spring 推荐 ...

  2. B. Array

    题目链接:http://codeforces.com/contest/224/problem/B 具体大意: 输入n,m. 给你一个区间,让你找某一段区间中包含m个不同的数,并且这段区间中的某一个小区 ...

  3. Django学习手册 - 自定义simple_tag / filter

    相关: Django的模板引擎提供一般性的功能函数,通过前端可以实现多数的代码逻辑功能,但它仅支持大多数常见情况下的函数功能,例如if判断,ifequal对比返回值等,复杂一些的函数功能并不支持,例如 ...

  4. Adjoint of SE(3)

    以前看的书都提到 SE(3) 和 se(3) 的 Adjoint,但是并没有讲这个东西是干什么用的,只是给了一堆性质.这东西来自群论. 参考 Lie Groups for 2D and 3D Tran ...

  5. Adroid反编译资料收集

    Android反编译神器jadx的使用 https://blog.csdn.net/Fisher_3/article/details/78654450 Android 反编译利器,jadx 的高级技巧 ...

  6. ubuntu14.04 下安装 gsl 科学计算库

    GSL(GNU Scientific Library)作为三大科学计算库之一,除了涵盖基本的线性代数,微分方程,积分,随机数,组合数,方程求根,多项式求根,排序等,还有模拟退火,快速傅里叶变换,小波, ...

  7. linux 下camera调试笔记【转】

    转自:https://blog.csdn.net/kevinx_xu/article/details/8801931 linux camera调试 2011-10-23 10:43:37|  分类:  ...

  8. C#使用RabbitMQ

    1. 说明 在企业应用系统领域,会面对不同系统之间的通信.集成与整合,尤其当面临异构系统时,这种分布式的调用与通信变得越发重要.其次,系统中一般会有很多对实时性要求不高的但是执行起来比较较耗时的地方, ...

  9. 高级 Java 面试通关知识点整理!

    1.常用设计模式 单例模式:懒汉式.饿汉式.双重校验锁.静态加载,内部类加载.枚举类加载.保证一个类仅有一个实例,并提供一个访问它的全局访问点. 代理模式:动态代理和静态代理,什么时候使用动态代理. ...

  10. Python-HTML 最强标签分类

    编程: 使用(展示)数据 存储数据 处理数据 前端 1. 前端是做什么的? 2. 我们为什么要学前端? 3. 前端都有哪些内容? 1. HTML 2. CSS 3. JavaScript 4.jQue ...