本帖最后由 cc1989summer 于 2024-8-22 23:08 编辑
《人工智能实践教程——从Python入门到机器学习》的第二部分机器学习(第4章、第5章、第6章),主要介绍机器学习的基本概念,以及常见的机器学习的算法,这部分逐渐进入到 本书的核心内容。
第四章主要对机器学习进行总体概述,比如机器学习的分类。常见的机器学习算法:
看了这么多算法介绍,是不是犹如看天书一般,不知所云?
那我们赶快来到第5章,也就是4个经典算法的介绍:
1. 主成分分析(PCA)
2. K均值(K-Means)
3. K近邻(KNN)
4. 梯度下降法
针对主成分分析(PCA),书本是这么介绍的:
主成分分析(PCA) 是一种统计过程,它使用正交变换将一组可能相关变量的观测值转换为称为主成分的线性不相关变量的值。该技术因其能够降低数据维数同时保留数据集中的大部分变化而得到广泛认可。 PCA的本质在于它能够从数据表中提取本质信息,压缩数据集的大小,简化数据集的描述,同时保留所有变量中最有价值的部分。
PCA 的核心原则涉及识别方向或轴,沿着这些方向或轴,数据的可变性最大化。第一个主成分是使数据方差最大化的方向。第二主成分与第一主成分正交。它确定了后续最高方差的方向,依此类推。此过程允许 PCA 将复杂的数据集减少到较低的维度,从而更容易分析和可视化数据,而不会造成大量信息丢失。
PCA 在简化复杂数据集同时保留基本信息方面的美妙之处是无与伦比的。它使数据科学家和统计学家能够发现数据中隐藏的模式,从而促进更明智的决策。通过关注最重要的组成部分,PCA 有助于突出数据的底层结构,从而更清晰地洞察所分析数据的真实性质。该方法提高了数据分析的效率。它有助于更真实、更深刻地理解数据的内在属性。
看完是不是还是不之所云?这就是本书的特点之一:理论性强于实践性,各部分理论都有涉及,对应的Python算法实例也有,但是对于人工智能、机器学习领域的小白来说,单靠本书的内容是很难以理解并入门的,也就是常说的:字都懂,但连在一起就不懂了。
为了理解主成分分析法,你可能要大量的搜索,阅读实例,一步步加深认识。
下面是我搜集的一些概念及实例,有助于加深读者的理解:
主成分分析(PCA)是一种数据降维技巧,它能将大量相关变量转化为一组很少的不相关变量,这些无关变量称为主成分。例如,使用PCA可将30个相关(很可能冗余)的环境变量转化为5个无关的成分变量,并且尽可能地保留原始数据集的信息。
在基因组学领域,PCA 简化了遗传数据,通常涉及数千个变量。通过降维,PCA 使研究人员能够更有效地识别与疾病相关的遗传标记和模式,从而促进个性化医学和进化研究的突破。
在图像压缩领域,PCA减少了像素数据中的冗余,实现了图像的高效存储和传输,而不会造成质量的显着损失。该应用在卫星图像和远程医疗等带宽有限的领域至关重要,并且必须在压缩与保留图像完整性之间取得平衡。
主成分分析模型,变量(X1到X5)映射为主成分(PC1,PC2),也就是实现了降维。
说这么多,不如举个例子吧!
例子1:评选三好学生,每个学生都有很多特征,比如学习成绩、社会实践、思想道德、体育成绩等。在评比中,有一些特征属于“ 无用特征 ”,比如身高、体重、头发长短等,这些特征在评比中是不会考虑的;而有一些特征属于“ 冗余特征 ”,比如各科成绩、总成绩、GPA,实际上这些有一个即可。
例子2:见下图。原本黑色坐标系中需要记录每个点的横纵坐标(xi, yi),也就是 2 个纬度的数据。
但如果转换坐标系,如绿色坐标系所示,让每个点都位于同一条轴上,这样每个点坐标为(xi’, 0),此时仅用x’坐标表示即可,即 1 个维度。
在这个过程中,原先需要保存的 2 维数据变成了 1 维数据,叫做数据降维 / 数据提炼。而PCA的任务形象理解也就是坐标系的转换。
例子3:首先看一个表格,下表是某些学生的语文,数学,物理,化学成绩统计:
首先,假设这些科目成绩不相关,也就是说某一科目考多少分与其他科目没有关系,那么如何判断三个学生的优秀程度呢?首先我们一眼就能看出来,数学,物理,化学这三门课的成绩构成了这组数据的主成分(很显然,数学作为第一主成分,因为数据成绩拉的最开)。
那么为什么我们能一眼看出来呢?当然是我们的坐标轴选对了!!
下面,我们继续看一个表格,下标是一组学生的数学,物理,化学,语文,历史,英语成绩统计:
那么这个表我们能一眼看出来吗?数据太多了,以至于看起来有些凌乱,无法直接看出这组数据的主成分,因为在坐标系下这组数据分布的很散乱。究其原因,是因为无法拨开遮住肉眼的迷雾,如果把这些数据在相应的空间中表示出来,也许你就能换一个观察角度找出主成分.
PCA其实目的就是寻找这个转换后的坐标系,使数据能尽可能分布在一个或几个坐标轴上,同时尽可能保留原先数据分布的主要信息,使原先高维度的信息,在转换后能用低维度的信息来保存。而新坐标系的坐标轴,称为主成分(Principal components, PC),这也就是PCA的名称来源。
PCA分析的一般步骤如下:
- 数据预处理。PCA根据变量间的相关性来推导结果。用户可以输入原始数据矩阵或者相关系数矩阵到
principal()
和fa()
函数中进行计算,在计算前请确保数据中没有缺失值。
- 判断要选择的主成分数目(这里不涉及因子分析)。
- 选择主成分(这里不涉及旋转)。
- 解释结果。
- 计算主成分得分。
我们跑一段书本上的例程看下:
源数据data.csv,也就是我们降维前的:
32.50234527 31.70700585
53.42680403 68.77759598
61.53035803 62.5623823
47.47563963 71.54663223
59.81320787 87.23092513
55.14218841 78.21151827
52.21179669 79.64197305
39.29956669 59.17148932
48.10504169 75.3312423
52.55001444 71.30087989
45.41973014 55.16567715
54.35163488 82.47884676
44.1640495 62.00892325
58.16847072 75.39287043
56.72720806 81.43619216
48.95588857 60.72360244
44.68719623 82.89250373
60.29732685 97.37989686
45.61864377 48.84715332
38.81681754 56.87721319
66.18981661 83.87856466
65.41605175 118.5912173
47.48120861 57.25181946
41.57564262 51.39174408
51.84518691 75.38065167
59.37082201 74.76556403
57.31000344 95.45505292
63.61556125 95.22936602
46.73761941 79.05240617
50.55676015 83.43207142
52.22399609 63.35879032
35.56783005 41.4128853
42.43647694 76.61734128
58.16454011 96.76956643
57.50444762 74.08413012
45.44053073 66.58814441
61.89622268 77.76848242
33.09383174 50.71958891
36.43600951 62.12457082
37.67565486 60.81024665
44.55560838 52.68298337
43.31828263 58.56982472
50.07314563 82.90598149
43.87061265 61.4247098
62.99748075 115.2441528
32.66904376 45.57058882
40.16689901 54.0840548
53.57507753 87.99445276
33.86421497 52.72549438
64.70713867 93.57611869
38.11982403 80.16627545
44.50253806 65.10171157
40.59953838 65.56230126
41.72067636 65.28088692
51.08863468 73.43464155
55.0780959 71.13972786
41.37772653 79.10282968
62.49469743 86.52053844
49.20388754 84.74269781
41.10268519 59.35885025
41.18201611 61.68403752
50.18638949 69.84760416
52.37844622 86.09829121
50.13548549 59.10883927
33.64470601 69.89968164
39.55790122 44.86249071
56.13038882 85.49806778
57.36205213 95.53668685
60.26921439 70.25193442
35.67809389 52.72173496
31.588117 50.39267014
53.66093226 63.64239878
46.68222865 72.24725107
43.10782022 57.81251298
70.34607562 104.2571016
44.49285588 86.64202032
57.5045333 91.486778
36.93007661 55.23166089
55.80573336 79.55043668
38.95476907 44.84712424
56.9012147 80.20752314
56.86890066 83.14274979
34.3331247 55.72348926
59.04974121 77.63418251
57.78822399 99.05141484
54.28232871 79.12064627
51.0887199 69.58889785
50.28283635 69.51050331
44.21174175 73.68756432
38.00548801 61.36690454
32.94047994 67.17065577
53.69163957 85.66820315
68.76573427 114.8538712
46.2309665 90.12357207
68.31936082 97.91982104
50.03017434 81.53699078
49.23976534 72.11183247
50.03957594 85.23200734
48.14985889 66.22495789
25.12848465 53.45439421
源代码:
PCA-简单例子.py
import numpy as np
import matplotlib.pyplot as plt
# 载入数据
data = np.genfromtxt("data.csv", delimiter=",")
x_data = data[:,0]
y_data = data[:,1]
plt.scatter(x_data,y_data)
plt.show()
print(x_data.shape)
# 数据中心化
def zeroMean(dataMat):
# 按列求平均,即各个特征的平均
meanVal = np.mean(dataMat, axis=0)
newData = dataMat - meanVal
return newData, meanVal
newData,meanVal=zeroMean(data)
# np.cov用于求协方差矩阵,参数rowvar=0说明数据一行代表一个样本
covMat = np.cov(newData, rowvar=0)
# 协方差矩阵
print(covMat)
# np.linalg.eig求矩阵的特征值和特征向量
eigVals, eigVects = np.linalg.eig(np.mat(covMat))
# 特征值
print(eigVals)
# 特征向量
print(eigVects)
# 对特征值从小到大排序
eigValIndice = np.argsort(eigVals)
print(eigValIndice)
top = 1
# 最大的top个特征值的下标
n_eigValIndice = eigValIndice[-1:-(top+1):-1]
print(n_eigValIndice)
# 最大的n个特征值对应的特征向量
n_eigVect = eigVects[:,n_eigValIndice]
print(n_eigVect)
# 低维特征空间的数据
lowDDataMat = newData*n_eigVect
print(lowDDataMat)
# 利用低纬度数据来重构数据
reconMat = (lowDDataMat*n_eigVect.T) + meanVal
print(reconMat)
# 载入数据
data = np.genfromtxt("data.csv", delimiter=",")
x_data = data[:,0]
y_data = data[:,1]
plt.scatter(x_data,y_data)
# 重构的数据
x_data = np.array(reconMat)[:,0]
y_data = np.array(reconMat)[:,1]
plt.scatter(x_data,y_data,c='r')
plt.show()
直接运行代码会提示错误:ModuleNotFoundError: No module named 'numpy'
也就是没有安装numpy组件
什么是 NumPy?
NumPy 是 Python 中科学计算的基本包。它是一个 Python 库,它提供了多维数组对象、各种派生对象(如掩蔽数组和矩阵)以及用于数组快速操作的各种例程,包括数学、逻辑、形状操作、排序、选择、I/O、离散 Fourier 变换、基本线性代数、基本统计操作、随机模拟等。
NumPy 包的核心是 ndarray 对象。这将封装同质数据类型的 n 维数组,在编译的代码中执行许多操作以进行性能操作。NumPy 阵列和标准 Python 序列之间存在几个重要区别:
NumPy 数组在创建时具有固定大小,与 Python 列表不同(可以动态增长)。更改 ndarray 的大小将创建一个新数组并删除原始数组。
NumPy 数组中的元素都需要具有相同的数据类型,因此内存大小相同。例外情况:可以具有 (Python,包括 NumPy) 对象的数组,从而允许不同大小的元素数组。
NumPy 阵列便于对大量数据进行高级数学运算和其他类型的操作。通常,与使用 Python 的内置序列时,此类操作的执行效率更高,代码更少。
越来越多的科学和数学 Python 包正在使用 NumPy 数组;虽然这些通常支持 Python 序列输入,但它们在处理之前将此类输入转换为 NumPy 数组,并且它们经常输出 NumPy 数组。换句话说,为了有效地使用当今许多(甚至可能大多数)基于科学 / 数学 Python 的软件,仅仅知道如何使用 Python 的内置序列类型是不够的 —— 人们还需要知道如何使用 NumPy 数组。
按网上搜索到的教程安装NumPy组件
选择与自己python版本对应的。例如我的是Python3.12,Windows64位,所以下载如下的。
确认安装成功:
然后又提示错误:ModuleNotFoundError: No module named 'matplotlib'
原来还要安装matplotlib模块
Matplotlib 是Python的一个综合性的库,可创建静态的、动画的和可交互的可视化图形图像。
按网上的方法安装matplotlib模块
终于安装完成,用pip list查询已安装模块:
终于运行成功,完成坐标系转换。
本次的学习分享就到这里。