《Python星球日記》 第36天:線性代數基礎

名人說:路漫漫其修遠兮,吾將上下而求索。—— 屈原《離騷》
創作者:Code_流蘇(CSDN)(一個喜歡古詩詞和編程的Coder😊)
專欄:《Python星球日記》,限時特價訂閱中ing

目錄

    • 一、標量、向量、矩陣的基本概念
      • 1. 標量
      • 2. 向量
      • 3. 矩陣
    • 二、矩陣運算
      • 1. 矩陣加法
      • 2. 矩陣乘法
      • 3. 矩陣轉置
      • 4. 逆矩陣
    • 三、向量空間與線性組合
      • 1. 向量空間的概念
      • 2. 線性組合
      • 3. 線性獨立性
    • 四、NumPy 實踐:矩陣運算
      • 1. NumPy 基礎
      • 2. 使用 NumPy 進行矩陣運算
      • 3. 實戰示例:使用NumPy解線性方程組
    • 總結與展望

👋 專欄介紹: Python星球日記專欄介紹(持續更新ing)
? 上一篇: 《Python星球日記》第35天:全棧開發(綜合項目)

歡迎來到Python星球的第36天!🪐

在前面我們學習了Python基礎、爬蟲、數據可視化,并深入了解了Web開發。今天,我們將探索線性代數基礎,這是數據科學和機器學習領域的重要基石。無論是圖像處理、推薦系統還是神經網絡,線性代數都是不可或缺的數學工具。讓我們一起踏上這段數學之旅!

在這里插入圖片描述

一、標量、向量、矩陣的基本概念

在線性代數中,我們首先需要理解三個基本概念:標量向量矩陣。這些是構建整個線性代數體系的基礎元素。

1. 標量

標量(Scalar)是最簡單的數學對象,它就是一個單獨的數字。

比如:5、-3、0.5、π 等都是標量。在Python中,我們可以用常規的數值類型來表示標量:

# 標量示例
a = 5       # 整數類型標量
b = 3.14    # 浮點類型標量
c = 2 + 3j  # 復數類型標量

2. 向量

向量(Vector)是有序的數字集合,可以看作是一個一維數組。向量可以表示為行向量(橫排)或列向量(豎排)。

在這里插入圖片描述

在Python中,我們通常使用NumPy庫中的arrayvector來表示向量:


import numpy as np# 創建向量
column_vector = np.array([[1], [2], [3]])  # 列向量 - 形狀為(3,1)
row_vector = np.array([4, 5, 6])           # 行向量 - 形狀為(3,)print(column_vector)
print(row_vector)

在這里插入圖片描述

向量可以表示空間中的方向和大小,如位置、速度或力,也可以表示數據集中的特征集合。

3. 矩陣

矩陣(Matrix)是二維數字表格,可以看作是向量的集合。矩陣由行和列組成,通常用大寫字母表示(如A、B等)。
在這里插入圖片描述

矩陣的維度由其行數和列數決定。一個有m行n列的矩陣稱為m×n矩陣。

在Python中,使用NumPy創建矩陣非常簡單:

import numpy as np# 創建2×3矩陣
A = np.array([[1, 2, 3],[4, 5, 6]])print(A)
print(f"矩陣維度: {A.shape}")  # 輸出: (2, 3)

在這里插入圖片描述

矩陣在數據科學機器學習中應用廣泛,例如:

  • 圖像處理中的圖像就是像素矩陣
  • 社交網絡中的連接關系可用鄰接矩陣表示
  • 推薦系統中的用戶-物品評分矩陣

二、矩陣運算

矩陣的基本運算包括加法、乘法、轉置和求逆。讓我們逐一了解這些操作并用NumPy實現。

1. 矩陣加法

矩陣加法的規則很簡單:相同位置的元素相加。兩個矩陣必須具有相同的維度才能相加。

在這里插入圖片描述

NumPy實現矩陣加法非常直觀:

