Chameleon
# -*- 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的更多相关文章
- 神舟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 ...
- 变色龙安装程序 Chameleon Install 2.2 svn 2281发布
变色龙安装程序 Chameleon Install 2.2 svn 2281发布 1.更好的支持10.9 Mavericks2.更新ATi.nVidia显卡支持列表3.添加新的 CPU Model I ...
- 会吓人的概念证明病毒: Chameleon
近期有这么一条新闻指出,有一对家长发现,黑客入侵了他们为10个月女儿所准备的婴儿监视器(baby monitor).该黑客除了远程操控该监视器的录像角度,还大声对着小孩喊叫.婴儿的爸爸冲进女儿房间后, ...
- 小程序多端框架全面测评:chameleon、Taro、uni-app、mpvue、WePY
摘要: 微信小程序开发技巧. 作者:coldsnap 原文:小程序多端框架全面测评 Fundebug经授权转载,版权归原作者所有. 最近前端届多端框架频出,相信很多有代码多端运行需求的开发者都会产生一 ...
- ObjectT5:在线随机森林-Multi-Forest-A chameleon in track in
原文::Multi-Forest:A chameleon in tracking,CVPR2014 下的蛋...原文 使用随机森林的优势,在于可以使用GPU把每棵树分到一个流处理器里运行,容易并行化 ...
- 重磅!滴滴跨端框架Chameleon 1.0正式发布
滴滴在 GitHub 上开源的跨端解决方案 Chameleon(简写 CML)正式发布 1.0 版本,中文名卡梅龙:中文意思变色龙,意味着就像变色龙一样能适应不同环境的企业级跨端整体解决方案,具有易用 ...
- 开源 iOS 项目分类索引大全 - 待整理
开源 iOS 项目分类索引大全 GitHub 上大概600个开源 iOS 项目的分类和介绍,对于你挑选和使用开源项目应该有帮助 系统基础库 Category/Util sstoolkit 一套Cate ...
- Python 资源大全中文版
Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列的资源整理.awesome-python 是 vinta 发起维护的 Python 资源列 ...
- iOS比较常用的第三方及实例(不断更新中)
把平时看到或项目用到的一些插件进行整理,文章后面分享一些不错的实例,若你有其它的插件欢迎分享,不断的进行更新: 一:第三方插件 1:基于响应式编程思想的oc 地址:https://github.com ...
随机推荐
- 代码控制打电话、发短信、发邮件、打开手机app等操作
很多时候我们需要利用我门自己的app进行一些打电话.发短信等的操作,那么如何利用代码实现呢,下面就介绍一些简单的方法来实现这些操作. 一.打电话: <1>最简单.最直接的方法----直接跳 ...
- k64 datasheet学习笔记4---Memory Map
1.前言 本文主要介绍K64地址空间的映射 2. System Memory Map 3. K64地址映射 4. Armv7m地址映射 4.1 Armv7M.System地址段(0XE0000000~ ...
- zabbix实现对tomcat的监控
zabbix实现对tomcat的监控 工作原理 比如:当Zabbix-Server需要知道java应用程序的某项性能的时候,会启动自身的一个Zabbix-JavaPollers进程去连接Zabbix- ...
- python操作mysql数据库的常用方法使用详解
python操作mysql数据库 1.环境准备: Linux 安装mysql: apt-get install mysql-server 安装python-mysql模块:apt-get instal ...
- gitlab代码仓库迁移
有的时候我们需要对gitlab上的代码进行迁移,希望在迁移后能保持原有的branch.tag.commit记录等.可以使用以下方式: 1.clone代码到本地. 2.修改remote仓库的地址,添加新 ...
- Android判断网络是否打开,并打开设置网络界面
由于Android的SDK版本不同所以里面的API和设置方式也是有少量变化的,尤其是在Android 3.0 及后面的版本,UI和显示方式也发生了变化,现在就以打开网络设置为例,同大家分享一下: 1. ...
- 深入对比TOML,JSON和YAML
坦率地说,在我开始与Hugo TOML合作之前,我感到羞耻是一个需要发现的新领域,但我对YAML和JSON非常熟悉.本文将帮助您了解如何通过不同的数据格式构建数据. 在Hugo中,您可以将 ...
- STM32F412应用开发笔记之九:移植FreeRTOS到F412ZG平台
在开发实际应用系统时,我们经常需要考虑数据的实时性和多任务,嵌入式实时操作系统的出现为实现这一目的提供了很好的助力.FreeRTOS是近年来比较流行的嵌入式实时操作系统,而且是开源免费的,STM32C ...
- PHP实现的简单组词算法
?php //组词算法 function diyWords($arr,$m){ $result = array(); if ($m ==1){//只剩一个词时直接返回 return $arr; } i ...
- 性能测试二十四:环境部署之Redis多实例部署
由于redis服务端是单线程实现的,因此只能占用CPU的单核,为了充分利用CPU资源,可以在一台服务器上同时启动多个redis-server实例 首先删除之前的rdb.aof文件 注释掉3个save ...