【Python实战】无监督学习—聚类、层次聚类、t-SNE,DBSCAN

2018 年 6 月 18 日 专知

【导读】本文主要介绍了无监督学习在Python上的实践,围绕着无监督学习,讲述了当前主流的无监督聚类方法:数据准备,聚类,K-Means Python实现,层次聚类和其Python实现,t-SNE聚类,DBSCAN 聚类。并且附上作者自己的经验总结,博文附完整详细代码,建议大家收藏学习!


作者 | Vihar Kurama

编译 | 专知

整理 | Mandy, Shengsheng


 

Unsupervised Learning with Python


无监督学习是一类机器学习技术,用来发现数据中的模式。注意:在无监督算法中,数据是没有标注的,即只给出输入变量(X),不给出相应的输出变量。无监督学习是让算法自己去发现数据中有趣的结构。


人工智能科学家Yan Lecun解释说,无监督学习——让机器自己学习,而不必被明确告知他们所做的每件事是对是错——是“真正的”人工智能的关键。


监督学习VS无监督学习


在监督学习中,系统试图从之前给出的例子中学习。然而,在无监督学习中,系统试图直接从给出的示例中找到模式。如果数据集被标记了,则是一个监督学习的问题,如果数据集没有被标记,那么它就是一个无监督学习的问题。

左边的图像是监督学习的一个例子;我们使用回归方法找到特征之间的最佳拟合线。右边的图像是无监督学习的一个例子;在无监督学习中,输入是基于特征进行分离的,预测是基于它属于哪个簇(cluster)。


重要术语


特征(Feature):用于进行预测的输入变量。


预测(Predictions):当提供输入示例时,模型的输出。


示例(Example):数据集的一行。一个示例包含一个或多个特征, 可能还有一个标签。


标签(Label):特征的结果。


为无监督学习准备数据


在本文中,我们使用Iris数据集进行第一次预测。该数据集包含一组具有5个属性的150条记录,这5个属性为花瓣长度、花瓣宽度、萼片长度、萼片宽度和类别。Iris Setosa, Iris Virginica和Iris Versicolor是三个类。对于我们的无监督算法,我们给出了Iris花的四个特征,并预测了它属于哪个类。


我们使用Python中的sklearn库加载Iris数据集,使用matplotlib进行数据可视化。下面是用于处理数据集的代码部分。

# Importing Modules
from sklearn import datasets
import matplotlib.pyplot as plt

# Loading dataset
iris_df = datasets.load_iris()

# Available methods on dataset
print(dir(iris_df))

# Features
print(iris_df.feature_names)

# Targets
print(iris_df.target)

# Target Names
print(iris_df.target_names)
label = {0: 'red', 1: 'blue', 2: 'green'}

# Dataset Slicing
x_axis = iris_df.data[:, 0] # Sepal Length
y_axis = iris_df.data[:, 2] # Sepal Width

# Plotting
plt.scatter(x_axis, y_axis, c=iris_df.target)
plt.show()


输出结果:

['DESCR', 'data','feature_names', 'target', 'target_names']
['sepal length (cm)', 'sepal width (cm)','petal length (cm)',
'petal width (cm)']
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 22 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2
]
['setosa' 'versicolor' 'virginica']

 

图中:紫罗兰色表示Setosa,绿色表示Versicolor,黄色表示Virginica


聚类(Clustering)


在聚类中,数据被分成几个组。简单来说:目的是将具有相似特征的群体分开并将它们赋予不同的簇(cluster)中。


可视化的例子,  

在上图中,左边的图像是未进行分类的原始数据,右边的图像是聚类的结果(根据数据的特征对数据进行划分)。当给定一个要预测的输入时,它将根据其特征在簇(cluster)中检查其所属哪一个类别,并进行预测。


Python中的K-Means聚类


K-Means是一种迭代聚类算法,旨在找到每次迭代中的局部最大值。由于我们知道涉及3个类,因此我们通过将参数“n_clusters”传递到KMeans模型中,对算法进行编程,将数据分组为3个类。