import numpy as np# 創建兩個2×2矩陣
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])# 矩陣加法
C = A + Bprint(f"矩陣A:\n{A}")
print(f"矩陣B:\n{B}")
print(f"A + B =\n{C}")  # 輸出: [[6 8], [10 12]]

在這里插入圖片描述

矩陣加法滿足交換律結合律:A + B = B + A 以及 (A + B) + C = A + (B + C)。

2. 矩陣乘法

矩陣乘法比加法復雜,有兩種主要類型:

  • 點乘(element-wise multiplication):對應位置的元素相乘
  • 矩陣乘法(matrix multiplication):遵循特定的數學規則

矩陣乘法要求第一個矩陣的列數等于第二個矩陣的行數。假設矩陣A的維度是m×n,矩陣B的維度是n×p,那么A×B的結果是一個m×p的矩陣。

在這里插入圖片描述

NumPy中實現矩陣乘法有多種方式:

import numpy as np# 創建矩陣
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])# 點乘(元素相乘)
C_elementwise = A * B
print(f"點乘結果:\n{C_elementwise}")  # 輸出: [[5 12], [21 32]]# 矩陣乘法
C_matmul = np.matmul(A, B)  # 或使用 A @ B (Python 3.5+)
print(f"矩陣乘法結果:\n{C_matmul}")  # 輸出: [[19 22], [43 50]]# 使用 dot 函數
C_dot = A.dot(B)
print(f"使用dot函數的結果:\n{C_dot}")  # 輸出與C_matmul相同

在這里插入圖片描述

矩陣乘法不滿足交換律:通常情況下,A×B ≠ B×A。這是初學者容易犯的一個錯誤。

3. 矩陣轉置

矩陣的轉置是指將矩陣的行和列互換。如果A是一個m×n矩陣,那么它的轉置A^T是一個n×m矩陣。

在這里插入圖片描述

在NumPy中,轉置操作非常簡單:

import numpy as np# 創建2×3矩陣
A = np.array([[1, 2, 3],[4, 5, 6]])# 轉置矩陣
A_T = A.T  # 或使用 np.transpose(A)print(f"原矩陣A:\n{A}")
print(f"轉置后A^T:\n{A_T}")

在這里插入圖片描述

矩陣轉置的一些重要性質:

  • (AT)T = A(轉置的轉置等于原矩陣)
  • (A + B)^T = A^T + B^T(轉置分配律)
  • (AB)^T = B^T A^T(轉置的乘法順序會反轉)

4. 逆矩陣

逆矩陣是線性代數中的一個重要概念。只有方陣(行數等于列數的矩陣)才可能有逆矩陣。

如果矩陣A的逆矩陣存在,記為A^(-1),則有:A × A^(-1) = A^(-1) × A = I,其中I是單位矩陣(對角線上元素為1,其他元素為0)。

在這里插入圖片描述

在NumPy中,可以使用np.linalg.inv()函數求矩陣的逆:

import numpy as np# 創建可逆矩陣
A = np.array([[4, 7], [2, 6]])# 計算逆矩陣
try:A_inv = np.linalg.inv(A)print(f"矩陣A:\n{A}")print(f"A的逆矩陣:\n{A_inv}")# 驗證 A × A^(-1) = II = np.dot(A, A_inv)print(f"A × A^(-1) =\n{np.round(I, decimals=10)}")  # 使用round處理浮點誤差
except np.linalg.LinAlgError:print("矩陣不可逆")

在這里插入圖片描述

需要注意的是,并非所有矩陣都有逆矩陣。如果矩陣的行列式為0,那么它沒有逆矩陣,被稱為奇異矩陣不可逆矩陣

逆矩陣在解線性方程組和機器學習中非常重要,比如在線性回歸中求解系數時就需要用到。

三、向量空間與線性組合

1. 向量空間的概念

向量空間是包含向量的集合,該集合對向量加法和標量乘法運算封閉。簡單來說,向量空間是一組向量,且任意兩個向量的和以及任意向量與標量的積仍然屬于該空間。

在這里插入圖片描述

