# -*- 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. WEB即时通信

    问题 传统的浏览器通信方式:基于HTTP协议的请求/响应模式. 早期:通过刷新浏览器来更新服务器端的数据 后来Ajax(XMLHttpRequest是核心):可以不用刷新浏览器更新服务器端数据.但是这 ...

  2. css命名规范: BEM 的命名法

    整理自:前端早读课[第1183期]这些 CSS 命名规范,将省下你大把调试时间 试图解决 3 类问题: 仅从名字就能知道一个 CSS 选择器具体做什么 从名字能大致清楚一个选择器可以在哪里使用 从 C ...

  3. python - str和repr方法:

    # python 内置__str__()和__repr__()方法: #显示自定制 # 示例1 # a = 123 # print(a.__str__()) # 示例2 class Test(): d ...

  4. Python 入门基础18 --re模块+内存管理

    今日内容: 1.垃圾回收机制 2.re模块 一.垃圾回收机制 在计算机中,不能被程序访问到的数,称之为垃圾 1.1 引用计数 引用计数用来记录值的内存地址被记录的次数 每引用一次就对标记 +1 操作 ...

  5. android彻底关闭应用程序方法

    Android SDK > 7(Android2.1)之后,即Android2.2及以后版本彻底关闭应用的方法,目前试验只有一下方法有效: Intent startMain = new Inte ...

  6. WPF版公司的自动签到程序

    1.外包公司要求早上签到,就写了一个自动打卡程序. 2.一直都想写这个程序,可是一直没有思路,知道有个软件公司找我做自动答题程序,于是自动打卡程序才应运而生.未来可以将自动答题程序开源工大家查看. 3 ...

  7. SVN设置必须锁定

    SVN是一个开放源代码的版本控制系统,相信做开发的基本上都用过,这里就不多介绍了.团队协作开发时常常会出现提交的文档互相冲突的问题,这里给大家介绍一下给SVN文件设置必须锁定的方法,当然你也可以对冲突 ...

  8. ubuntu数据库迁移

    环境:ubuntu16.04 简介:本教程演示如何从旧数据库服务器服转移到另一个新服务器. 场景:假设你有自己的云服务器安装了WordPress站点,你为了更多的内存和处理能力想升级到新的服务器. 操 ...

  9. Json对象和字符串互相转换 数据拼接 JSON使用方式

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 一.JSON字符串转换为JSON对象: eval() 和 JSON.parse eg- json字符串: ...

  10. Project Euler Problem9

    Special Pythagorean triplet Problem 9 A Pythagorean triplet is a set of three natural numbers, a  b  ...