手把手教你在多种无监督聚类算法实现Python(附代码)

简介:

无监督学习是一类用于在数据中寻找模式的机器学习技术。无监督学习算法使用的输入数据都是没有标注过的,这意味着数据只给出了输入变量(自变量 X)而没有给出相应的输出变量(因变量)。在无监督学习中,算法本身将发掘数据中有趣的结构。

70aa6dbbae33e84c4171684f2ed39522bf2a26d4

人工智能研究的领军人物 Yan Lecun,解释道:无监督学习能够自己进行学习,而不需要被显式地告知他们所做的一切是否正确。这是实现真正的人工智能的关键!

监督学习 VS 无监督学习

在监督学习中,系统试图从之前给出的示例中学习。(而在无监督学习中,系统试图从给定的示例中直接找到模式。)因此,如果数据集被标注过了,这就是一个监督学习问题;而如果数据没有被标注过,这就是一个无监督学习问题。

50f57063219f074e1e4f8786e099eb055d21a9c6

上图是一个监督学习的例子,它使用回归技术找到在各个特征之间的最佳拟合曲线。而在无监督学习中,根据特征对输入数据进行划分,并且根据数据所属的簇进行预测。

重要的术语

d47e62d2b349aca45e42305ed6714efbe5ed61d9特征 :进行预测时使用的输入变量。
d47e62d2b349aca45e42305ed6714efbe5ed61d9预测值 :给定一个输入示例时的模型输出。
d47e62d2b349aca45e42305ed6714efbe5ed61d9示例 :数据集中的一行。一个示例包含一个或多个特征,可能还有一个标签。
d47e62d2b349aca45e42305ed6714efbe5ed61d9标签 :特征对应的真实结果(与预测相对应)。

准备无监督学习所需的数据

在本文中,我们使用 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 Slicingx_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']
ab2bfbcd407994abcbf3c55d9e910e32914be6ee
 
紫色:Setosa,绿色:Versicolor,黄色:Virginica
聚类分析

在聚类分析中,数据被划分为不同的几组。简而言之,这一步旨在将具有相似特征的群组从整体数据中分离出来,并将它们分配到簇(cluster)中。

可视化示例:

68a08430570790e15bd4e45713a5dc3663fef0fa

如上所示,左图是没有进行分类的原始数据,右图是进行聚类之后的数据(根据数据本身的特征将其分类)。当给出一个待预测的输入时,它会基于其特征查看自己从属于哪一个簇,并以此为根据进行预测。

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 进行展示。接下来,我们一起来看一个粮食数据的层次聚类示例。

数据集链接: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()

708590d646c1d01e42fa464f193e0a5ed4f406b9

K 均值和层次聚类之间的差别

d47e62d2b349aca45e42305ed6714efbe5ed61d9 层次聚类不能很好地处理大数据,而 K 均值聚类可以。原因在于 K 均值算法的时间复杂度是线性的,即 O(n);而层次聚类的时间复杂度是平方级的,即 O(n2)。
d47e62d2b349aca45e42305ed6714efbe5ed61d9 在 K 均值聚类中,由于我们最初随机地选择簇,多次运行算法得到的结果可能会有较大差异。而层次聚类的结果是可以复现的。
d47e62d2b349aca45e42305ed6714efbe5ed61d9 研究表明,当簇的形状为超球面(例如:二维空间中的圆、三维空间中的球)时,K 均值算法性能良好。
d47e62d2b349aca45e42305ed6714efbe5ed61d9 K 均值算法抗噪声数据的能力很差(对噪声数据鲁棒性较差),而层次聚类可直接使用噪声数据进行聚类分析。

t-SNE 聚类

这是一种可视化的无监督学习方法。t-SNE 指的是 t 分布随机邻居嵌入(t-distributed stochastic neighbor embedding)。它将高维空间映射到一个可视化的二维或三维空间中。具体而言,它将通过如下方式用二维或三维的数据点对高维空间的对象进行建模:以高概率用邻近的点对相似的对象进行建模,而用相距较远的点对不相似的对象进行建模。

用于 Iris 数据集的 t-SNE 聚类的 Python 实现:

# 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()

2ae07679b24f9a500fc049016ba0e14868709082

紫色:Setosa,绿色:Versicolor,黄色:Virginica

在这里,具备 4 个特征(4 维)的 Iris 数据集被转化到二维空间,并且在二维图像中进行展示。类似地,t-SNE 模型可用于具备 n 个特征的数据集。

DBSCAN 聚类

DBSCAN(带噪声的基于密度的空间聚类方法)是一种流行的聚类算法,它被用来在预测分析中替代 K 均值算法。它并不要求输入簇的个数才能运行。但是,你需要对其他两个参数进行调优。