最常見的向量空間是歐幾里得空間,如二維平面R2或三維空間R3。

2. 線性組合

線性組合是向量空間的一個核心概念。一組向量的線性組合是指將這些向量乘以標量系數后相加

形式上,向量v?, v?, …, v?的線性組合可表示為:c?v? + c?v? + … + c?v?

其中c?, c?, …, c?是標量系數。

通過線性組合,我們可以用少量的基礎向量生成整個向量空間。例如,在二維空間中,任何向量都可以表示為標準基向量i = [1, 0]和j = [0, 1]的線性組合。

import numpy as np
import matplotlib.pyplot as plt# 設置中文字體支持
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False# 標準基向量
e1 = np.array([1, 0])  # i 向量
e2 = np.array([0, 1])  # j 向量# 任意向量作為線性組合
v = np.array([3, 2])   # 3i + 2j# 可視化
plt.figure(figsize=(8, 6))
plt.axhline(y=0, color='k', linestyle='-', alpha=0.3)
plt.axvline(x=0, color='k', linestyle='-', alpha=0.3)
plt.arrow(0, 0, e1[0], e1[1], head_width=0.1, head_length=0.1, fc='blue', ec='blue', label='e1')
plt.arrow(0, 0, e2[0], e2[1], head_width=0.1, head_length=0.1, fc='green', ec='green', label='e2')
plt.arrow(0, 0, v[0], v[1], head_width=0.1, head_length=0.1, fc='red', ec='red', label='v=3e1+2e2')
plt.grid(True, alpha=0.3)
plt.xlim(-0.5, 4)
plt.ylim(-0.5, 3)
plt.legend()
plt.title('向量的線性組合示例')
plt.show()

在這里插入圖片描述

3. 線性獨立性

向量集合{v?, v?, …, v?}如果滿足:c?v? + c?v? + … + c?v? = 0只有當所有c? = c? = … = c? = 0時成立,那么這組向量就是線性獨立的。

換句話說,線性獨立意味著集合中的任何向量都不能表示為其他向量的線性組合。

在這里插入圖片描述

在NumPy中,我們可以用以下方法檢查向量是否線性獨立,通常通過計算矩陣的(rank):

import numpy as np# 創建向量集合
v1 = np.array([1, 0, 0])
v2 = np.array([0, 1, 0])
v3 = np.array([1, 1, 0])  # v3 = v1 + v2,所以是線性相關的# 將向量作為矩陣的行
matrix = np.vstack((v1, v2, v3))# 計算矩陣的秩
rank = np.linalg.matrix_rank(matrix)# 判斷線性獨立性
n_vectors = matrix.shape[0]  # 向量數量
if rank == n_vectors:print("這些向量是線性獨立的")
else:print("這些向量是線性相關的")print(f"秩 = {rank},向量數量 = {n_vectors}")

在這里插入圖片描述

線性獨立性的概念在許多領域都很重要:

  • 在機器學習中,特征選擇就是要找到線性獨立的特征集合
  • 主成分分析(PCA)中,我們尋找數據的主成分,這些主成分是線性獨立的
  • 在解線性方程組時,判斷方程組是否有唯一解

四、NumPy 實踐:矩陣運算

現在讓我們通過一系列實際的Python代碼示例,鞏固對線性代數的理解。

1. NumPy 基礎

NumPy是Python中進行科學計算的基礎庫,提供了強大的多維數組對象和處理這些數組的工具。

import numpy as np# 創建數組
a = np.array([1, 2, 3])                # 一維數組
b = np.array([[1, 2, 3], [4, 5, 6]])   # 二維數組# 一些基本操作
print(f"數組b的形狀: {b.shape}")        # (2, 3)
print(f"數組b的維度: {b.ndim}")         # 2
print(f"數組b的元素類型: {b.dtype}")    # int64
print(f"數組b的元素總數: {b.size}")     # 6# 創建特殊矩陣
eye = np.eye(3)                        # 3×3單位矩陣
zeros = np.zeros((2, 3))               # 2×3全零矩陣
ones = np.ones((2, 2))                 # 2×2全一矩陣
random_matrix = np.random.rand(2, 3)    # 2×3隨機矩陣print(f"單位矩陣:\n{eye}")

