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 ...
随机推荐
- python安装模块方法汇总
方法一: 原文地址: http://blog.csdn.net/cighao/article/details/47860041 在 windows 系统下,只需要输入命令 pip install re ...
- 一个DOS攻击木马的详细分析过程
一个DOS攻击木马的详细分析过程 0×01 起因 网路流量里发现了大量的的1.exe的文件,而且一直在持续,第一感觉就像是一个木马程序,而且每个1.exe的MD5都不一样,对比发现只有几个字节不一样( ...
- MySQL内连接、外连接、交叉连接
外连接: 左连接:left join 或 left outer join 以左边的表为基准,如果左表有数据,而右表没有数据,左表的数据正常显示,右表数据显示为空. 创建user表,用于记录用户 use ...
- 2018-2019-2 网络对抗技术 20165230 Exp5 MSF基础应用
目录 1.实验内容 2.基础问题回答 3.实验内容 任务一:一个主动攻击实践 漏洞MS08_067(成功) 任务二:一个针对浏览器的攻击 ms11_050(成功) ms14_064(成功) 任务三:一 ...
- linux系统的休眠与唤醒简介
转自:http://blog.csdn.net/haomcu/article/details/7398703 系统挂起(Suspend)是电源管理(APM&ACPI)的一个特性,给用户带来了很 ...
- linux 查看cpu的使用百分比
先安装 sudo apt-get install sysstat 然后: mpstat -u 2 5
- DataSnap ClientdataSet 三层中主从表的操作
非原创 摘自:http://hi.baidu.com/yagzh2000/blog/item/fc69df2cb9845de78b139946.html三层中主从表的操作(删除.新增.修改)一定要在 ...
- python位运算之计算中位数
# -*- coding: utf-8 -*- # @Time : 2018/11/23 10:49 PM # @Author : cxa # @File : 1.py # @Software: Py ...
- 001_linux下的log
如果愿意在Linux环境方面花费些时间,首先就应该知道日志文件的所在位置以及它们包含的内容.在系统运行正常的情况下学习了解这些不同的日志文件有助于你在遇到紧急情况时从容找出问题并加以解决. 以下介绍的 ...
- javascript NaN注意事项
NaN直译是Not a number NaN是个特殊的number,它和任何值相比都不相等,甚至和它自己. NaN === NaN 这个表达式是false 唯一能判断NaN的方法是 IsNaN(NaN ...