# -*- 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. Hadoop的RPC机制及简单实现

    1.RPC简介 Remote Procedure Call 远程过程调用协议 RPC——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些 ...

  2. c# 创建项目时提示:未能正确加载“microsoft.data.entity.design.bootstrappackage

    vs 2005 ,vs 2008, vs 2010,安装后有时出现这个错误(我的机器装的x64的win7),很烦人.找了很多地方都不能解决.其实说起来还是开发国家牛,轻易就解决了这个问题.其实出现这个 ...

  3. 恶意PDF文档分析记录

    0x1 PDF是什么 PDF(便携式文件格式,Portable Document Format)是由Adobe Systems在1993年用於文件交换所发展出的文件格式. 因为PDF的文件格式性质广泛 ...

  4. Linux内存管理6---伙伴算法与slab

    1.前言 本文所述关于内存管理的系列文章主要是对陈莉君老师所讲述的内存管理知识讲座的整理. 本讲座主要分三个主题展开对内存管理进行讲解:内存管理的硬件基础.虚拟地址空间的管理.物理地址空间的管理. 本 ...

  5. 关于 MVCC 的基础【转】

    1. 什么是MVCC 1.1 基础概念 MVCC,Multi-Version Concurrency Control,多版本并发控制.MVCC 是一种并发控制的方法,一般在数据库管理系统中,实现对数据 ...

  6. C/C++杂记:虚函数的实现的基本原理

    1. 概述 简单地说,每一个含有虚函数(无论是其本身的,还是继承而来的)的类都至少有一个与之对应的虚函数表,其中存放着该类所有的虚函数对应的函数指针.例: 其中: B的虚函数表中存放着B::foo和B ...

  7. centos6.5环境利用scp实现自动化文件备份

    centos6.5环境利用scp自动上传备份文件到指定服务器中 需要备份的主机 192.168.3.17 存放备份的主机 192.168.3.18 目的:将3.17主机上/data/storage的文 ...

  8. Android数据存储:Shared Preferences

    Android数据存储之SharedPreferences 在Android系统中提供了多种存储技术.通过这些存储技术可以将数据存储在各种存储介质上, Android 为数据存储提供了如下几种方式:1 ...

  9. Python-ccs动画及阴影

    动画及阴影 0. 什么时候该用什么布局 <!-- 定位布局: 以下两种布局不易解决的问题, 盒子需要脱离文档流处理 --> <!-- 浮动布局: 一般有block特性的盒子,水平排列 ...

  10. 洛谷P2239 螺旋矩阵

    传送门 分析:将整个矩阵看成 "回" 形状的分层结构,然后进行去层处理,使得要求得 \((i,j)\) 处于最外层,然后再分情况讨论.最外面的一层共有数: $ 4 * n - 4 ...