小学期07

实验通过PCA降维和KMeans聚类展示了无监督学习在数据集变换和聚类上的应用。PCA保留90%方差后特征数为65,第一主成分占比约51%。原始数据6类活动在KMeans聚类后分散程度不均,最佳聚类K值约为2。KMeans与Agglomerative聚类的ARI值分别为0.4198和0.4936。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实验名称

非监督学习应用练习

实验目的

通过该实验的学习与实践,希望学生可以:

  1. 掌握PCA原理和应用
  2. 掌握聚类方法的原理和应用 3. 掌握可视化的方法

实验背景

无监督学习是当今计算机视觉和机器学习中最困难、最重要的问题之一。许多研究人员认为,从大量未 贴标签的视频中学习可以帮助破解有关智力和学习本质的难题。此外,由于未标注的视频易于以较低的 成本收集,因此无监督学习在许多计算机视觉和机器人应用中具有实际的实用价值。

实验原理

无监督学习常见的两种类型是:数据集变换和聚类。
数据集变换,就是创建数据集新的表示算法,与数据的原始原始表示相比,新的表示可能更容易被人或 其他机器学习算法所理解。
常见的应用有降维,就是对于许多特征表示的高维数据,找到表示该数据的一种新方法,用较少的特征 就可以概括其重要特性。另一个应用就是找到“构成”数据的各个组成部分,比如对文本文档的关键字提取。
聚类就是将数据划分成不同的组,每组包含相似的物项。举个例子,在社交平台上传的照片,网站可能 想要将同一个人的照片分在一组。但网站并不知道每张照片是谁,也不知道你的照片集中出现了多少个 人。明智的做法是提取所有的人脸,并将看起来相似的人脸分在一组。但愿这些人脸对应同一个人,这 样图片的分组也就完成了。

实验步骤

一、环境准备
1、本实验在jupyter notebook进行开发。

二、代码编写
1、导入实验所需要的资源库

#导入实验会用到的模块和函数 
from sklearn.svm import LinearSVC 
from sklearn.preprocessing import StandardScaler 
from sklearn.decomposition import PCA 
from sklearn.cluster import KMeans, AgglomerativeClustering, SpectralClustering 
from sklearn import metrics 
from matplotlib import pyplot as plt 
import os 
import numpy as np 
import pandas as pd 
import seaborn as sns 
from tqdm import tqdm_notebook 
import warnings 
warnings.filterwarnings('ignore')#设置忽略警告 
%matplotlib inline #设置matplotlib的参数值

plt.style.use(['seaborn-darkgrid']) 
plt.rcParams['figure.figsize'] = (12, 9) 
plt.rcParams['font.family'] = 'DejaVu Sans'
RANDOM_STATE = 17
UsageError: unrecognized arguments: #设置matplotlib的参数值

2、加载并读取数据集

PATH_TO_SAMSUNG_DATA = "samsung_HAR"#本地数据的路径 
X_train = np.loadtxt(os.path.join(PATH_TO_SAMSUNG_DATA, "samsung_train.txt"))#加 载训练样本
y_train = np.loadtxt(os.path.join(PATH_TO_SAMSUNG_DATA, "samsung_train_labels.txt")).astype(int)
X_test = np.loadtxt(os.path.join(PATH_TO_SAMSUNG_DATA, "samsung_test.txt"))#加载测 试样本
y_test = np.loadtxt(os.path.join(PATH_TO_SAMSUNG_DATA, "samsung_test_labels.txt")).astype(int)
X_train.shape, X_test.shape, y_train.shape, y_test.shape
((7352, 561), (2947, 561), (7352,), (2947,))

3、下面合并训练和测试样本

X = np.vstack([X_train, X_test])#合并训练和测试样本 
y = np.hstack([y_train, y_test]) 
X.shape, y.shape
((10299, 561), (10299,))

4、查看类别数据中唯一值有哪些,并得到数据集目标类别的数量 n_classes。

n_classes = np.unique(y).size#查看类别数据的为一值,并得到数据目标类别的数量 
np.unique(y)
array([1, 2, 3, 4, 5, 6])

5、根据 数据集说明我们可以得知类别数值表示的含义:

  • 1 – walking
  • 2 – walking upstairs
  • 3 – walking downstairs
  • 4 – sitting
  • 5 – standing
  • 6 – laying down

使用 StandardScaler 完成特征数据的规范化

