Code前端首页关于Code前端联系我们

Python 中的无监督学习算法

terry 2年前 (2023-09-27) 阅读数 67 #数据结构与算法

无监督学习是一种用于查找数据模式的机器学习技术。提供给无监督算法的数据是未标记的,这意味着仅给出输入变量(X),而没有相应的输出变量。在无监督学习过程中,算法自行发现数据中有趣的结构。 Python 中的无监督学习算法

人工智能研究总监颜乐存解释说,无监督学习——教会机器自己学习,而不明确告诉它们所做的一切是对还是错——是“真正”人工智能的关键。

监督学习与无监督学习。

在监督学习期间,系统尝试从前面给出的示例中学习。 (另一方面,在无监督学习中,系统尝试直接从给定的示例中找到模式。)因此,如果数据集被标记,则它是一个监督问题,如果数据集未标记,则它是一个无监督问题。 Python 中的无监督学习算法

src

上图是监督学习的一个例子;我们使用回归算法来找到特征之间的最佳拟合线。在无监督学习中,输入数据根据特征分为不同的簇,并预测其所属的簇。

重要术语

函数:用于进行预测的输入变量。

Predictions: 输入示例时的模型输出。

Example:单线数据集。一个实例包含一个或多个特征以及可能的标签。

标签: 函数的结果。

无监督学习数据的准备

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

Python的sklearn库用于加载iris数据集和matplotlib库来显示数据。下面是用于研究数据集的代码片段。

# 引入模块
from sklearn import datasets
import matplotlib.pyplot as plt

# 加载数据集
iris_df = datasets.load_iris()

# 数据集上的可用方法
print(dir(iris_df))

# 特征
print(iris_df.feature_names)

# 目标
print(iris_df.target)

# 目标名称
print(iris_df.target_names)
label = {0: 'red', 1: 'blue', 2: 'green'}

# 数据集切片
x_axis = iris_df.data[:, 0]  # Sepal Length
y_axis = iris_df.data[:, 2]  # Sepal Width

# 绘制
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']
复制代码
Python 中的无监督学习算法

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

聚类

在聚类中,数据被分成组。简而言之,目标是将具有相似特征的群体分开,并将它们分配到适当的集群中。

可视化示例,Python 中的无监督学习算法

上图中,左图是未经分类的原始数据,右图是聚类后的图像(数据根据其特征进行分类)。如果它收到预测,它会根据其特征检查其所属的集群并做出预测。

Python 中的 K-Means 聚类算法

K-Means 是一种迭代聚类算法,旨在在每次迭代中找到局部最大值。首先,选择所需的簇数。由于我们知道有 3 个类别,因此我们对算法进行编程,通过将“n_clusters”参数传递给 K 均值模型来将数据分为 3 个类别。现在将三个点(输入)随机分配给三个集群。根据每个点之间的质心距离,将下一个给定输入分配给相应的簇。现在重新计算所有簇的质心。

集群的每个质心都是一组定义结果组的特征值。通过检查质心特征权重,可以定性地解释每个簇代表什么类型的组。

我们从sklearn库导入K-means模型,拟合函数并预测。

K 算法在 Python 中的实现。

# 引入模块
from sklearn import datasets
from sklearn.cluster import KMeans

# 加载数据集
iris_df = datasets.load_iris()

# 声明模型
model = KMeans(n_clusters=3)

# 拟合模型
model.fit(iris_df.data)

# 预测单个输入
predicted_label = model.predict([[7.2, 3.5, 0.8, 1.6]])

# 预测整个数据
all_predictions = model.predict(iris_df.data)

# 打印预测结果
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]
复制代码

层次聚类

顾名思义,层次聚类是一种构建聚类层次结构的算法。该算法首先将所有数据分配给自己的集群。然后将两个最接近的簇合并到同一个簇中。最后,当只剩下一个簇时,算法终止。

树状图可用于可视化层次聚类的完成情况。现在让我们看一个谷物数据层次聚类的示例。数据集可以在这里找到。