现在随机的三个样本点(输入)被分配到三个簇(cluster)中。然后后面样本点和这每一个点算一下质心距离(centroid distance),然后选出并放入最优的簇(cluster)中。然后,重新计算所有簇(cluster)的centroids。


每一个聚类的中心是定义这一组样本点的特征值的集合,检查中心特征权重可以解释每一个簇(cluster)代表的类型。


我们从sklearn库中导入KMeans模型,拟合特征并进行预测。


K-Means在Python中的实现:

# Importing Modules
from sklearn import datasets
from sklearn.cluster import KMeans

# Loading dataset
iris_df = datasets.load_iris()

# Declaring Model
model = KMeans(n_clusters=3)

# Fitting Model
model.fit(iris_df.data)

# Predicitng a single input
predicted_label = model.predict([[7.2, 3.5, 0.8, 1.6]])

# Prediction on the entire data
all_predictions = model.predict(iris_df.data)

# Printing Predictions
print(predicted_label)
print(all_predictions)


输出结果:

[0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 1 1 1 1 2 1
1 1 1 1 1 2 2 1 1 1 1 2 1 2 1 2 1 1 2 2 1 1 1 1 1 2 1 1 1 1 2 1 1 1 2 1
 1 1 2 1 1 2
]


层次聚类(Hierarchical Clustering)


顾名思义,层次聚类是一种构建聚类层次结构的算法。该算法从分配给自己簇(cluster)的所有数据开始。然后将两个最近的簇(cluster)连接到同一个簇(cluster)中。最后,当只剩下一个簇(cluster)时,该算法就结束了。


层次聚类的完成可以用dendrogram来表示。现在让我们看一个grain谷粒数据层次聚类的例子。


数据集地址:

https://raw.githubusercontent.com/vihar/unsupervised-learning-with-python/master/seeds-less-rows.csv.

 

Python中的层次聚类实现:

# Importing Modules
from scipy.cluster.hierarchy import linkage, dendrogram
import matplotlib.pyplot as plt
import pandas as pd

# Reading the DataFrame
seeds_df = pd.read_csv(
"https://raw.githubusercontent.com/vihar/
unsupervised-learning-with-python/master/seeds-less-rows.csv"
)

# Remove the grain species from the DataFrame, save for later
varieties = list(seeds_df.pop('grain_variety'))

# Extract the measurements as a NumPy array
samples = seeds_df.values

"""
Perform hierarchical clustering on samples using the
linkage() function with the method='complete' keyword argument.
Assign the result to mergings.
"""
mergings = linkage(samples, method='complete')

"""
Plot a dendrogram using the dendrogram() function on mergings,
specifying the keyword arguments labels=varieties, leaf_rotation=90,
and leaf_font_size=6.
"""
dendrogram(mergings,
         
labels=varieties,
         
leaf_rotation=90,
         
leaf_font_size=6,
         
)

plt.show()


输出结果:


K-Means与层次聚类的区别


  • 层次聚类不能很好地处理大数据,但K-Means聚类可以。这是因为K-Means的时间复杂度是线性的,即O(n),而层次聚类的时间复杂度是二次方,即O(n2)。


  • 在K-Means聚类中,因为我们初始化的时候,会任意选择不同的簇(cluster),所以多次运行算法产生的结果可能会有所不同。然而层次聚类中是可重现的。


  • 当簇(cluster)的形状是超球形时(如2D中的圆,3D中的球),K-Means表现地很好。


  • K-Means不允许嘈杂的数据,而在层次中我们可以直接使用有噪声的数据集进行聚类。


t-SNE聚类


它是一种无监督学习可视化的方法。t-SNE表示t-distributed stochastic neighborembedding。


它将高维空间映射到可以可视化的二维或三维空间。具体地说,它通过一个二维或三维点对每个高维对象进行建模,其方式是相似的对象由附近的点建模,而不相似的对象则由高概率的远点建模。


