本节讲解层次聚类算法实战。机器学习、深度学习、增强学习有一个共同的特征,背后包含很多复杂的原理,数学计算公式可能需要下一番功夫,但是搞机器学习、人工智能的人会帮你解决掉,要弄出一个新的算法,要很长的时间。业界做机器学习、深度学习的知名的科学家,做出基础性贡献的人,他们的年龄至少在40岁以上,平均年龄在60岁上下,需要深厚的数学基础、计算机基础、及一定的哲学基础。因为他们多年的积累,有些人可能做了四、五十年的机器学习或人工智能,有人做了二、三十年,他们的努力工作都变成了框架中的一些算法或库,所以我们使用起来往往非常简单。机器学习说到底,就是输入数据,进行训练,然后进行预测。
1)导入库。
# 层次聚类
# Importing the libraries
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
2)加载数据集。代码x = dataset.iloc[:, [3, 4]].values取索引为3、4的列,索引从0开始,在数据文件中是第4列、第5列。第4列是年收入,第5列是支付评分。
# Importing the dataset
dataset = pd.read_csv('Mall_Customers.csv')
X = dataset.iloc[:, [3, 4]].values
# y = dataset.iloc[:, 3].values
# Splitting the dataset into the Training set and Test set
"""from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0)"""
# Feature Scaling
"""from sklearn.preprocessing import StandardScaler
sc_X = StandardScaler()
X_train = sc_X.fit_transform(X_train)
X_test = sc_X.transform(X_test)
sc_y = StandardScaler()
y_train = sc_y.fit_transform(y_train)"""
3) 导入一个新的库scipy.cluster.hierarchy,同学们以前可能没有接触过,可以打开scipy的官方网站(https://docs.scipy.org/doc/),里面的文档非常不错,感兴趣的同学可以看看。如图41-23所示。
图41- 23 scipy的官网
# Using the dendrogram to find the optimal number of clusters
import scipy.cluster.hierarchy as sch
dendrogram = sch.dendrogram(sch.linkage(X, method = 'ward'))
plt.title('Dendrogram')
plt.xlabel('Customers')
plt.ylabel('Euclidean distances')
plt.show()
代码dendrogram = sch.dendrogram(sch.linkage(x, method = 'ward'))中,注意,这是Python的语法知识,在sch.dendrogram中传入一个参数sch.linkage(X, method = 'ward'),sch.linkage是数据之间的链条关系,其中的x是数据集,在进行聚类的时候,将每一个点作为一个分组,不断发现两个最近的分组,不断的进行组拼,参数method = 'ward'表示进行聚类的时候,差异最小的元素,也就是距离最近的元素,也可以使用其他的方法。在进行可视化的时候,plt自动完成了数据的显示过程。
在Spyder集成环境全选以上代码,按Shift+Enter键运行,如图41-24所示,聚类需分成几组,分成2组、3组还是5组,为什么?在不与水平轴接触的图形中,按照高度最大的距离进行分组,这里分成5组。
图41- 24层次聚类树状图
4)sklearn.cluster库中导入AgglomerativeClustering。
AgglomerativeClustering是属于sklearn.cluster 包下的一个类,实例化时传入的第一个参数n_clusters = 5,设置分组的个数,这个和K-均值聚类算法一样的,参数affinity = 'euclidean'是求距离,使用欧式距离公式计算距离。
# Fitting 层次聚类 to the dataset
from sklearn.cluster import AgglomerativeClustering
hc = AgglomerativeClustering(n_clusters = 5, affinity = 'euclidean', linkage = 'ward')
y_hc = hc.fit_predict(X)
代码y_hc = hc.fit_predict(X)进行模型预测,在Spyder集成环境全选以上代码,按Shift+Enter键运行,如图41-25所示。第1列是消费者的具体编号,一共有200个消费者,从0到199(这里截取了前10个数据);第2列是消费者具体属于什么类别,这里分成了5类,0、1、2、3、4,这就是我们的聚类效果。
图41- 25预测结果
# Visualising the clusters
plt.scatter(X[y_hc == 0, 0], X[y_hc == 0, 1], s = 100, c = 'red', label = 'Cluster 1')
plt.scatter(X[y_hc == 1, 0], X[y_hc == 1, 1], s = 100, c = 'blue', label = 'Cluster 2')
plt.scatter(X[y_hc == 2, 0], X[y_hc == 2, 1], s = 100, c = 'green', label = 'Cluster 3')
plt.scatter(X[y_hc == 3, 0], X[y_hc == 3, 1], s = 100, c = 'cyan', label = 'Cluster 4')
plt.scatter(X[y_hc == 4, 0], X[y_hc == 4, 1], s = 100, c = 'magenta', label = 'Cluster 5')
plt.title('Clusters of customers')
plt.xlabel('Annual Income (k$)')
plt.ylabel('Spending Score (1-100)')
plt.legend()
plt.show()
y_hc按0、1、2、3、4分成了5类。注意,绘制x,y的时候,x的数据一个是第0列,一个是第1列,x轴,y轴构成了用户属于哪一个类别。在Spyder集成环境全选以上代码,按Shift+Enter键运行,如图41-26所示。聚类分成5个分组。
图41- 26层次聚类结果
我们讲解了2种聚类的方式:K-均值聚类、层次聚类,这两种方式各有什么不同?如表41-1所示。
聚类模型 |
优点 |
缺点 |
K-均值聚类 |
非常容易理解,灵活度非常高、非常高效、运行非常快。这里有一个非常重要的关键点:无论是小规模数据还是大规模数据,都非常适用的。 |
需要选择分组的个数。一般聚类都会这么弄,也不能称之为缺点。 |
层次聚类 |
提供了一个树状图的工具,获得的好处是可以很清晰很直观的看出类别的分布。 |
不适用于大型数据集,但在某种程度上也是它的优点,因为很多时候,商场的数据上千条、万条或十万条,只要不超过1百万条,层次聚类都是适用的。不超过100百万条是商场正常的一个数据。 |
表41- 1 K-均值聚类、层次聚类对比
本文根据王家林老师《30个真实商业案例代码中成为AI实战专家(10大机器学习案例、13大深度学习案例、7大增强学习案例)课程》整理