Python 中的层次聚类算法实现。

# 引入模块
from scipy.cluster.hierarchy import linkage, dendrogram
import matplotlib.pyplot as plt
import pandas as pd

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

# 从 DataFrame 中删除谷物种类,稍后再保存
varieties = list(seeds_df.pop('grain_variety'))

# 将测量值提取为 NumPy 数组
samples = seeds_df.values

"""
使用带有 method ='complete' 关键字参数的
linkage()函数对样本执行分层聚类。
将结果合并。
"""
mergings = linkage(samples, method='complete')

"""
在合并时使用 dendrogram() 函数绘制树形图,
指定关键字参数 labels = varieties,leaf_rotation = 90 
和 leaf_font_size = 6。
"""
dendrogram(mergings,
           labels=varieties,
           leaf_rotation=90,
           leaf_font_size=6,
           )

plt.show()
复制代码
Python 中的无监督学习算法

K-means 和层次聚类之间的区别

  • 层次聚类不能很好地处理大数据,但 K-means 聚类可以。原因是K-means的时间复杂度是线性的,即O(n),而层次聚类的时间复杂度是二次的,即O(n2)。
  • 在K-means聚类中,当从任意选择的簇开始时,多次运行算法得到的结果可能会有所不同。然而,在层次聚类中,结果是可重复的。
  • 我们发现当簇形状是超球形(如 2D 中的圆,3D 中的球体)时,K 均值效果很好。
  • K-means 不允许有噪声数据,而在层次聚类中我们可以直接使用噪声数据集进行聚类。

t-SNE聚类

这是视觉无监督学习方法之一。 t-SNE 表示 t 分布中的 随机嵌入环境。它将高维空间映射到可以显示的2维或3维空间。具体来说,它用二维或三维点对所有高维对象进行建模,以便相似的对象由附近的点建模,而不同的对象很可能由远处的点建模。

Python中鸢尾花数据集的T-SNE聚类实现

# 引入模块
from sklearn import datasets
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt

# 加载数据集
iris_df = datasets.load_iris()

# 定义模型
model = TSNE(learning_rate=100)

# 拟合模型
transformed = model.fit_transform(iris_df.data)

# 绘制二维的 t-Sne
x_axis = transformed[:, 0]
y_axis = transformed[:, 1]

plt.scatter(x_axis, y_axis, c=iris_df.target)
plt.show()
复制代码
Python 中的无监督学习算法

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

这里,由于鸢尾花数据集有四个特征(4d),所以它的转换和显示是两个维图。类似地,t-SNE模型可以应用于具有n个特征的数据集。

DBSCAN 聚类

DBSCAN(基于密度的噪声聚类方法)是一种流行的聚类算法,在预测分析中用作 K 均值的替代方法。无需指定要运行的集群数量。但是,您需要设置另外两个参数。

scikit-learn 实现提供了 eps 和 min_samples 的默认值,但您通常需要更改这些参数。 eps 参数是同一邻域中两个数据点之间的最大距离。 min_samples 参数是邻域中被视为簇的最小数据点数量。

Python 中的 DBSCAN 聚类

# 引入模块
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
from sklearn.cluster import DBSCAN
from sklearn.decomposition import PCA

# 加载数据集
iris = load_iris()

# 声明模型
dbscan = DBSCAN()

# 拟合
dbscan.fit(iris.data)

# 使用PCA进行转换
pca = PCA(n_components=2).fit(iris.data)
pca_2d = pca.transform(iris.data)

# 基于类别进行绘制
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()
复制代码
Python 中的无监督学习算法

其他监督技术:

  • 主成分分析 (PCA)
  • 异常检测 Python 中的无监督学习算法

    异常检测 ❙❙♷编码网络 赫布学习

  • 生成对抗网络(GAN)
  • 自组织映射

作者:zhmhhu
链接:https://juejin.im/post/5bab10ed6fb9a05d1f2211b6来源: 版权归作者所有。商业转载请联系作者获得许可。非商业转载请注明来源。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

热门