scaler = StandardScaler()#使用 `StandardScaler` 完成特征数据的规范化 X_scaled = scaler.fit_transform(X) X_scaled.shape
(10299, 561)

6、接下来,我们将应用主成分分析 PCA 降维来缩减特征的数量。
问题:如果使用 PCA 降维,并使得缩减后的数据保留原始数据 90% 的方差,那么得到的特征数量是多 少个?
接下来我们一起使用挑战一开始定义好的 RANDOM_STATE 常量。

pca = PCA(n_components=0.9, random_state = RANDOM_STATE).fit(X_scaled)#使用PCA降维, 缩减后的数据保留原始数据 90% 的方差,得到特征数量 X_pca = pca.transform(X_scaled) X_pca.shape
(10299, 65)

7、问题:降维后的第一主成分涵盖了多大比例的方差?舍入到最接近的百分比。

round(float(pca.explained_variance_ratio_[0] * 100))#降维后的第一主成分涵盖的比例方差
51

8、问题:请绘制前两个主成分特征的二维散点图,并使用数据已知类别进行着色

plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y, s=20, cmap='viridis')#绘制前两个主成分特 征的二维散点图,并使用数据已知类别进行着色

在这里插入图片描述

9、问题:通过肉眼观察,上图大致分为几个聚类簇?不同簇中又包含哪些类型的活动?【B】

  • 【A】 1 个簇:6 种类别的活动。
  • 【B】 2 个簇:walking, walking upstairs, walking downstairs 和 sitting, standing, laying。
  • 【C】 3 个簇:walking 和 walking upstairs, walking downstairs 和 sitting, standing, laying。
  • 【D】 6 个簇。

10、接下来,我们使用 KMeans 聚类方法对 PCA 降维后的数据进行聚类操作。于此同时,这里建议聚 集为 6 类,实际上在正常情况下我们一般并不会知道聚为几类。
问题:建立 KMeans 聚类,设置 n_clusters=n_classes , n_init=100 以及前面提供的 RANDOM_STATE。

kmeans = KMeans(n_clusters=n_classes, n_init=100,random_state=RANDOM_STATE, n_jobs=1)kmeans.fit(X_pca) cluster_labels = kmeans.labels_

11、问题:同样,请使用 PCA 前面 2 个主成分特征绘制二维图像,但这一次使用 KMeans 聚类标签进 行着色。

plt.scatter(X_pca[:, 0], X_pca[:, 1], c=cluster_labels, s=20, cmap='viridis')#使 用PCA前面2个主成分特征绘制二维图像,并使用KMeans聚类标签进行着色

在这里插入图片描述

12、你可以对比查看原始标签分布和 KMeans 聚类标签的分布之间的不同之出。接下来,我们分别查看 每个原始类别都被 KMeans 聚类划分成了那几个簇。

tab = pd.crosstab(y, cluster_labels, margins=True)#查看每个原始类别都被 KMeans 聚类划 分成了那几个簇tab.index = ['walking', 'going up the stairs','going down the stairs', 'sitting', 'standing', 'laying', 'all']tab.columns=['cluster' + str(i + 1) for i in range(6)] + ['all']#表格的列 tab
cluster1cluster2cluster3cluster4cluster5cluster6all
walking903007874101722
going up the stairs124100529621544
going down the stairs3200019689001406
sitting1123591004501777
standing013440005621906
laying5521558003291944
all2470263116492791927134310299

13、表格行名称是原始标签,而列名称则对应了 KMeans 聚类后的簇序号。可以看到,几乎每一个原始 类别都被重新聚为了几个分散簇。
这里,我们使用某一原始类别被 KMeans 聚类后的最大数量簇,除以原始类别总数来表征聚类的分散程 度。得到的数值越小,即代表聚类后的簇越分散。

cluster1cluster2cluster3cluster4cluster5cluster6all
walking903007874101722
going up the stairs124100529621544
going down the stairs3200019689001406
sitting1123591004501777
standing013440005621906
laying5521558003291944
all2470263116492791927134310299

例如,所示的表格。walking 被重新划分为 cluster1, cluster4, cluster5。其中,数量最多的是 cluster1,则分散程度:903/1722=0.524
问题:请计算各原始类别聚类后的分散程度,并按照分散程度由大到小排序。

