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

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

Unsupervised Learning with Python

#### 为无监督学习准备数据

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

# 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']

#### Python中的K-Means聚类

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

K-Means在Python中的实现:

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

# 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）

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

Python中的层次聚类实现：

# Importing Modules
import matplotlib.pyplot as plt
import pandas as pd

"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.
"""

"""
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聚类

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

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

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

#### 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
import matplotlib.pyplot as plt
from sklearn.cluster import DBSCAN
from sklearn.decomposition import PCA

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

#### 更多无监督方法：

Hebbian Learning

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

-END-

0 条评论

## 相关文章

### 【机器学习】--Kmeans从初识到应用

Kmeans算法一般在数据分析前期使用，选取适当的k，将数据分类后，然后分类研究不同聚类下数据的特点。

1792

### ResNet论文翻译——中文版

Deep Residual Learning for Image Recognition 摘要 更深的神经网络更难训练。我们提出了一种残差学习框架来减轻网络训...

3887

23110

1474

906

### CS224d－Day 5: RNN快速入门

---- CS224d－Day 5: 什么是RNN 本文结构： 1.什么是 RNN？和NN的区别？ 2.RNN 能做什么？为什么要用 RNN？ 3.RNN 怎么...

2795

### 不可错过的 GAN 资源：教程、视频、代码实现、89 篇论文下载

【新智元导读】这是一份生成对抗（神经）网络的重要论文以及其他资源的列表，由 Holger Caesar 整理，包括重要的 workshops，教程和博客，按主题...

78510

2936

3209

3416