.Kmeans无监督学习主成分分析(PCA)

简介: .Kmeans无监督学习主成分分析(PCA)

1.Kmeans无监督学习主成分分析(PCA)


PCA 将允许将高维空间缩小为低维空间,同时保留尽可能多的方差。它是一种无监督的方法,因为它不需要目标类来执行其转换;它只依赖于学习属性的值。这对于两个主要目的非常有用:

  • 可视化:例如,将高维空间投影到二维,将允许我们将我们的实例映射到二维图形。使用这些图形来可视化,我们可以获得有关实例分布的见解,并查看不同类的可分离实例。在本节中,我们将使用 PCA 转换和可视化数据集。
  • 特征选择:由于 PCA 可以将实例从高维度转换为低维度,我们可以使用此方法来解决维度诅咒。我们可以使用 PCA 转换实例,然后在新特征空间中应用学习算法,而不是学习原始特征集。


2.导入数据集


数据集为8*8像素手写数字数据集

from sklearn.datasets import load_digits
digits = load_digits()
X_digits, y_digits = digits.data, digits.target
print(digits.keys())
dict_keys(['data', 'target', 'target_names', 'images', 'DESCR'])

请点此处查看本环境基本用法.  

Please click here for more detailed instructions.

import matplotlib.pyplot as plt
n_row, n_col = 2, 5
def print_digits(images, y, max_n=10):
    # set up the figure size in inches
    fig = plt.figure(figsize=(2. * n_col, 2.26 * n_row))
    i=0
    while i < max_n and i < images.shape[0]:
        p = fig.add_subplot(n_row, n_col, i + 1, xticks=[],
              yticks=[])
        p.imshow(images[i], cmap=plt.cm.bone, 
              interpolation='nearest')
        # label the image with the target value
        p.text(0, -1, str(y[i]))
        i = i + 1
print_digits(digits.images, digits.target, max_n=10)


3.数字着色


def plot_pca_scatter():
    colors = ['black', 'blue', 'purple', 'yellow', 'white', 
          'red', 'lime', 'cyan', 'orange', 'gray']
    for i in range(len(colors)):
        px = X_pca[:, 0][y_digits == i]
        py = X_pca[:, 1][y_digits == i]
        plt.scatter(px, py, c=colors[i])
    plt.legend(digits.target_names)
    plt.xlabel('First Principal Component')
    plt.ylabel('Second Principal Component')

在 scikit-learn 中,PCA 被实现为变换器对象,通过fit方法学习 n 个成分,并且可以用于新数据来将其投影到这些成分上。在 scikit-learn 中,我们有各种实现不同类型的 PCA 分解的类,例如PCA,ProbabilisticPCA,RandomizedPCA和KernelPCA。如果您需要每个的详细说明,请参阅 scikit-learn 文档。

from sklearn.decomposition import PCA
estimator = PCA(n_components=10)
X_pca = estimator.fit_transform(X_digits)
plot_pca_scatter()

image.png

  • 我们可以一眼就看到对应于 10 位数的 10 个不同类别。我们看到,对于大多数类,它们的实例根据其目标类清楚地分组,并且簇相对不同。例外是对应于数字 5 的类,其中实例非常稀疏地分布在平面上与其他类重叠。
  • 在另一个极端,对应于数字 0 的类是最可分离的簇。直观地说,这个类可能是最容易与其他类分开的类;也就是说,如果我们训练一个分类器,它应该是具有最佳评估数字的类。
  • 此外,对于拓扑分布,我们可以预测相邻类对应于相似的数字,这意味着它们将是最难分离的。例如,对应于数字 9 和 3 的簇看起来是相邻的(由于它们的图形表示是相似的,因此可以预计),因此,从 3 分离 9 可能比从 3 分离 4 更难,它位于左侧,远离这些簇。
def print_pca_components(images, n_col, n_row):
    plt.figure(figsize=(2 * n_col, 2.26 * n_row))
    for i, comp in enumerate(images):
        plt.subplot(n_row, n_col, i + 1)
        plt.imshow(comp.reshape((8, 8)), 
              interpolation='nearest')
        plt.text(0, -1, str(i + 1) + '-component')
        plt.xticks(())
        plt.yticks(())
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_digits
from sklearn.preprocessing import scale
digits = load_digits()
data = scale(digits.data)
def print_digits(images,y,max_n=10):
    # set up the figure size in inches
    fig = plt.figure(figsize=(12, 12))
    fig.subplots_adjust(left=0, right=1, bottom=0, top=1,
          hspace=0.05, wspace=0.05)
    i = 0
    while i <max_n and i <images.shape[0]:
        # plot the images in a matrix of 20x20
        p = fig.add_subplot(20, 20, i + 1, xticks=[],
              yticks=[])
        p.imshow(images[i], cmap=plt.cm.bone)
        # label the image with the target value
        p.text(0, 14, str(y[i]))
        i = i + 1
print_digits(digits.images, digits.target, max_n=10)

image.png

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test, images_train, images_test = train_test_split(
        data, digits.target, digits.images,  test_size=0.25, 
          random_state=42)
n_samples, n_features = X_train.shape
n_digits = len(np.unique(y_train))
labels = y_train


4.训练并预测


from sklearn import cluster
 clf = cluster.KMeans(init='k-means++',  n_clusters=10, random_state=42)
 clf.fit(X_train)
KMeans(algorithm='auto', copy_x=True, init='k-means++', max_iter=300,
       n_clusters=10, n_init=10, n_jobs=None, precompute_distances='auto',
       random_state=42, tol=0.0001, verbose=0)
print_digits(images_train, clf.labels_, max_n=10)

image.png

>>> y_pred=clf.predict(X_test)
def print_cluster(images, y_pred, cluster_number):
     images = images[y_pred==cluster_number]
     y_pred = y_pred[y_pred==cluster_number]
     print_digits(images, y_pred,max_n=10)
for i in range(10):
     print_cluster(images_test, y_pred, i)


image.pngimage.pngimage.pngimage.png



from sklearn import metrics
print("Adjusted rand score:  {:.2}".format(metrics.adjusted_rand_score(y_test, y_pred)))
Adjusted rand score:  0.4
print(metrics.confusion_matrix(y_test, y_pred))
[[43  0  0  0  0  0  0  0  0  0]
 [ 0  0  0  0  0 20  0  0  7 10]
 [ 0  0  0 21  0  6  1  0  9  1]
 [ 0  0  4  2  0  1 38  0  1  0]
 [ 0 24  4  0  0  1  0  1  0 25]
 [ 0  2  6 22  0  4 25  0  0  0]
 [ 1 44  0  0  0  0  0  0  0  0]
 [ 0  0 34  2  0  0  0  5  0  0]
 [ 0  0  1  3  0 24 10  0  0  0]
 [ 0  0  4  0  0  0 41  0  0  3]]


目录
相关文章
|
3月前
|
算法
KNN分类算法
KNN分类算法
107 47
|
3天前
|
机器学习/深度学习
数据分享|R语言逻辑回归、线性判别分析LDA、GAM、MARS、KNN、QDA、决策树、随机森林、SVM分类葡萄酒交叉验证ROC(下)
数据分享|R语言逻辑回归、线性判别分析LDA、GAM、MARS、KNN、QDA、决策树、随机森林、SVM分类葡萄酒交叉验证ROC
66 7
|
3天前
|
机器学习/深度学习 数据可视化 计算机视觉
数据分享|R语言逻辑回归、线性判别分析LDA、GAM、MARS、KNN、QDA、决策树、随机森林、SVM分类葡萄酒交叉验证ROC(上)
数据分享|R语言逻辑回归、线性判别分析LDA、GAM、MARS、KNN、QDA、决策树、随机森林、SVM分类葡萄酒交叉验证ROC
16 4
|
机器学习/深度学习 Python
【统计学习方法】K近邻对鸢尾花(iris)数据集进行多分类
【统计学习方法】K近邻对鸢尾花(iris)数据集进行多分类
146 0
|
11月前
|
数据可视化 算法
13张动图快速理解马尔科夫链、PCA、贝叶斯!
本文用可视化的方式来解释抽象的理论概念,使这些抽象概念变得生动而立体!
|
机器学习/深度学习 传感器 人工智能
【聚类】基于PCA+kmeans实现数据聚类附matlab代码
【聚类】基于PCA+kmeans实现数据聚类附matlab代码
|
机器学习/深度学习 Python
【统计学习方法】感知机对鸢尾花(iris)数据集进行二分类
【统计学习方法】感知机对鸢尾花(iris)数据集进行二分类
538 0
【统计学习方法】感知机对鸢尾花(iris)数据集进行二分类
|
机器学习/深度学习 算法 搜索推荐
|
机器学习/深度学习 数据可视化
机器学习(三)降维之PCA及鸢尾花降维
用的一种降维方法,通常用于高维数据集的探索与可视化,还可以用作数据压缩和预处理等。 PCA可以把具有相关性的高维变量合成为线性无关的低维变
382 0
机器学习(三)降维之PCA及鸢尾花降维

相关实验场景

更多