具体可以查看专知以前的t-SNE详解:

你真的会用 t-SNE 么?有关 t-SNE 的小技巧


Python中,基于Iris数据集的t-SNE聚类实现:

# Importing Modules
from sklearn import datasets
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt

# Loading dataset
iris_df = datasets.load_iris()

# Defining Model
model = TSNE(learning_rate=100)

# Fitting Model
transformed = model.fit_transform(iris_df.data)

# Plotting 2d t-Sne
x_axis = transformed[:, 0]
y_axis = transformed[:, 1]

plt.scatter(x_axis, y_axis, c=iris_df.target)
plt.show()


输出结果: 

其中,紫罗兰色:Setosa,绿色:Versicolor,黄色:Virginica


这里Iris数据集具有四个特征(4d),它被变换并以二维图形表示。类似地,t-SNE模型可以应用于具有n个特征的数据集。


DBSCAN聚类


DBSCAN(Density-Based Spatial Clusteringof Applications with Noise,具有噪声的基于密度的聚类方法)是一种流行的聚类算法,用于替代预测分析中的K-means。它不要求您输入簇(cluster)的个数才能运行。但作为交换,你必须调整其他两个参数(eps和min_samples)。


DBSCAN算法的目的在于过滤低密度区域,发现稠密度样本点。跟传统的基于层次的聚类和划分聚类的凸形聚类簇不同,该算法可以发现任意形状的聚类簇,与传统的算法相比它有如下优点:

(1)与K-MEANS比较起来,不需要输入要划分的聚类个数;


(2)聚类簇的形状没有偏倚;


(3)可以在需要时输入过滤噪声的参数;


scikit-learn为eps和min_samples参数提供了一个默认值,但通常需要对它们进行优化。eps是在同一邻域中考虑的两个数据点之间的最大距离。min_samples指的是簇(cluster)在邻域中数据点数量的最小数目。


DBSCAN聚类的Python实现:

# Importing Modules
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
from sklearn.cluster import DBSCAN
from sklearn.decomposition import PCA

# Load Dataset
iris = load_iris()

# Declaring Model
dbscan = DBSCAN()

# Fitting
dbscan.fit(iris.data)

# Transoring Using PCA
pca = PCA(n_components=2).fit(iris.data)
pca_2d = pca.transform(iris.data)

# Plot based on Class
for i in range(0, pca_2d.shape[0]):
if dbscan.labels_[i] == 0:
c1 = plt.scatter(pca_2d[i, 0], pca_2d[i, 1], c='r', marker='+')
elif dbscan.labels_[i] == 1:
c2 = plt.scatter(pca_2d[i, 0], pca_2d[i, 1], c='g', marker='o')
elif dbscan.labels_[i] == -1:
c3 = plt.scatter(pca_2d[i, 0], pca_2d[i, 1], c='b', marker='*')

plt.legend([c1, c2, c3], ['Cluster 1', 'Cluster 2', 'Noise'])
plt.title('DBSCAN finds 2 clusters and Noise')
plt.show()


输出结果:

更多无监督方法:


主成分分析(PCA)

异常检测(Anomaly detection)

自编码(Autoencoders)

深度置信网络(Deep BeliefNets)

Hebbian Learning

生成对抗网络(GANs)

自组织映射(Self-Organizingmaps)


原文链接:

https://towardsdatascience.com/unsupervised-learning-with-python-173c51dc7f03

-END-

专 · 知

人工智能领域26个主题知识资料全集获取加入专知人工智能服务群: 欢迎微信扫一扫加入专知人工智能知识星球群,获取专业知识教程视频资料和与专家交流咨询!


请PC登录www.zhuanzhi.ai或者点击阅读原文,注册登录专知,获取更多AI知识资料

请加专知小助手微信(扫一扫如下二维码添加),加入专知主题群(请备注主题类型:AI、NLP、CV、 KG等)交流~