在這里插入圖片描述

2. 使用 NumPy 進行矩陣運算

讓我們實現前面討論過的矩陣運算:

import numpy as np# 創建樣例矩陣
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])# 1. 矩陣加法
C_add = A + B
print(f"矩陣加法 A + B =\n{C_add}")# 2. 矩陣乘法
C_mul = A @ B  # 或 np.matmul(A, B) 或 A.dot(B)
print(f"矩陣乘法 A × B =\n{C_mul}")# 3. 矩陣轉置
A_T = A.T
print(f"矩陣A的轉置 =\n{A_T}")# 4. 矩陣的逆(如果存在)
try:A_inv = np.linalg.inv(A)print(f"矩陣A的逆 =\n{A_inv}")# 驗證 A × A^(-1) = II_check = A @ A_invprint(f"A × A^(-1) =\n{np.round(I_check, decimals=10)}")
except np.linalg.LinAlgError as e:print(f"錯誤: {e}")# 5. 求矩陣的行列式
det_A = np.linalg.det(A)
print(f"矩陣A的行列式 = {det_A}")# 6. 求矩陣的特征值和特征向量
eigenvalues, eigenvectors = np.linalg.eig(A)
print(f"矩陣A的特征值 = {eigenvalues}")
print(f"矩陣A的特征向量 =\n{eigenvectors}")

在這里插入圖片描述

3. 實戰示例:使用NumPy解線性方程組

線性代數的一個重要應用是解線性方程組。例如,解方程組:

  • 2x + y = 8
  • 3x + 5y = 19

可以表示為矩陣形式:AX = B,其中A是系數矩陣,X是未知數向量,B是常數向量。

import numpy as np# 定義系數矩陣A和常數向量B
A = np.array([[2, 1], [3, 5]])
B = np.array([8, 19])# 方法1:使用矩陣的逆
# X = A^(-1) × B
X1 = np.linalg.inv(A).dot(B)
print(f"使用矩陣的逆解得: x = {X1[0]}, y = {X1[1]}")# 方法2:使用numpy的線性代數解法函數
X2 = np.linalg.solve(A, B)
print(f"使用linalg.solve解得: x = {X2[0]}, y = {X2[1]}")# 驗證解是否正確
verification = A @ X2
print(f"驗證: A × X = {verification},應等于B = {B}")

在這里插入圖片描述

這個例子展示了如何將實際問題轉化為線性代數問題并使用NumPy求解。這種方法在數據科學機器學習科學計算中應用廣泛。

總結與展望

今天,我們學習了線性代數的基礎知識,包括標量、向量和矩陣的概念,矩陣的基本運算(加法、乘法、轉置和求逆),以及向量空間和線性組合的概念。我們還通過NumPy實現了這些操作,并展示了如何應用線性代數解決實際問題。

線性代數是機器學習數據科學的重要基礎。在未來的學習中,你會發現這些知識對于理解以下內容至關重要:

  • 機器學習算法,如線性回歸、主成分分析(PCA)和支持向量機(SVM)
  • 深度學習中的矩陣運算和梯度下降
  • 計算機圖形學中的變換矩陣
  • 優化問題的數學建模和求解

下一步,你可以深入學習更多線性代數概念,以及它們在實際應用中的角色。

今天的知識是我們探索數據科學人工智能宇宙的第一步,未來我們將繼續這段Python星球探索之旅!


通過這篇文章,你已經掌握了線性代數的基礎知識和NumPy的矩陣操作。試著自己實現一些示例,加深對概念的理解。線性代數不僅僅是抽象的數學,它是解決現實問題的強大工具!

創作者:Code_流蘇(CSDN)(一個喜歡古詩詞和編程的Coder😊)
如果你對今天的內容有任何問題,或者想分享你的學習心得,歡迎在評論區留言討論!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/79877.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/79877.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/79877.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用VMware Workstation pro 17.5.1在Windows上安裝Ubuntu 24.04.2的 詳細步驟

