矩阵力量:奇异值分解在机器学习中的应用

需积分: 5 3 下载量 130 浏览量 更新于2024-06-21 1 收藏 792KB PDF 举报
"该资源是Book4的第15章,关于奇异值分解(Singular Value Decomposition, SVD)的讲解,出自《矩阵力量》,旨在从基础数学操作过渡到机器学习的概念。作者提供了代码示例和相关的Python库函数,如matplotlib.pyplot.quiver()用于绘制箭头图,numpy.linspace()用于生成等差序列,numpy.linalg.svd()执行SVD分解,以及numpy.diag()用于处理对角线元素。此外,还提到了SVD的不同类型,包括完全型、经济型、紧凑型和截断型,并介绍了与特征值分解的关系。" 奇异值分解(SVD)是线性代数中的一个核心工具,广泛应用于图像处理、推荐系统、数据分析和机器学习等多个领域。它将任何给定的矩阵\( A \)分解为三个矩阵的乘积: \[ A = U \Sigma V^T \] 其中: - \( U \)是一个\( m \times m \)的正交矩阵,其列向量称为左奇异向量,它们是\( A^TA \)的正交归一化特征向量。 - \( \Sigma \)是一个\( m \times n \)的对角矩阵,对角线上的元素是非负的奇异值\( \sigma_i \),按非降序排列,\( \sigma_1 \geq \sigma_2 \geq \dots \geq \sigma_{\min(m,n)} \)。 - \( V \)是一个\( n \times n \)的正交矩阵,其列向量称为右奇异向量,它们是\( AA^T \)的正交归一化特征向量。 这个分解过程可以有几种形式,如完全型SVD包含所有奇异值,而经济型或紧凑型SVD通常只保留最大的几个奇异值,以降低计算复杂性和存储需求,适用于处理大型稀疏矩阵。 在机器学习中,SVD对于数据降维尤其有用。通过保留最重要的奇异值,我们可以近似原始矩阵,从而减少特征空间的维度,这在主成分分析(PCA)和协同过滤推荐系统中非常常见。SVD还可以用来解决逆问题,当矩阵不可逆时,可以找到一个最佳解。 特征值分解是另一种矩阵分解方法,它将方阵\( A \)分解为\( A = Q \Lambda Q^T \),其中\( Q \)是正交矩阵,\( \Lambda \)是对角矩阵,对角线上的元素是特征值。虽然特征值分解和奇异值分解在形式上不同,但它们之间存在密切关系。对于实对称矩阵,它们的特征值与奇异值相同,而对于非对称矩阵,奇异值分解提供了一个更全面的视角。 在实际应用中,SVD的一个几何解释是它通过两个正交变换(由矩阵\( U \)和\( V \)表示)和一个非负缩放(由矩阵\( \Sigma \)表示)来分解矩阵\( A \)。这种分解方式揭示了矩阵在低维空间中的结构,并且对于数据可视化和压缩很有价值。 理解奇异值分解是深入掌握机器学习算法和数据分析的关键,它为处理高维数据提供了强大的工具,并在实践中具有广泛的实用性。
2023-06-12 上传

import requests import os from bs4 import BeautifulSoup class book_spider(): def __init__(self,root_url): self.root_url=root_url self.book_list=[] #一级页面中获取的数据(二级页面地址)存放于此列表 self.chapter_list=[] #二级页面中获取的数据(三级页面地址和章节名)存放于此列表 def get_url(url): while True: try: res=requests.get(url) if res.status_code==200: res.encoding =res.apparent_encoding print("页面获取成功") return res.text else: print("页面返回异常",res.status_code) except: print("页面获取错误") def get_book_list(self.url): res = self.get_url(url) html = BeautifulSoup(res,"html.parser") a_list = html.find_all("a",{"class":"name"}) for a in a_list: self.book_list.append(a["href"]) self.book_list = [self.root_url+i for i in self.bbok_list] self.book_list.remove('http://10.1.88.252:7000/庆余年') print(book_list) def get_chapter_list(self,url): res = self.get_url(url) html = BeautifulSoup(res,"html.parser") a_list = html.find_all("a",{"class":"chapter"}) for a in a_list: self.chapter_list.append((a["href"],a.text.replace("\n",""))) def get_content(self.chapter): url = self.root_url + chapter[0] print(url) book_name = chapter[0].split("/")[1] print(book_name) if not os.path.exists(book_name): os.mkdir(book_name) res = self.get_url(url) html = BeautifulSoup(res,"html.parser") content = html.find("div",{"id":"content"}).text print(content) path = os.path.join(book_name,chapter[1]) with open(path,"w",encoding="utf8") as f: f.write(content) def main(): self.get_book_list(self.root_url) for book in self.book_list: self.get_chapter_liat(book) for chapter in chapter_list: self.get_content(chapter) book_s = book_spider("http://10.1.88.252:7000") book_s.main()这是一段爬虫代码,找出里面的错误并改正

2023-06-02 上传