人工智能数据基础之线性代数入门-学习篇

目录

  1. 基本概念
  2. 矩阵基础运算
  3. 解方程组
  4. 特征向量与特征值

一、基本概念

标量定义:

标量是只有大小没有方向的量。在数学中,它通常是一个实数或复数。

通俗理解:

想象你有5个苹果。这个数字"5"就是一个标量。它只告诉你有多少苹果,但不告诉你这些苹果放在哪里
向量定义:

向量是具有大小和方向的量。在数学中,它通常表示为一个有序的数字列表,如二维或三维空间中的点

通俗理解:想象你在一个大房间里,你想告诉你的朋友一个宝藏的位置。你可以说:"从门口开始,走5步向前,然后走3步向右。这个"5步向前3步向右"就像一个向量,它有方向和距离
矩阵定义:

矩阵是一个二维数组,其中的每个元素都是一个标量。它可以表示线性变换

通俗理解:想象你有一个秘密地图,上面有很多宝藏的位置。为了整齐地记录所有的位置,你决定用一个网格或表格来写下所有的"向前和向右"的步数。这个表格就像一个矩阵,它帮助你整齐地记录信息
张量定义:

张量是一个可以在多个方向上有分量的数学对象。标量是零阶张量,向量是一阶张量,矩阵是二阶张量。更高阶的张量可以看作是多维数组

通俗理解:想象你不仅在一个房间里找宝藏,而且在一个大楼里。这时,你不仅要告诉你的朋友向前走多少步、向右走多少步,还要告诉他上或下走多少楼梯。如果你用一个更大的表格来记录这些信息,其中包括向前、向右和上下的步数,这就像一个张量。张量就是一个更高级的表格,可以记录更多的信息

二、概念 Python案例实战
  1. 创建向量、矩阵、张量
python 复制代码
import numpy as np
#创建向量(一维)
vactor = np.array([1,2,3,4,5])
#np.linalg.norm()计算的是该向量的范数  计算向量的长度或者矩阵的某种"大小"
vactor_norm = np.linalg.norm(vactor)
print(vactor_norm)
print(vactor)

#创建矩阵(二维)
matrix = np.array([[1,2,3],
                   [4,5,6],
                   [7,8,9]])
matrix_norm = np.linalg.norm(matrix)
print(matrix_norm)
print(matrix)

#创建张量(三维)
#如果读取一张图片,如果该图片有rgb三个通道,就会属于张量,如果就一个通道(黑白灰度图像),,可以转为矩阵格式
tensor = np.array([[[1,2],[3,4]],
                  [[5,6],[7,8]],
                  [[9,10],[12,13]]
])
tensor_norm = np.linalg.norm(tensor)
print(tensor_norm)
print(tensor)
  1. 将Numpy矩阵保存成本地图像
python 复制代码
#将矩阵保存成本地图像
#创建一个大小为224x224的二维矩阵,值为0-255之间
two_d_matrix = np.random.randint(0,256,(224,224),dtype=np.uint8)
#创建一个大小为3x224x224的三维矩阵,值为0-255之间
three_d_matrix = np.random.randint(0,256,(3,224,224),dtype=np.uint8)
#在OpenCV中,图像的通道顺序为高x 宽x 通道数
three_d_matrix_transposed = three_d_matrix.transpose(1,2,0)
#将画面显示出来
cv2.imshow("two_d_matrix",two_d_matrix)
cv2.imshow("three_d_matrix",three_d_matrix_transposed)
cv2.waitKey(0)

#使用OpenCV将图片保存在本地
cv2.imwrite("three_d_matrix.png",three_d_matrix_transposed)
cv2.imwrite("two_d_matrix.png",two_d_matrix)

运行如图:

##三、矩阵基础运算

  1. 标量与矩阵的乘法

    案例实战,使用标量和矩阵相乘来调整画面的对比度实现图像增强:
python 复制代码
import cv2
import numpy as np
#读取图像
image= cv2.imread("./11.jpg")
#增加对比度
increased_contrast = cv2.convertScaleAbs(image,alpha=1.5)
#减少对比度
decreased_contrast = cv2.convertScaleAbs(image,alpha=0.5)
#将图像进行横向拼接
combined_image = cv2.hconcat([image,increased_contrast,decreased_contrast])
#显示图片
cv2.imshow("Originaal - increased_contrast - decreased_contrast",combined_image)
cv2.waitKey(0)

