前言:本节开始介绍书中无监督学习的经典框架,无监督学习的作用有两个:第一个不需要数据集进行分类,而是通过算法找到数据集中每个类别数据本身的特征,并将其进行分类。第二个是对高维数据进行降维,然后使用低维数据表示原始数据,加快数据的运算速度。在无监督学习之中主要使用的几个框架有,K均值算法(K-mean)、主成分分析法(principal component analysis,PCA)、
K均值算法的思想:
第一步:随机选择K个数据作为模型的中心,然后每一次从数据集选择一个样本数据,并计算该样本数据和中心数据的距离,将该样本数据加入到中心距离最近数据。
第二步:等待一轮数据计算之后,得到K个中心簇,计算K个中心簇的每个模型的中心,并且计算K个中心簇中心位置,重新设置中心点。
第三步:在得到K个新的中心簇之后,按照步骤一和步骤二的方法继续计算中心簇,直至所有的的中心簇不在变化,停止算法
K均值算法的实现代码: 最后生成输出的结果表示每一个类别中中心距离距离训练数据的距离大小
# -*- coding: utf-8 -*-
# @Time : 2019/4/8 14:14
# @Author : YYLin
# @Email : 854280599@qq.com
# @File : Nine-Program-Plt-Cluster.py
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn import metrics
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import numpy as np
from scipy.spatial.distance import cdist
digits = load_digits()
X_train, X_test, y_train, y_test = train_test_split(digits.data, digits.target, test_size=0.25, random_state=33)
# 初始化KMeans模型,并设置聚类中心数量为10。
kmeans = KMeans(n_clusters=10)
kmeans.fit(X_train)
# 判断输入图像的类别是否正确
y_pred = kmeans.predict(X_test)
print(metrics.adjusted_rand_score(y_test, y_pred))
K = range(1, 10)
meandistortions = []
for k in K:
kmeans = KMeans(n_clusters=k)
kmeans.fit(X_train)
# 使用cdist计算cluster_centers_和X_train的距离
meandistortions.append(sum(np.min(cdist(X_train, kmeans.cluster_centers_, 'euclidean'), axis=1)) / X_train.shape[0])
# 画图的时候每个点表示每一类数据的相似程度
plt.plot(K, meandistortions, 'bx-')
plt.xlabel('k')
plt.ylabel('Average Dispersion')
plt.title('Selecting k with the Elbow Method')
plt.show()
实验结果: 为什么预测的损失值会随着类别而下降。以后观察一下代码
主成分分析法:一般使用主成分分析法是对数据集中的特征进行降维操作。然后使用降维之后的数据进行训练,目的是使用更少的特征加快训练速度。
实验代码:
# -*- coding: utf-8 -*-
# @Time : 2019/4/9 20:44
# @Author : YYLin
# @Email : 854280599@qq.com
# @File : Ten-PAC-MNIST.py
# 导入pandas用于数据读取和处理。
import pandas as pd
import numpy as np
# 从互联网读入手写体图片识别任务的训练数据,存储在变量digits_train中。
digits_train = pd.read_csv('../Dataset/Tencent-Datasets/MNIST/optdigits.tra',
header=None)
# 从互联网读入手写体图片识别任务的测试数据,存储在变量digits_test中。
digits_test = pd.read_csv('../Dataset/Tencent-Datasets/MNIST/optdigits.tes',
header=None)
# 分割训练数据的特征向量和标记。
X_digits = digits_train[np.arange(64)]
y_digits = digits_train[64]
# 从sklearn.decomposition导入PCA。
from sklearn.decomposition import PCA
# 初始化一个可以将高维度特征向量(64维)压缩至2个维度的PCA。
estimator = PCA(n_components=2)
X_pca = estimator.fit_transform(X_digits)
# 显示10类手写体数字图片经PCA压缩后的2维空间分布。
from matplotlib import pyplot as plt
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.as_matrix() == i]
py = X_pca[:, 1][y_digits.as_matrix() == i]
plt.scatter(px, py, c=colors[i])
plt.legend(np.arange(0, 10).astype(str))
plt.xlabel('First Principal Component')
plt.ylabel('Second Principal Component')
plt.show()
plot_pca_scatter()
# 对训练数据、测试数据进行特征向量(图片像素)与分类目标的分隔。
X_train = digits_train[np.arange(64)]
y_train = digits_train[64]
X_test = digits_test[np.arange(64)]
y_test = digits_test[64]
# 导入基于线性核的支持向量机分类器。
from sklearn.svm import LinearSVC
# 使用默认配置初始化LinearSVC,对原始64维像素特征的训练数据进行建模,并在测试数据上做出预测,存储在y_predict中。
svc = LinearSVC()
svc.fit(X_train, y_train)
y_predict = svc.predict(X_test)
# 使用PCA将原64维的图像数据压缩到20个维度。
estimator = PCA(n_components=20)
# 利用训练特征决定(fit)20个正交维度的方向,并转化(transform)原训练特征。
pca_X_train = estimator.fit_transform(X_train)
# 测试特征也按照上述的20个正交维度方向进行转化(transform)。
pca_X_test = estimator.transform(X_test)
# 使用默认配置初始化LinearSVC,对压缩过后的20维特征的训练数据进行建模,并在测试数据上做出预测,存储在pca_y_predict中。
pca_svc = LinearSVC()
pca_svc.fit(pca_X_train, y_train)
pca_y_predict = pca_svc.predict(pca_X_test)
print("使用主成分分析法提取数据集中特征之后,在使用LinearSVC进行预测的结果:",pca_y_predict)
实验结果: 直观上从实验结果上看,有很多的数据集是重合的,表示分类的结果不是很好。