# 无监督学习: 寻求数据表示
校验者:
[@片刻](https://github.com/apachecn/scikit-learn-doc-zh)
翻译者:
[@X](https://github.com/apachecn/scikit-learn-doc-zh)
## 聚类: 对样本数据进行分组
可以利用聚类解决的问题
对于 iris 数据集来说,我们知道所有样本有 3 种不同的类型,但是并不知道每一个样本是那种类型:此时我们可以尝试一个 **clustering task(聚类任务)** 聚类算法: 将样本进行分组,相似的样本被聚在一起,而不同组别之间的样本是有明显区别的,这样的分组方式就是 *clusters(聚类)*
### K-means 聚类算法
关于聚类有很多不同的聚类标准和相关算法,其中最简便的算法是 [K-means](../../modules/clustering.html#k-means) 。
[![http://sklearn.apachecn.org/cn/0.19.0/_images/sphx_glr_plot_cluster_iris_002.png](https://box.kancloud.cn/14895cd95bce329b798fa1e6609d9f97_400x300.jpg)](../../auto_examples/cluster/plot_cluster_iris.html)
```
>>> from sklearn import cluster, datasets
>>> iris = datasets.load_iris()
>>> X_iris = iris.data
>>> y_iris = iris.target
>>> k_means = cluster.KMeans(n_clusters=3)
>>> k_means.fit(X_iris)
KMeans(algorithm='auto', copy_x=True, init='k-means++', ...
>>> print(k_means.labels_[::10])
[1 1 1 1 1 0 0 0 0 0 2 2 2 2 2]
>>> print(y_iris[::10])
[0 0 0 0 0 1 1 1 1 1 2 2 2 2 2]
```
Warning
k\_means 算法无法保证聚类结果完全绝对真实的反应实际情况。首先,选择正确合适的聚类数量不是一件容易的事情,第二,该算法对初始值的设置敏感,容易陷入局部最优。尽管 scikit-learn 采取了不同的方式来缓解以上问题,目前仍没有完美的解决方案。
[![k_means_iris_bad_init](https://box.kancloud.cn/11305ca270ac5523da46742ee936a429_400x300.jpg)](../../auto_examples/cluster/plot_cluster_iris.html)[![k_means_iris_8](https://box.kancloud.cn/d03ca88d5a883190a493900813bbb773_400x300.jpg)](../../auto_examples/cluster/plot_cluster_iris.html)[![cluster_iris_truth](https://box.kancloud.cn/79156eaae0727c099eabbaed4c227c9f_400x300.jpg)](../../auto_examples/cluster/plot_cluster_iris.html)**Bad initialization****8 clusters****Ground truth****Don’t over-interpret clustering results(不要过分解读聚类结果)**
**Application example: vector quantization(应用案例:向量量化(vector quantization))**
一般来说聚类,特别是 K\_means 聚类可以作为一种用少量样本来压缩信息的方式。这种方式就是 [vector quantization](https://en.wikipedia.org/wiki/Vector_quantization) 。例如,K\_means 算法可以用于对一张图片进行色调分离:
```
>>> import scipy as sp
>>> try:
... face = sp.face(gray=True)
... except AttributeError:
... from scipy import misc
... face = misc.face(gray=True)
>>> X = face.reshape((-1, 1)) # We need an (n_sample, n_feature) array
>>> k_means = cluster.KMeans(n_clusters=5, n_init=1)
>>> k_means.fit(X)
KMeans(algorithm='auto', copy_x=True, init='k-means++', ...
>>> values = k_means.cluster_centers_.squeeze()
>>> labels = k_means.labels_
>>> face_compressed = np.choose(labels, values)
>>> face_compressed.shape = face.shape
```
[![face](https://box.kancloud.cn/3d53ac5e00cb8b52e42f58483cf8499e_300x220.jpg)](../../auto_examples/cluster/plot_face_compress.html)[![face_compressed](https://box.kancloud.cn/4f88e6a46d6f5abc88a7cf1c0f580a5d_300x220.jpg)](../../auto_examples/cluster/plot_face_compress.html)[![face_regular](https://box.kancloud.cn/12f3a557ca5e95794c8fb7c4361ce6b6_300x220.jpg)](../../auto_examples/cluster/plot_face_compress.html)[![face_histogram](https://box.kancloud.cn/14eeac1ffb3d82e600872afe8739245a_300x220.jpg)](../../auto_examples/cluster/plot_face_compress.html)Raw imageK-means quantizationEqual binsImage histogram
### 分层聚类算法: 谨慎使用
[层次聚类](../../modules/clustering.html#hierarchical-clustering) (分层聚类算法)是一种旨在构建聚类层次结构的分析方法,一般来说,实现该算法的大多数方法有以下两种:- **Agglomerative(聚合)** - 自底向上的方法: 初始阶段,每一个样本将自己作为单独的一个簇,聚类的簇以最小
化距离的标准进行迭代聚合。当感兴趣的簇只有少量的样本时,该方法是很合适的。如果需要聚类的 簇数量很大,该方法比K\_means算法的计算效率也更高。 \* **Divisive(分裂)** - 自顶向下的方法: 初始阶段,所有的样本是一个簇,当一个簇下移时,它被迭代的进 行分裂。当估计聚类簇数量较大的数据时,该算法不仅效率低(由于样本始于一个簇,需要被递归的进行 分裂),而且从统计学的角度来讲也是不合适的。
#### 连接约束聚类
对于逐次聚合聚类,通过连接图可以指定哪些样本可以被聚合在一个簇。在 scikit 中,图由邻接矩阵来表示,通常该矩阵是一个稀疏矩阵。这种表示方法是非常有用的,例如在聚类图像时检索连接区域(有时也被称为连接要素):
[![http://sklearn.apachecn.org/cn/0.19.0/_images/sphx_glr_plot_face_ward_segmentation_001.png](https://box.kancloud.cn/b702086b3787009da12f7ecb36482398_500x500.jpg)](../../auto_examples/cluster/plot_face_ward_segmentation.html)
```
import matplotlib.pyplot as plt
from sklearn.feature_extraction.image import grid_to_graph
from sklearn.cluster import AgglomerativeClustering
# #############################################################################
# Generate data
try: # SciPy >= 0.16 have face in misc
from scipy.misc import face
face = face(gray=True)
except ImportError:
face = sp.face(gray=True)
# Resize it to 10% of the original size to speed up the processing
face = sp.misc.imresize(face, 0.10) / 255.
X = np.reshape(face, (-1, 1))
# #############################################################################
# Define the structure A of the data. Pixels connected to their neighbors.
connectivity = grid_to_graph(*face.shape)
# #############################################################################
```
#### 特征聚集
我们已经知道,稀疏性可以缓解特征维度带来的问题,*i.e* 即与特征数量相比,样本数量太少。 另一个解决该问题的方式是合并相似的维度:**feature agglomeration(特征聚集)**。该方法可以通过对特征聚类来实现。换 句话说,就是对样本数据转置后进行聚类。
[![http://sklearn.apachecn.org/cn/0.19.0/_images/sphx_glr_plot_digits_agglomeration_001.png](https://box.kancloud.cn/749a3b0ab6a9e68568cc8405a7dca65b_400x350.jpg)](../../auto_examples/cluster/plot_digits_agglomeration.html)
```
>>> digits = datasets.load_digits()
>>> images = digits.images
>>> X = np.reshape(images, (len(images), -1))
>>> connectivity = grid_to_graph(*images[0].shape)
>>> agglo = cluster.FeatureAgglomeration(connectivity=connectivity,
... n_clusters=32)
>>> agglo.fit(X)
FeatureAgglomeration(affinity='euclidean', compute_full_tree='auto',...
>>> X_reduced = agglo.transform(X)
>>> X_approx = agglo.inverse_transform(X_reduced)
>>> images_approx = np.reshape(X_approx, images.shape)
```
`transform` and `inverse_transform` methods
Some estimators expose a `transform` method, for instance to reduce the dimensionality of the dataset.
## 分解: 将一个信号转换成多个成份并且加载
**Components and loadings(成分和载荷)**
如果 X 是多维数据,那么我们试图解决的问题是在不同的观察基础上对数据进行重写。我们希望学习得到载荷 L 和成分 C 使得 *X = L C* 。提取成分 C 有多种不同的方法。
### 主成份分析: PCA
[主成分分析(PCA)](../../modules/decomposition.html#pca) 将能够解释数据信息最大方差的的连续成分提取出来
[![pca_3d_axis](https://box.kancloud.cn/09913b3a40b1b27a58b3f9c3ffc79349_400x300.jpg)](../../auto_examples/decomposition/plot_pca_3d.html) [![pca_3d_aligned](https://box.kancloud.cn/c5cbdd9a4a914015dad0ef5caeab14ee_400x300.jpg)](../../auto_examples/decomposition/plot_pca_3d.html)
上图中样本点的分布在一个方向上是非常平坦的:即三个单变量特征中的任何一个都可以有另外两个特征来表示。主成分分析法(PCA)可以找到使得数据分布不 *flat* 的矢量方向(可以反映数据主要信息的特征)。
当用主成分分析(PCA)来 *transform(转换)* 数据时,可以通过在子空间上投影来降低数据的维数。
```
>>> # Create a signal with only 2 useful dimensions
>>> x1 = np.random.normal(size=100)
>>> x2 = np.random.normal(size=100)
>>> x3 = x1 + x2
>>> X = np.c_[x1, x2, x3]
>>> from sklearn import decomposition
>>> pca = decomposition.PCA()
>>> pca.fit(X)
PCA(copy=True, iterated_power='auto', n_components=None, random_state=None,
svd_solver='auto', tol=0.0, whiten=False)
>>> print(pca.explained_variance_)
[ 2.18565811e+00 1.19346747e+00 8.43026679e-32]
>>> # As we can see, only the 2 first components are useful
>>> pca.n_components = 2
>>> X_reduced = pca.fit_transform(X)
>>> X_reduced.shape
(100, 2)
```
### 独立成分分析: ICA
[独立成分分析(ICA)](../../modules/decomposition.html#ica) 可以提取数据信息中的独立成分,这些成分载荷的分布包含了最多的 的独立信息。该方法能够恢复 **non-Gaussian(非高斯)** 独立信号:
[![http://sklearn.apachecn.org/cn/0.19.0/_images/sphx_glr_plot_ica_blind_source_separation_001.png](https://box.kancloud.cn/3ccbca1dc1319339a91e1cd309a2ea6c_566x424.jpg)](../../auto_examples/decomposition/plot_ica_blind_source_separation.html)
```
>>> # Generate sample data
>>> import numpy as np
>>> from scipy import signal
>>> time = np.linspace(0, 10, 2000)
>>> s1 = np.sin(2 * time) # Signal 1 : sinusoidal signal
>>> s2 = np.sign(np.sin(3 * time)) # Signal 2 : square signal
>>> s3 = signal.sawtooth(2 * np.pi * time) # Signal 3: saw tooth signal
>>> S = np.c_[s1, s2, s3]
>>> S += 0.2 * np.random.normal(size=S.shape) # Add noise
>>> S /= S.std(axis=0) # Standardize data
>>> # Mix data
>>> A = np.array([[1, 1, 1], [0.5, 2, 1], [1.5, 1, 2]]) # Mixing matrix
>>> X = np.dot(S, A.T) # Generate observations
>>> # Compute ICA
>>> ica = decomposition.FastICA()
>>> S_ = ica.fit_transform(X) # Get the estimated sources
>>> A_ = ica.mixing_.T
>>> np.allclose(X, np.dot(S_, A_) + ica.mean_)
True
```
- scikit-learn 0.19 中文文档
- 用户指南
- 1. 监督学习
- 1.1. 广义线性模型
- 1.2. 线性和二次判别分析
- 1.3. 内核岭回归
- 1.4. 支持向量机
- 1.5. 随机梯度下降
- 1.6. 最近邻
- 1.7. 高斯过程
- 1.8. 交叉分解
- 1.9. 朴素贝叶斯
- 1.10. 决策树
- 1.11. 集成方法
- 1.12. 多类和多标签算法
- 1.13. 特征选择
- 1.14. 半监督学习
- 1.15. 等式回归
- 1.16. 概率校准
- 1.17. 神经网络模型(有监督)
- 2. 无监督学习
- 2.1. 高斯混合模型
- 2.2. 流形学习
- 2.3. 聚类
- 2.4. 双聚类
- 2.5. 分解成分中的信号(矩阵分解问题)
- 2.6. 协方差估计
- 2.7. 经验协方差
- 2.8. 收敛协方差
- 2.9. 稀疏逆协方差
- 2.10. Robust 协方差估计
- 2.11. 新奇和异常值检测
- 2.12. 密度估计
- 2.13. 神经网络模型(无监督)
- 3. 模型选择和评估
- 3.1. 交叉验证:评估估算器的表现
- 3.2. 调整估计器的超参数
- 3.3. 模型评估: 量化预测的质量
- 3.4. 模型持久化
- 3.5. 验证曲线: 绘制分数以评估模型
- 4. 数据集转换
- 4.1. Pipeline(管道)和 FeatureUnion(特征联合): 合并的评估器
- 4.2. 特征提取
- 4.3. 预处理数据
- 4.4. 无监督降维
- 4.5. 随机投影
- 4.6. 内核近似
- 4.7. 成对的矩阵, 类别和核函数
- 4.8. 预测目标 (y) 的转换
- 5. 数据集加载工具
- 6. 大规模计算的策略: 更大量的数据
- 7. 计算性能
- 教程
- 使用 scikit-learn 介绍机器学习
- 关于科学数据处理的统计学习教程
- 机器学习: scikit-learn 中的设置以及预估对象
- 监督学习:从高维观察预测输出变量
- 模型选择:选择估计量及其参数
- 无监督学习: 寻求数据表示
- 把它们放在一起
- 寻求帮助
- 处理文本数据
- 选择正确的评估器(estimator)
- 外部资源,视频和谈话