持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的9天,点击查看活动详情
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]]