(数据科学学习手札08)系统聚类法的Python源码实现(与Python,R自带方法进行比较)
聚类分析是数据挖掘方法中应用非常广泛的一项,而聚类分析根据其大体方法的不同又分为系统聚类和快速聚类,其中系统聚类的优点是可以很直观的得到聚类数不同时具体类中包括了哪些样本,而Python和R中都有直接用来聚类分析的函数,但是要想掌握一种方法就得深刻地理解它的思想,因此自己从最底层开始编写代码来实现这个过程是最好的学习方法,所以本篇前半段是笔者自己写的代码,如有不细致的地方,望指出。
一、仅使用numpy包进行系统聚类的实现:
'''以重心法为距离选择方法搭建的系统聚类算法原型'''
# @Feffery
# @说明:目前仅支持维度为2,重心法的情况 import numpy as np
import time price = [1.1,1.2,1.3,1.4,10,11,20,21,33,34]
increase = [1 for i in range(10)]
data = np.array([price,increase],dtype='float32') class Myhcluster(): def __init__(self):
print('开始进行系统聚类')
'''系统聚类法的启动函数,有输入变量和距离计算方法两个输入参数'''
def prepare(self,data,method='zx'):
if method == 'zx':
self.zx(data)
'''重心法进行系统聚类'''
def zx(self,data):
token = len(data[0,:])
flu_data = data.copy()
classfier =[[] for i in range(len(data[1,]))]
LSdist = np.array([0 for i in range(token ** 2)], dtype='float32').reshape([len(data[0, :]), token])
index = 0
while token > 1:
'''计算距离矩阵'''
for i in range(len(data[0,:])):
for j in range(len(data[0,:])):
LSdist[i,j] = round(((flu_data[0,i]-flu_data[0,j])**2+(flu_data[1,i]-flu_data[1,j])**2)**0.5,4) '''将距离矩阵中的0元素替换为NAN'''
for i in range(len(data[0,:])):
for j in range(len(data[0,:])):
if LSdist[i,j] == 0:
LSdist[i,j] = np.nan '''保存该次系统聚类中最短距离对应的两个样本的标号'''
T = set([np.argwhere(LSdist == np.nanmin(LSdist))[0,0],np.argwhere(LSdist == np.nanmin(LSdist))[0,1]])
TT = [i for i in T] '''针对该次聚类情况进行产生新子类亦或是归入旧子类的选择'''
RQ = TT
for x in range(len(classfier)):
if classfier[0] == []:#判断是否为n个样本中第一次迭代产生新类
classfier[0] = TT
index = 0
break
elif classfier[-2] != []:#判断是否已在理论最大归类次数前完成所有样品的聚类
print('最后一次分类,获得由样本{}组成的新类'.format([__ for __ in range(len(data[1,]))]))
return 0
elif TT[0] in classfier[x] or TT[1] in classfier[x]:
if classfier[x+1]==[]:
classfier[x+1] = list(set(classfier[x]).union(set(RQ)))
index = x+1
break
else:
RQ = list(set(classfier[x]).union(set(RQ)))
classfier[len(data[1,])-token] = RQ
continue
elif x == len(data[1,])-1:
classfier[len(data[0,:])-token] = TT
index = len(data[0,:])-token
print('第{}次分类,获得由样本{}组成的新类'.format(str(len(data[0,:])-token+1),set(classfier[index])))
#求得重心并对原数据进行覆盖
for k in set(classfier[index]):
flu_data[0,k] = np.mean([data[0,_] for _ in set(classfier[index])])
flu_data[1,k] = np.mean([data[1, _] for _ in set(classfier[index])])
token -= 1 a = time.clock()
dd = Myhcluster()#进行算法封装的类的传递
dd.prepare(data)#调用类中的系统聚类法(默认重心法)
print('自己编写的系统聚类算法使用了'+str(round(time.clock()-a,3))+'秒')
与Scipy中系统聚类方法进行比较:
'''与Scipy中自带的层次聚类方法进行比较'''
import scipy.cluster.hierarchy as sch
import numpy as np a = time.clock()
disMat = sch.distance.pdist(data.T,'euclidean') Z=sch.linkage(disMat,method='average') sch.dendrogram(Z)
print('Scipy中的系统聚类算法用了'+str(round(time.clock()-a,3))+'秒')
与R自带系统聚类算法进行比较:
> #系统聚类法的R实现
> rm(list=ls())
> a <- Sys.time()
> price <- c(1.1,1.2,1.3,1.4,10,11,20,21,33,34)
> increase <- rep(1,10)
> data <- data.frame(price,increase)#生成样本数据框
> d <- dist(data)#创建样本距离阵
> hc <- hclust(d,'centroid')#用重心法进行系统聚类
> cbind(hc$merge, hc$height)#展示分类过程
[,1] [,2] [,3]
[1,] -1 -2 0.10000
[2,] -3 -4 0.10000
[3,] 1 2 0.15000
[4,] -5 -6 1.00000
[5,] -7 -8 1.00000
[6,] -9 -10 1.00000
[7,] 3 4 8.93750
[8,] 5 6 12.50000
[9,] 7 8 17.18056
> Sys.time() - a
Time difference of 0.007000923 secs
> plot(hc)#绘制层次聚类图
(数据科学学习手札08)系统聚类法的Python源码实现(与Python,R自带方法进行比较)的更多相关文章
- (数据科学学习手札22)主成分分析法在Python与R中的基本功能实现
上一篇中我们详细介绍推导了主成分分析法的原理,并基于Python通过自编函数实现了挑选主成分的过程,而在Python与R中都有比较成熟的主成分分析函数,本篇我们就对这些方法进行介绍: R 在R的基础函 ...
- (数据科学学习手札75)基于geopandas的空间数据分析——坐标参考系篇
本文对应代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 在上一篇文章中我们对geopandas中的数据结 ...
- (数据科学学习手札55)利用ggthemr来美化ggplot2图像
一.简介 R中的ggplot2是一个非常强大灵活的数据可视化包,熟悉其绘图规则后便可以自由地生成各种可视化图像,但其默认的色彩和样式在很多时候难免有些过于朴素,本文将要介绍的ggthemr包专门针对原 ...
- (数据科学学习手札50)基于Python的网络数据采集-selenium篇(上)
一.简介 接着几个月之前的(数据科学学习手札31)基于Python的网络数据采集(初级篇),在那篇文章中,我们介绍了关于网络爬虫的基础知识(基本的请求库,基本的解析库,CSS,正则表达式等),在那篇文 ...
- (数据科学学习手札49)Scala中的模式匹配
一.简介 Scala中的模式匹配类似Java中的switch语句,且更加稳健,本文就将针对Scala中模式匹配的一些基本实例进行介绍: 二.Scala中的模式匹配 2.1 基本格式 Scala中模式匹 ...
- (数据科学学习手札47)基于Python的网络数据采集实战(2)
一.简介 马上大四了,最近在暑期实习,在数据挖掘的主业之外,也帮助同事做了很多网络数据采集的内容,接下来的数篇文章就将一一罗列出来,来续写几个月前开的这个网络数据采集实战的坑. 二.马蜂窝评论数据采集 ...
- (数据科学学习手札44)在Keras中训练多层感知机
一.简介 Keras是有着自主的一套前端控制语法,后端基于tensorflow和theano的深度学习框架,因为其搭建神经网络简单快捷明了的语法风格,可以帮助使用者更快捷的搭建自己的神经网络,堪称深度 ...
- (数据科学学习手札42)folium进阶内容介绍
一.简介 在上一篇(数据科学学习手札41)中我们了解了folium的基础内容,实际上folium在地理信息可视化上的真正过人之处在于其绘制图像的高度可定制化上,本文就将基于folium官方文档中的一些 ...
- (数据科学学习手札40)tensorflow实现LSTM时间序列预测
一.简介 上一篇中我们较为详细地铺垫了关于RNN及其变种LSTM的一些基本知识,也提到了LSTM在时间序列预测上优越的性能,本篇就将对如何利用tensorflow,在实际时间序列预测任务中搭建模型来完 ...
随机推荐
- JS入口函数和JQuery入口函数
首先,讲一下它们的区别: (1)JS的window.onload事件必须要等到所有内容,以及外部图片之类的文件加载完之后,才会去执行. (2)JQuery入口函数是在所有标签加载完之后,就会去执行. ...
- OC 成员变量 ( -> 使用 )
@interface Student : NSObject { // @public // @protected // @private // 默认的作用域是@protected int age; @ ...
- bzoj1965 [Ahoi2005]洗牌
Description 为了表彰小联为Samuel星球的探险所做出的贡献,小联被邀请参加Samuel星球近距离载人探险活动. 由于Samuel星球相当遥远,科学家们要在飞船中度过相当长的一段时间,小联 ...
- LA 3126 出租车
题目链接:https://vjudge.net/problem/UVALive-3126 题意:有m个客人,位于不同的位置,去一些地方,出发的时间给出,要一些出租车去接,但是,每辆出租车要在出发前一分 ...
- Codeforces Round #521 (Div. 3) D. Cutting Out 【二分+排序】
任意门:http://codeforces.com/contest/1077/problem/D D. Cutting Out time limit per test 3 seconds memory ...
- ACM-ICPC 2017 Asia HongKong 解题报告
ACM-ICPC 2017 Asia HongKong 解题报告 任意门:https://nanti.jisuanke.com/?kw=ACM-ICPC%202017%20Asia%20HongKon ...
- HBuilder实现WiFi调试Android
要求手机是开发模式 wifi实现 条件:已ROOT手机.手机和电脑需要在一个网段 第一步:安装在应用商店下载WiFi ADB (注意这里显示的ip等下使用) 第二步:打开WIFI ADB 第三步:切换 ...
- 初学bind
其实项目中还没有用到. 但自己还是想逐步了解一些高级的JS语法,不是为了炫技,也不像找前端的工作. 主要目的是:1.学习设计思想,提升解决问题的能力2.让自己的脑子动起来,别太笨. 简单的几句话总结一 ...
- Android学习笔记_70_一个应用程序启动另一个应用程序的Activity
第一种(我自己写的) :之前在网上看来一些,很多不是我要的可以启动另外一个应用程序的主Activity. //这些代码是启动另外的一个应用程序的主Activity,当然也可以启动任意一个Activit ...
- 创建properties文件保存在WEB项目的classes文件下
1.保存数据 private synchronized boolean saveFile(String url,String filename){ try { String path = servle ...