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

目录

  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()

运行结果:

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

.

相关推荐
爱吃生蚝的于勒几秒前
深入学习指针(5)!!!!!!!!!!!!!!!
c语言·开发语言·数据结构·学习·计算机网络·算法
撞南墙者7 分钟前
OpenCV自学系列(1)——简介和GUI特征操作
人工智能·opencv·计算机视觉
OCR_wintone4218 分钟前
易泊车牌识别相机,助力智慧工地建设
人工智能·数码相机·ocr
进击的六角龙26 分钟前
Python中处理Excel的基本概念(如工作簿、工作表等)
开发语言·python·excel
王哈哈^_^29 分钟前
【数据集】【YOLO】【VOC】目标检测数据集,查找数据集,yolo目标检测算法详细实战训练步骤!
人工智能·深度学习·算法·yolo·目标检测·计算机视觉·pyqt
星沁城32 分钟前
240. 搜索二维矩阵 II
java·线性代数·算法·leetcode·矩阵
一者仁心36 分钟前
【AI技术】PaddleSpeech
人工智能
是瑶瑶子啦44 分钟前
【深度学习】论文笔记:空间变换网络(Spatial Transformer Networks)
论文阅读·人工智能·深度学习·视觉检测·空间变换
一只爱好编程的程序猿1 小时前
Java后台生成指定路径下创建指定名称的文件
java·python·数据下载
EasyCVR1 小时前
萤石设备视频接入平台EasyCVR多品牌摄像机视频平台海康ehome平台(ISUP)接入EasyCVR不在线如何排查?
运维·服务器·网络·人工智能·ffmpeg·音视频