一、準備工作 1. 下載Ubuntu 24.04.2 ISO鏡像 官方下載地址:Ubuntu 24.04.2 (Noble Numbat) 選擇 ubuntu-24.04.2-desktop-amd64.iso(桌面版)或 ubuntu-24.04.2-live-server-amd64.iso(服務器版)。 2. 確認系統要求…

ios systeam introduction

Here is an in-depth look at Apple’s iOS, from its inception to its latest major release, covering architecture, core components, security, app lifecycle, development tools, and the headline features of iOS 18. iOS began life as “iPhone OS,” unveiled alo…

優化04-選擇率和直方圖

選擇率 在Oracle數據庫中,選擇率(Selectivity) 是優化器(CBO,基于成本的優化器)用來評估SQL語句中某個條件(如WHERE子句)過濾數據的比例的關鍵指標。它直接影響優化器選擇執行計劃的…

python實戰:通過輸入文字匹配在docx文檔中的具體位置

在指定的docx文檔中,輸入一串文字來查看該文字在文檔中的具體位置;方便后續處理(如替換文字,高亮顯示等等操作) from docx import Documentdef find_text_in_docx(file_path, search_text):# 讀取docx文件doc = Document(file_path)# 遍歷段落,查找匹配的文本for i

Flutter——數據庫Drift開發詳細教程(二)

目錄 1.核心API1.1查詢數據列表分頁1.2 列表排序1.3推遲獲取與觀察 1.核心API 1.1查詢數據列表分頁 限制返回的結果數量limit&#xff0c;從某一位置開始查詢offset ///limit10, offset10 Future<List<TodoItem>> limitTodos(int limit, {int? offset}) {return …

mux-vlan基礎配置

1.top配置 2.各個交換機設置 sw3交換機的 sysname swb # undo info-center enable # vlan batch 10 20 30 100 # vlan 10description financial vlan vlan 20description marketing vlan vlan 30description client vlan vlan 100description principal vlanmux-vlansubordi…

SAM詳解2(初級應用)

