正文
本文简要介绍了多种无
监督学习
算法的 Python 实现,包括 K 均值聚类、
层次聚类
、
t-SNE
聚类、
DBSCAN
聚类。
无
监督学习
是一类用于在数据中寻找模式的
机器学习
技术。无
监督学习
算法使用的输入数据都是没有标注过的,这意味着数据只给出了输入变量(自变量 X)而没有给出相应的输出变量(因变量)。在无
监督学习
中,算法本身将发掘数据中有趣的结构。
人工智能
研究的领军人物 Yan Lecun,解释道:无
监督学习
能够自己进行学习,而不需要被显式地告知他们所做的一切是否正确。这是实现真正的
人工智能
的关键!
监督学习
VS 无
监督学习
在
监督学习
中,系统试图从之前给出的示例中学习。(而在无
监督学习
中,系统试图从给定的示例中直接找到模式。)因此,如果数据集被标注过了,这就是一个
监督学习
问题;而如果数据没有被标注过,这就是一个无
监督学习
问题。
上图是一个
监督学习
的例子,它使用回归技术找到在各个特征之间的最佳拟合曲线。而在无
监督学习
中,根据特征对输入数据进行划分,并且根据数据所属的簇进行预测。
重要的术语
准备无
监督学习
所需的数据
在本文中,我们使用 Iris 数据集来完成初级的预测工作。这个数据集包含 150 条记录,每条记录由 5 个特征构成——花瓣长度、花瓣宽度、萼片长度、萼片宽度、花的类别。花的类别包含 Iris Setosa、Iris VIrginica 和 Iris Versicolor 三种。本文中向无监督算法提供了鸢尾花的四个特征,预测它属于哪个类别。
本文使用 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 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 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 1 1 1 1 1 1 1 1 1 1 1 1 1 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 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
聚类分析
在
聚类分析
中,数据被划分为不同的几组。简而言之,这一步旨在将具有相似特征的群组从整体数据中分离出来,并将它们分配到簇(cluster)中。
可视化示例:
如上所示,左图是没有进行分类的原始数据,右图是进行聚类之后的数据(根据数据本身的特征将其分类)。当给出一个待预测的输入时,它会基于其特征查看自己从属于哪一个簇,并以此为根据进行预测。
K-均值聚类的 Python 实现
K 均值是一种迭代的聚类算法,它的目标是在每次迭代中找到局部最大值。该算法要求在最初选定聚类簇的个数。由于我们知道本问题涉及到 3 种花的类别,所以我们通过将
参数
「n_clusters」传递给 K 均值模型来编写算法,将数据分组到 3 个类别中。现在,我们随机地将三个数据点(输入)分到三个簇中。基于每个点之间的质心距离,下一个给定的输入数据点将被划分到独立的簇中。接着,我们将重新计算所有簇的质心。
每一个簇的质心是定义结果集的特征值的集合。研究质心的特征
权重
可用于定性地解释每个簇代表哪种类型的群组。
我们从 sklearn 库中导入 K 均值模型,拟合特征并进行预测。
K 均值算法的 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]
层次聚类
层次聚类
,顾名思义,是一种能够构建有层次的簇的算法。在这个算法的起始阶段,每个数据点都是一个簇。接着,两个最接近的簇合二为一。最终,当所有的点都被合并到一个簇中时,算法停止。
层次聚类
的实现可以用 dendrogram 进行展示。接下来,我们一起来看一个粮食数据的
层次聚类
示例。数据集链接:
raw.githubusercontent.com/vihar/unsup…
层次聚类
的 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 均值和
层次聚类
之间的差别
-
层次聚类
不能很好地处理
大数据
,而 K 均值聚类可以。原因在于 K 均值算法的
时间复杂度
是线性的,即 O(n);而
层次聚类
的
时间复杂度
是平方级的,即
O(n2)。
-
在 K 均值聚类中,由于我们最初随机地选择簇,多次运行算法得到的结果可能会有较大差异。而
层次聚类
的结果是可以复现的。
-
研究表明,当簇的形状为超球面(例如:二维空间中的圆、三维空间中的球)时,K 均值算法性能良好。
-
K 均值算法抗
噪声
数据的能力很差(对
噪声
数据鲁棒性较差),而
层次聚类
可直接使用
噪声
数据进行
聚类分析
。
t-SNE
聚类
这是一种可视化的无
监督学习
方法。
t-SNE
指的是 t 分布随机邻居嵌入(t-distributed stochastic neighbor embedding)。它将高维空间
映射
到一个可视化的二维或三维空间中。具体而言,它将通过如下方式用二维或三维的数据点对高维空间的对象进行建模:以高概率用邻近的点对相似的对象进行建模,而用相距较远的点对不相似的对象进行建模。
用于 Iris 数据集的
t-SNE
聚类的 Python 实现: