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()
- 我们可以一眼就看到对应于 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)
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)
>>> 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)
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]]