关注专知公众号,获取人工智能的专业知识!

点击“阅读原文”,使用专知

登录查看更多
13

相关内容

层次聚类(Hierarchical Clustering)是聚类算法的一种,通过计算不同类别数据点间的相似度来创建一棵有层次的嵌套聚类树。在聚类树中,不同类别的原始数据点是树的最低层,树的顶层是一个聚类的根节点。
【实用书】学习用Python编写代码进行数据分析,103页pdf
专知会员服务
194+阅读 · 2020年6月29日
【干货书】机器学习Python实战教程,366页pdf
专知会员服务
340+阅读 · 2020年3月17日
Sklearn 与 TensorFlow 机器学习实用指南,385页pdf
专知会员服务
129+阅读 · 2020年3月15日
算法与数据结构Python,369页pdf
专知会员服务
162+阅读 · 2020年3月4日
【电子书推荐】Data Science with Python and Dask
专知会员服务
43+阅读 · 2019年6月1日
盘一盘 Python 系列 8 - Sklearn
平均机器
5+阅读 · 2019年5月30日
Python中机器学习的特征选择工具
云栖社区
8+阅读 · 2018年7月16日
【干货】Python无监督学习的4大聚类算法
新智元
14+阅读 · 2018年5月26日
实战 | 用Python做图像处理(二)
七月在线实验室
17+阅读 · 2018年5月25日
教程 | 一文简述多种无监督聚类算法的Python实现
机器之心
4+阅读 · 2018年5月22日
动手写机器学习算法:K-Means聚类算法
七月在线实验室
5+阅读 · 2017年12月6日
一文解读聚类中的两种流行算法
量子位
6+阅读 · 2017年11月20日
一文详解聚类和降维(附实例、代码)
数据派THU
7+阅读 · 2017年9月3日
Deep Anomaly Detection with Outlier Exposure
Arxiv
17+阅读 · 2018年12月21日
q-Space Novelty Detection with Variational Autoencoders
Arxiv
22+阅读 · 2018年8月30日
Arxiv
7+阅读 · 2018年3月22日
Arxiv
3+阅读 · 2018年2月24日
VIP会员
相关VIP内容
【实用书】学习用Python编写代码进行数据分析,103页pdf
专知会员服务
194+阅读 · 2020年6月29日
【干货书】机器学习Python实战教程,366页pdf
专知会员服务
340+阅读 · 2020年3月17日
Sklearn 与 TensorFlow 机器学习实用指南,385页pdf
专知会员服务
129+阅读 · 2020年3月15日
算法与数据结构Python,369页pdf
专知会员服务
162+阅读 · 2020年3月4日
【电子书推荐】Data Science with Python and Dask
专知会员服务
43+阅读 · 2019年6月1日
相关资讯
盘一盘 Python 系列 8 - Sklearn
平均机器
5+阅读 · 2019年5月30日
Python中机器学习的特征选择工具
云栖社区
8+阅读 · 2018年7月16日
【干货】Python无监督学习的4大聚类算法
新智元
14+阅读 · 2018年5月26日
实战 | 用Python做图像处理(二)
七月在线实验室
17+阅读 · 2018年5月25日
教程 | 一文简述多种无监督聚类算法的Python实现
机器之心
4+阅读 · 2018年5月22日
动手写机器学习算法:K-Means聚类算法
七月在线实验室
5+阅读 · 2017年12月6日
一文解读聚类中的两种流行算法
量子位
6+阅读 · 2017年11月20日
一文详解聚类和降维(附实例、代码)
数据派THU
7+阅读 · 2017年9月3日
相关论文
Deep Anomaly Detection with Outlier Exposure
Arxiv
17+阅读 · 2018年12月21日
q-Space Novelty Detection with Variational Autoencoders
Arxiv
22+阅读 · 2018年8月30日
Arxiv
7+阅读 · 2018年3月22日
Arxiv
3+阅读 · 2018年2月24日
Top
微信扫码咨询专知VIP会员