pd.Series(tab.iloc[:-1, :-1].max(axis=1).values /#计算各原始类别聚类后的分散程度,并按 照分散程度由大到小排序           tab.iloc[:-1, -1].values, index=tab.index[:-1]).sort_values()
walking                  0.524390going down the stairs    0.633001sitting                  0.694992standing                 0.705142laying                   0.801440going up the stairs      0.803756dtype: float64

14、接下来,请使用实验中介绍的方法,通过求解观测数据点与其所在的簇的质心之间的平方距离之和 来选择本次数据的最佳聚类 K 值。
问题:选择 KMeans 聚类合适的聚类 K 值。

#选择KMeans聚类合适的聚类K值 inertia = []#创建一个存放K值的空list for k in tqdm_notebook(range(1, n_classes + 1)):#求解观测数据点与其所在的簇的质心之间的 平方距离之和     kmeans = KMeans(n_clusters=k, n_init=100, random_state=RANDOM_STATE, n_jobs=1).fit(X_pca)    inertia.append(np.sqrt(kmeans.inertia_)) plt.plot(range(1, 7), inertia, marker='s')d = {} for k in range(2, 6):#迭代K值     i = k - 1    d[k] = (inertia[i] - inertia[i + 1]) / (inertia[i - 1] - inertia[i])d
  0%|          | 0/6 [00:00<?, ?it/s]





{2: 0.17344753560094545, 3: 0.41688555755861806, 4: 0.9332195900967523, 5: 0.6297019542006895}

在这里插入图片描述

15、不出意外时,这里的最佳聚类 K 值应该为 2,也就是将数据聚集为 2 类。
问题:接下来,尝试使用 Agglomerative 聚类,并计算二者(KMeans)的兰德指数 ARI 值。 这里使用 n_clusters=n_classes 时得到的 KMeans 聚类结果即可。

#使用 n_clusters=n_classes`时得到的 KMeans 聚类结果 ag = AgglomerativeClustering(n_clusters=n_classes, linkage='ward').fit(X_pca) print('KMeans: ARI =', metrics.adjusted_rand_score(y, cluster_labels))#计算并输出 KMeans聚类的ARI print('Agglomerative CLustering: ARI =',metrics.adjusted_rand_score(y, ag.labels_))
KMeans: ARI = 0.4198070012602345Agglomerative CLustering: ARI = 0.49362763373004886

一般情况下,ARI 值越高代表聚类效果越好。

实验总结

本实验仅对常见的无监督学习算法进行了简单讲述和练习,通过本实验希望我们能够巩固非监督学习的 原理和使用场景。同时虽然整体上分为了聚类和降维两大类,但实际上这两类并非完全正交,很多地方 可以相互转化,还有一些变种的算法既有聚类功能又有降维功能,一些新出现的和尚在开发创造中的无 监督学习算法正在打破聚类和降维的类别划分。

"sgmediation.zip" 是一个包含 UCLA(加利福尼亚大学洛杉矶分校)开发的 sgmediation 插件的压缩包。该插件专为统计分析软件 Stata 设计,用于进行中介效应分析。在社会科学、心理学、市场营销等领域,中介效应分析是一种关键的统计方法,它帮助研究人员探究变量之间的因果关系,尤其是中间变量如何影响因变量与自变量之间的关系。Stata 是一款广泛使用的统计分析软件,具备众多命令和用户编写的程序来拓展其功能,sgmediation 插件便是其中之一。它能让用户在 Stata 中轻松开展中介效应分析,无需编写复杂代码。 下载解压 "sgmediation.zip" 后,需将解压得到的 "sgmediation" 文件移至 Stata 的 ado 目录结构中。ado(ado 目录非“adolescent data organization”缩写,而是 Stata 的自定义命令存放目录)目录是 Stata 存放自定义命令的地方,应将文件放置于 "ado\base\s" 子目录下。这样,Stata 启动时会自动加载该目录下的所有 ado 文件,使 "sgmediation" 命令在 Stata 命令行中可用。 使用 sgmediation 插件的步骤如下:1. 安装插件:将解压后的 "sgmediation" 文件放入 Stata 的 ado 目录。如果 Stata 安装路径是 C:\Program Files\Stata\ado\base,则需将文件复制到 C:\Program Files\Stata\ado\base\s。2. 启动 Stata:打开 Stata,确保软件已更新至最新版本,以便识别新添加的 ado 文件。3. 加载插件:启动 Stata 后,在命令行输入 ado update sgmediation,以确保插件已加载更新至最新版本。4
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值