scikit-learn 的 DBSCAN 算法实现提供了缺省的“eps”和“min_samples”参数,但是在一般情况下,用户需要对他们进行调优。参数“eps”是两个数据点被认为在同一个近邻中的最大距离。参数“min_samples”是一个近邻中在同一个簇中的数据点的最小个数。

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()
bac5d1dbf2c3a60578f9ef96161ebc889772d7c4

更多无监督学习技术:

d47e62d2b349aca45e42305ed6714efbe5ed61d9 主成分分析(PCA)
d47e62d2b349aca45e42305ed6714efbe5ed61d9 异常检测
d47e62d2b349aca45e42305ed6714efbe5ed61d9 自编码器
d47e62d2b349aca45e42305ed6714efbe5ed61d9 深度信念网络
d47e62d2b349aca45e42305ed6714efbe5ed61d9 赫布型学习
d47e62d2b349aca45e42305ed6714efbe5ed61d9 生成对抗网络(GAN)

d47e62d2b349aca45e42305ed6714efbe5ed61d9自组织映射


原文发布时间为:2018-05-31

本文来自云栖社区合作伙伴“数据派THU”,了解相关信息可以关注“数据派THU”。

相关文章
|
28天前
|
算法 前端开发 数据处理
小白学python-深入解析一位字符判定算法
小白学python-深入解析一位字符判定算法
45 0
|
1月前
|
机器学习/深度学习 算法 搜索推荐
从理论到实践,Python算法复杂度分析一站式教程,助你轻松驾驭大数据挑战!
【10月更文挑战第4天】在大数据时代,算法效率至关重要。本文从理论入手,介绍时间复杂度和空间复杂度两个核心概念,并通过冒泡排序和快速排序的Python实现详细分析其复杂度。冒泡排序的时间复杂度为O(n^2),空间复杂度为O(1);快速排序平均时间复杂度为O(n log n),空间复杂度为O(log n)。文章还介绍了算法选择、分而治之及空间换时间等优化策略,帮助你在大数据挑战中游刃有余。
54 4
|
1月前
|
机器学习/深度学习 缓存 算法
Python算法设计中的时间复杂度与空间复杂度,你真的理解对了吗?
【10月更文挑战第4天】在Python编程中,算法的设计与优化至关重要,尤其在数据处理、科学计算及机器学习领域。本文探讨了评估算法性能的核心指标——时间复杂度和空间复杂度。通过详细解释两者的概念,并提供快速排序和字符串反转的示例代码,帮助读者深入理解这些概念。同时,文章还讨论了如何在实际应用中平衡时间和空间复杂度,以实现最优性能。
57 6
|
2天前
|
算法 数据挖掘 数据安全/隐私保护
基于FCM模糊聚类算法的图像分割matlab仿真
本项目展示了基于模糊C均值(FCM)算法的图像分割技术。算法运行效果良好,无水印。使用MATLAB 2022a开发,提供完整代码及中文注释,附带操作步骤视频。FCM算法通过隶属度矩阵和聚类中心矩阵实现图像分割,适用于灰度和彩色图像,广泛应用于医学影像、遥感图像等领域。
|
1天前
|
算法 Python
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果;贪心算法在每一步选择局部最优解,追求全局最优;动态规划通过保存子问题的解,避免重复计算,确保全局最优。这三种算法各具特色,适用于不同类型的问题,合理选择能显著提升编程效率。
15 2
|
29天前
|
存储 机器学习/深度学习 算法
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
蓝桥杯Python编程练习题的集合,涵盖了从基础到提高的多个算法题目及其解答。
50 3
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
|
10天前
|
算法 测试技术 开发者
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗;代码审查通过检查源代码发现潜在问题,提高代码质量和团队协作效率。本文介绍了一些实用的技巧和工具,帮助开发者提升开发效率。
14 3
|
13天前
|
机器学习/深度学习 人工智能 算法
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
车辆车型识别,使用Python作为主要编程语言,通过收集多种车辆车型图像数据集,然后基于TensorFlow搭建卷积网络算法模型,并对数据集进行训练,最后得到一个识别精度较高的模型文件。再基于Django搭建web网页端操作界面,实现用户上传一张车辆图片识别其类型。
52 0
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
|
18天前
|
机器学习/深度学习 算法 Java
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
|
26天前
|
机器学习/深度学习 人工智能 算法
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
玉米病害识别系统,本系统使用Python作为主要开发语言,通过收集了8种常见的玉米叶部病害图片数据集('矮花叶病', '健康', '灰斑病一般', '灰斑病严重', '锈病一般', '锈病严重', '叶斑病一般', '叶斑病严重'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。再使用Django搭建Web网页操作平台,实现用户上传一张玉米病害图片识别其名称。
50 0
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练