结果为:

案例实战,使用python代码实现以下计算:

python 复制代码
#定义矩阵A和B
A = np.array([[1,2],
              [3,4]])
B = np.array([[5,6],
              [7,8]])
#定义标量C
C = 3
#标量与矩阵的乘法
scalar_matrix_multiplication = C*A
#矩阵的加法
matrix_addition = A+B
print(scalar_matrix_multiplication,'\n',matrix_addition)

三、解方程组

使用python解以下方程组:

python 复制代码
import numpy as np

#创建系数矩阵
A = np.array([[1,2,3],
              [1,6,7],
              [1,10,6]])
#创建常数向量
B = np.array([5,9,8])
#解方程
x = np.linalg.solve(A,B)
#打印结果
print("解:",x)

四、特征向量与特征值

特征值定义:

与特征向量相对应的标量λ称为特征值。 它表示在特定的特征向量方向上,变换的缩放比例。

想象一个拉伸机,你放入一根箭头,拉伸机的作用下,这根箭头可能会被拉长、缩短或者保持原长,但方向不变。这个"拉伸"或者"缩短"的倍数,就是特征值。特征值反映了这个变换增强或减弱了向量的程度
特征向量定义:

如果一个非零向量v在一个线性变换下的效果仅仅是被伸缩(缩放或拉伸),而方向不变,那么这个向量被称为特征向量。

那根被拉伸后方向不变的箭头,就是特征向量。它是一个特殊的向量,它在矩阵变换下只是被伸缩,但不改变其方向。可以指明变换的主要方向

求特征值与特征向量

求解以下矩阵的特征值与特征向量:



使用Python算出结果:

python 复制代码
import numpy as np

#定义矩阵
A = np.array([[4,1],
             [2,3]])
#使用Numpy求特征值和特征向量
eigenvalues,eigenvectors = np.linalg.eig(A)

print("特征值:",eigenvalues)
print("特征向量:",eigenvectors)

结果为:

特征向量与特征值的应用案例

图像的 SVD分解

对一幅图像的SVD分解为三个部分:

U 矩阵:包含了"左奇异向量",可以想象成是一组基础的图像模式。

Σ矩阵:包含了"奇异值",表明了每个图像模式的重要性或权重。较大的奇

异值对应于图像中更重要的特征。

V 矩阵:包含了"右奇异向量",它与U矩阵类似,但从不同的角度描述了图

像的特征。

通过这种分解,图像转化成一系列的模式和对应的权重。可通过用较少的数据

来描述一幅图像,同时保留其关键特征

使用Python代码实现:

python 复制代码
import cv2
import numpy as np

#读取图像
image = cv2.imread("./11.jpg",0)
#对图像进行svd分解  astype转成浮点数再进行分解
U,S,V = np.linalg.svd(image.astype(np.float64),full_matrices=False)
#定义要保留的奇异值数量
k = 10
s_k = np.diag(S[:k])
#重构图像
compressed_image = np.dot(U[:,:k],np.dot(s_k,V[:k,:]))
compressed_image = np.clip(compressed_image,0,255).astype(np.uint8) #clip限制像素范围
#显示图像
cv2.imshow("Original image",image)
cv2.imshow("compressed image",compressed_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果:

使用的特征值越多,图像就会越清晰

.

相关推荐
数据智能老司机28 分钟前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机28 分钟前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机29 分钟前
精通 Python 设计模式——性能模式
python·设计模式·架构
c8i39 分钟前
drf初步梳理
python·django
每日AI新事件39 分钟前
python的异步函数
python
这里有鱼汤2 小时前
miniQMT下载历史行情数据太慢怎么办?一招提速10倍!
前端·python
aneasystone本尊2 小时前
学习 Chat2Graph 的知识库服务
人工智能
IT_陈寒2 小时前
Redis 性能翻倍的 7 个冷门技巧,第 5 个大多数人都不知道!
前端·人工智能·后端
databook11 小时前
Manim实现脉冲闪烁特效
后端·python·动效
程序设计实验室11 小时前
2025年了,在 Django 之外,Python Web 框架还能怎么选?
python