聚类分析(简单的代码实现)
在之前的文章中了解一些基本的聚类分析知识后,现在我们来看看用代码怎么实现它吧。(在jupyter notebook中实现;其中使用的数据集均从UCI上下载)层次聚类1、需要导入pandas库,用于读取文件。(这里使用的是有关心脏病的数据集,现在取患者年龄和对应的静息血压两列进行分析)import pandas as pd#这两行表示在jupyter中显示所有行和列pd.set_option("di
在之前的文章中了解一些基本的聚类分析知识后,现在我们来看看用代码怎么实现它吧。
(在jupyter notebook中实现;其中使用的数据集均从UCI上下载)
层次聚类
1、需要导入pandas库,用于读取文件。
(这里使用的是有关心脏病的数据集,现在取患者年龄和对应的静息血压两列进行分析)
import pandas as pd
#这两行表示在jupyter中显示所有行和列
pd.set_option("display.max_rows",None)
pd.set_option("display.max_columns",None)
df=pd.read_csv('heartdisease_cleveland.csv',nrows=50,usecols=[0,3])
df.head()
结果:
2、接下来将每一行数据转换为array结构。
samples=df.values
samples
结果:
3、导入scipy.cluster.hierarchy.linkage(y, method=’ ‘, metric=’ ', optimal_ordering=False),以进行层次聚类。y:y: 可以是1维压缩向量(距离向量),也可以是2维观测向量(坐标矩阵)。若y是1维压缩向量,则y必须是n个初始观测值的组合,n是坐标矩阵中成对的观测值;linkage方法用于计算两个聚类簇之间的距离d(x1,x2);method:计算新形成的聚类簇u和v之间距离的方法,参数有single,complete,average,weighted,centroid,median,ward;optimal_ordering:bool,若为true,linkage矩阵则被重新排序,以便连续叶子间距最小。当数据可视化时,这将使得树结构更为直观。默认为false,因为数据集非常大时,执行此操作计算量将非常大。
导入import matplotlib.pyplot as plt,以构建树状图。
#计算距离,树状图
from scipy.cluster.hierarchy import linkage,dendrogram
import matplotlib.pyplot as plt
#进行层次聚类
mergings=linkage(samples,method='complete')
mergings
结果:
4、绘制图像
fig=plt.figure(figsize=(20,20))
dendrogram(mergings,leaf_rotation=90,leaf_font_size=6)
plt.xticks(fontproperties='Times New Roman', size=17)
plt.show()
结果:
最后即可看到层次聚类构成的图像了
K-Means聚类
(这里使用的是鸢尾花的数据集,标签分别是萼片长度、萼片宽度、花瓣长度、花瓣宽度)
1、导入数据集
data=pd.read_csv('iris.csv',nrows=100,usecols=[0,1,2,3])
data
结果:
2、导入sklearn库,from sklearn.cluster import KMeans,用于实现K-Means聚类,
n_clusters表示簇值,想要聚成多少堆,这里分别聚成2堆,3堆
#K-Means clustering
from sklearn.cluster import KMeans
#n_clusters表示簇值,想要聚成多少堆
km=KMeans(n_clusters=3).fit(data)
km2=KMeans(n_clusters=2).fit(data)
3、查看一下当簇值为3时,各个数据分别属于哪一个簇。
km.labels_
结果:
data['cluster']=km.labels_
data['cluster2']=km2.labels_
data.sort_values('cluster')
结果:
4、导入pandas.plotting,绘制散点图。cluster_centers_计算数据对应的中心点
from pandas.plotting import scatter_matrix
%matplotlib inline
cluster_centers=km.cluster_centers_
cluster_center_2=km2.cluster_centers_
#查看对应不同的cluster每个参数的均值,看它们的差异性
data.groupby('cluster').mean()
结果:
data.groupby('cluster2').mean()
结果:
5、可以绘制几个标签的数据来看看
import numpy as np
plt.rcParams['font.size']==14
colors=np.array(['red','blue','yellow','green'])
#画出swidth和pwidth相关的数据点
plt.scatter(data['swidth'],data['pwidth'],c=colors[data['cluster']])
#各个数据的中心点
plt.scatter(centers.swidth,centers.pwidth,linewidths=3,marker='*',s=30,c='black')
plt.xlabel('swidth')
plt.ylabel('pwidth')
结果:
#画出所有数据相互之间的特征关系
scatter_matrix(data[[' slength','swidth','plength','pwidth']],s=100,alpha=1,c=colors[data['cluster']],figsize=(7,6))
plt.suptitle('cluster')
结果:
Scaled data
注意重点:机器学习中数据的处理是最重要的,数据需要做归一化,标准化,为了消除特征之间的差异性。
1、导入sklearn.preprocessing,,使用StandardScaler进行数据标准化。
#聚类之间先对数据进行归一化,标准化一下
from sklearn.preprocessing import StandardScaler
scaler=StandardScaler()
X_scaled=scaler.fit_transform(data)
#消除数值之间的差异性
X_scaled
结果:
km=KMeans(n_clusters=3).fit(X_scaled)
data["scaled_cluster"]=km.labels_
data.sort_values("scaled_cluster")
结果:
2、画出图形
scatter_matrix(data[[' slength','swidth','plength','pwidth']],s=100,alpha=1,c=colors[data['scaled_cluster']],figsize=(7,6))
plt.suptitle('scaled_cluster')
结果:
(此时可以对比一下数据归一化后和未归一化的差异)
轮廓系数
简单来说,就是寻找合适的参数,来评估分类结果的准确度或者称合适度。
#计算轮廓系数的值
from sklearn import metrics
#归一化之后的
score_scaled=metrics.silhouette_score(data,data.scaled_cluster)
#没有归一化
score=metrics.silhouette_score(data,data.cluster)
#这里判断k值怎么选择是最合适的,选择系数较高的
scores=[]
for k in range(2,20):
labels=KMeans(n_clusters=k).fit(data).labels_
score=metrics.silhouette_score(data,labels)
scores.append(score)
scores
结果:
#画一个图直观看出哪一个k最合适
plt.plot(list(range(2,20)),scores)
plt.xlabel('Number')
plt.ylabel('Score')
结果:
DBSCAN聚类
同样的导入库from sklearn.cluster import DBSCAN,用于进行聚类
#想要知道哪一些参数比较合适,可以进行轮廓系数的求解
#eps即半径,min_samples即密度
from sklearn.cluster import DBSCAN
db=DBSCAN(eps=6,min_samples=2).fit(data)
labels=db.labels_
data['cluster_db']=labels
data.sort_values('cluster_db')
之后的操作与K-Means的相似,可以进行数据标准化,再继续聚类,构图。
更多推荐
所有评论(0)