SAM SAM5. 初級應用5.1 靜態本質不同子串個數5.2 字符串匹配5.3 關于子串出現次數5.4 動態添加時本質不同子串個數SAM 5. 初級應用 記 l o n g e s t ( x ) longest(x) longest(x) 為點 x x x 代表子串集合中最長串的長度。記 s h o r t e s t ( x ) shortest(x) shortest(…

【日擼 Java 三百行】Day 4(條件語句實戰——閏年問題)

目錄 Day 4&#xff1a;條件語句實戰——閏年問題 一、基礎知識及代碼思路 二、代碼及測試 小結 Day 4&#xff1a;條件語句實戰——閏年問題 Task&#xff1a; if 語句的嵌套.基本規律自行百度.布爾類型. 一、基礎知識及代碼思路 1. 什么是閏年&#xff1f; 閏年是歷法中…

MySQL 中 EXISTS (SELECT 1 FROM ...) 的用法詳解

EXISTS (SELECT 1 FROM ...) 是 MySQL 中用于存在性檢查的核心語法&#xff0c;其核心邏輯是判斷子查詢是否返回至少一行數據。以下從作用原理、使用場景、性能優化等方面展開解析&#xff0c;并結合具體示例說明。 1. 基本語法與作用原理 語法結構&#xff1a; SELECT 列名 F…

阿里云服務器防御是怎么做出來的?服務器攻擊方式有幾種?

阿里云服務器防御是怎么做出來的?服務器攻擊方式有幾種&#xff1f; 服務器防御是一個多層次、多維度的體系&#xff0c;通常包括以下核心措施&#xff1a; 1. 網絡層防御 防火墻&#xff08;Firewall&#xff09;&#xff1a;過濾非法流量&#xff0c;僅允許授權通信&#xf…

ElasticSearch深入解析(八):索引設置、索引別名、索引模板

一、索引的動態設置、靜態設置 索引設置包含兩部分核心內容&#xff1a; 靜態設置(static index settings)&#xff0c;只允許在創建索引時或者針對已關閉的索引進行設置。指動態設置(dynamic index settings)&#xff0c;可以借助更新設置(update settings)的方式進行動態更新…

Prometheus實戰教程:k8s平臺手動部署Grafana

以下是一個可用于生產環境的 Kubernetes 部署 Grafana 的 YAML 文件。該配置包括 Deployment、Service、ConfigMap 和 PersistentVolumeClaim&#xff0c;確保 Grafana 的高可用性和數據持久化。 Grafana 生產部署 YAML 文件 ☆實操示例 cat grafana-deployment.yaml 登錄后復制…

VSTO外接程序與VBA的聯動嘗試

文章目錄 前言一、第一坑&#xff1a;安裝offic2007后excel加載項找不到了二、示例1 通過Ribbon XML自定義Excel主菜單并添加新項二、示例1 總結三、示例2 創建VSTO外接程序三、示例2 總結四、示例 3 C# VSTO外接程序示例四、示例 3 總結五、實現C# 的VSTO調用VBA函數(xlam)六、…

DeepSeek驅動的金市情緒量化:NLP解析貿易政策文本的情緒傳導路徑

【AI觀察】政策信號與市場情緒的量化關聯 基于自然語言處理技術對全球財經文本的情緒分析顯示&#xff0c;4月30日亞盤時段現貨黃金價格波動率較前日下降12.3%&#xff0c;與技術面修正指標呈現強相關性。特政府最新關稅政策調整引發市場風險偏好指數&#xff08;RPI&#xff…

期末代碼Python

以下是 學生信息管理系統 的簡化版代碼示例&#xff08;控制臺版本&#xff0c;使用文件存儲數據&#xff09;&#xff0c;包含核心功能&#xff1a; 1. 定義學生類 class Student: def __init__(self, sid, name, score): self.sid sid # 學號 self.name name # 姓名 self.s…

zotero pdf中英翻譯插件使用

最近發現一個pdf中英翻譯的神器zotero-pdf2zh&#xff0c;按照官方安裝教程走一遍的時候&#xff0c;發現一些流程不清楚的問題&#xff0c; 此文就是整理一些安裝需要的文件以及遇到的問題&#xff1a; 相關文件下載地址 Zotero 是一款免費的、開源的文獻管理工具&#xff0…

本地MySQL連接hive

1、首先需要修改MySQL的配置&#xff0c;允許遠程連接&#xff1a; # 在本地MySQL服務器上執行 sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf找到 bind-address 行&#xff0c;將其修改為&#xff1a; bind-address 0.0.0.02、在本地MySQL中創建用戶并授權&#xff08;注意…

Nginx核心功能2

一&#xff1a;正向代理 正向代理&#xff08;Forward Proxy)是一種位于客戶端和原始服務器之間的代理服務器&#xff0c;其主要作用是將客戶端的請求轉發給目標服務器&#xff0c;并將響應返回給客戶端Nginx的正向代理充當客戶端的“中間人”&#xff0c;代表用戶訪問外部資源…

高定電視,一場關于生活方式的覺醒

需要有自己的工作室&#xff0c;雇用3個以上專職模特&#xff0c;至少15名全職員工和20名技術工匠?&#xff1b; 每年都要參加巴黎高級時裝周&#xff0c;展示至少50款原創設計&#xff1b; 使用的面料必須高質量、昂貴且不同尋常&#xff0c;設計上注重細節和個性&#x…

用PyTorch搭建卷積神經網絡實現MNIST手寫數字識別

用PyTorch搭建卷積神經網絡實現MNIST手寫數字識別 在深度學習領域&#xff0c;卷積神經網絡&#xff08;Convolutional Neural Network&#xff0c;簡稱CNN&#xff09;是處理圖像數據的強大工具。它通過卷積層、池化層和全連接層等組件&#xff0c;自動提取圖像特征&#xff…