xinmeng_wit 发表于 2024-8-4 20:51

《人工智能实践教程》1、主成分分析(PCA)

<p><strong>一、本书介绍</strong></p>

<p>按照传统惯例,在正式开始之前还是先介绍以下这本书,本书的名称是《人工智能实践教程&mdash;&mdash;从Python入门到机器学习》,作者是邵一川,本书没有对作者进行介绍,网上查到的信息是沈阳大学的副教授。</p>

<p>本书总共有11章,主要分为3大块,第一部分是Python编程;第二部分是机器学习;第三部分是神经网络。</p>

<p>从内容可以看出来,本书层次感非常强,由浅入深,循序渐进。</p>

<p>另外,本书还配有电子档的资料,所有资料都托管在gitee和github。</p>

<p>地址为:<a href="https://gitee.com/shao1chuan/pythonbook" target="_blank">https://gitee.com/shao1chuan/pythonbook</a></p>

<p>和<a href="https://gitee.com/shao1chuan/pythonbook" target="_blank">https://github.com/shao1chuan/pythonbook</a></p>

<p>本书是黑白印刷,导致书中的很多彩色的图表没法看,纸张也不厚实,有点盗版的感觉,感觉有点低成本的意思。</p>

<p>希望在内容上能够更加充实。</p>

<div style="text-align: left;"></div>

<p><strong>二、主成分分析简介</strong></p>

<p>主成分分析(Principal Component Analysis, PCA)是机器学习的经典算法之一,是一种统计方法。</p>

<p>通过正交变换将一组可能存在相关性的变量转换为一组互不相关的变量,转换后的这组变量称为主成分。</p>

<p>PCA的原理是将原始变量转换后重新组合成互不相关的新变量,使少数的新变量就能反映原始变量的信息。</p>

<p>例如,假如F1是第一个线性组合,方差Var(F1)越大,F1反映的信息越多。因此,在所有线性组合中,选取方差最大的线性组合F1作为第一个主成分。</p>

<p>如果第一个主成分不足以反映原来P个指标的信息,再考虑选取F2,即第二个线性组合,为了有效地反映原来P个指标的信息,F1中的信息无须出现在F2中,用数学语言表达为</p>

<p>Cov(F1,F2)=0,F2称为第二个主成分,以此类推,可以选取第三个,第四个,...第k个主成分。</p>

<p>&nbsp;</p>

<p>PCA的特点:</p>

<ul>
        <li>是一种非监督学习算法;</li>
        <li>主要用于数据的降维;</li>
        <li>通过降维,可以发现更易于理解的特征;</li>
        <li>可用于可视化及数据去噪。</li>
</ul>

<p>PCA的主要步骤如下:</p>

<div style="text-align: left;"></div>

<p><strong>三、PCA示例</strong></p>

<pre>
<code class="language-python">import numpy as np
import matplotlib.pyplot as plt
# 载入数据
data = np.genfromtxt("/home/xp/work/ML_shao1chuan/PCA/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.asmatrix(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("/home/xp/work/ML_shao1chuan/PCA/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()

</code></pre>

<p>运行结果:</p>

<div style="text-align: left;"></div>

<p>上图红色部分就是利用低维数据重构的数据。</p>

<p>&nbsp;</p>

hellokitty_bean 发表于 2024-8-5 14:42

<p>Wit,又开始了新的一本书呀。。。。。。前面的深度学习部分,还没结束吧?<img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/loveliness.gif" width="48" /></p>

xinmeng_wit 发表于 2024-8-5 18:25

hellokitty_bean 发表于 2024-8-5 14:42
Wit,又开始了新的一本书呀。。。。。。前面的深度学习部分,还没结束吧?

<p>感觉被盯上了,哈哈</p>

hellokitty_bean 发表于 2024-8-6 18:02

xinmeng_wit 发表于 2024-8-5 18:25
感觉被盯上了,哈哈

<p>哎呀,也不是,感觉兄台的BP写得不错,然后后面应该有继续呀。。。</p>

<p>&nbsp;</p>

hellokitty_bean 发表于 2024-8-6 18:03

xinmeng_wit 发表于 2024-8-5 18:25
感觉被盯上了,哈哈

<p>就是感觉停更了得感觉咯<img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/loveliness.gif" width="48" />,后面的CNN、RNN、LSTM、GAN应该接踵而来才对</p>

<p>&nbsp;</p>

xinmeng_wit 发表于 2024-8-6 18:55

hellokitty_bean 发表于 2024-8-6 18:03
就是感觉停更了得感觉咯,后面的CNN、RNN、LSTM、GAN应该接踵而来才对

&nbsp;

<p>每章都写帖子的话,时间来不及,截止时间快到了,按照原计划,只有一篇目标检测了。</p>
<p>先完成论坛的任务,后面再慢慢补充中间的内容</p>

hellokitty_bean 发表于 2024-8-7 08:29

<p>静待wit不停更新。。。。。。。。。。。。。<img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/loveliness.gif" width="48" /></p>
页: [1]
查看完整版本: 《人工智能实践教程》1、主成分分析(PCA)