线性代数(Linear Algebra)不仅是机器学习的基石,更是一门神奇的魔法学科,让我们能够从数据中挖掘出宝藏般的信息!无论是创建新特征还是优化算法,线性代数都是我们解决问题的有力工具。线性代数在数据表示、降维、优化、特征工程和相似度测量等方面都有广泛应用。例如,通过矩阵来组织和操作数据,使复杂的数据集得以简洁表示;PCA等降维技术利用线性代数减少变量数量,提高模型效率;梯度下降法通过线性代数找到函数的最小值,驱动机器学习的优化过程。
接下了将探讨一些关键的线性代数概念,并通过可视化解释和代码示例,帮助你更好地理解这些概念在数据科学中的实际应用。
1.向量 (Vector)
向量(Vector) 是线性代数(Linear Algebra)中的最为基本元素,我们可以从三个角度理解向量(Vector):
-
物理学的角度:向量是指向空间的箭头,由长度和方向定义。平面上的向量是二维的,我们生活空间中的向量是三维的。
-
计算机科学的角度:向量是有序的数字列表。这个列表的长度决定了向量的维度。
-
数学家的角度:向量可以是任何可以相加和乘以一个数字的对象。向量表示数据点或特征向量,常用于描述数据样本。
例如下面一个二维空间的一个点,就可以表示一个向量:
import numpy as np
import matplotlib.pyplot as plt
v = np.array([2, 3])
plt.quiver(0, 0, v[0], v[1], angles='xy', scale_units='xy', scale=1, color='r')
plt.xlim(-2, 5),plt.ylim(-2, 5),plt.grid()
plt.xlabel('x')
plt.ylabel('y')
plt.title('Vector v=[2,3]')
plt.show()
2.向量运算(Vector operations)
2.1向量加法
向量加法是将两个向量逐元素相加,得到一个新的向量。
下面代码示意两个向量加的展示:
import numpy as np
import matplotlib.pyplot as plt
a = np.array([2, 3])
b = np.array([4, 1])
c = a + b
plt.figure()
plt.quiver(0, 0, a[0], a[1], angles='xy', scale_units='xy', scale=1, color='b', label='Vector:a='+str(a))
plt.quiver(0, 0, b[0], b[1], angles='xy', scale_units='xy', scale=1, color='g', label='Vector:b='+str(b))
plt.quiver(0, 0, c[0], c[1], angles='xy', scale_units='xy', scale=1, color='r', label='Vector:a + b='+str(c))
plt.quiver(a[0], a[1],c[0]-a[0], c[1]-a[1], angles='xy', scale_units='xy', scale=1, color='lightgreen', label='b\'')
plt.quiver(b[0], b[1],c[0]-b[0], c[1]-b[1], angles='xy', scale_units='xy', scale=1, color='lightblue', label='a\'')
plt.xlim(0, 6),plt.ylim(0, 6)
plt.axhline(0, color='black', linewidth=0.5)
plt.axvline(0, color='black', linewidth=0.5)
plt.grid(True)
plt.legend()
plt.title('Vector Addition')
plt.xlabel('X-axis'),plt.ylabel('Y-axis')
plt.show()
2.2标量乘法(Scalar multiplication)
标量乘法是向量乘以一个标量(即一个数),结果是一个方向与原始向量相同(如果标量为负,则方向相反),但其大小按标量的绝对值进行缩放的向量。
scalar = 3
v = np.array([1, 2])
v_scaled = scalar * v
plt.quiver(0, 0, v[0], v[1], angles='xy', scale_units='xy', scale=1, color='r', label='Original')
plt.quiver(0, 0, v_scaled[0], v_scaled[1], angles='xy', scale_units='xy', scale=1, color='b', label='Scaled')
plt.xlim(-1, 6),plt.ylim(-1, 8)
plt.grid()
plt.legend()
plt.show()
2.3点积(Dot product)
点积(Dot product)是两个向量的欧几里德长度乘积与它们之间夹角的余弦值的乘积,反映了向量的长度和它们之间方向关系的特性。
直观地理解,可以将点积理解为一个向量对另一个向量的方向性影响或者说“一个向量对另一个向量施加了多少推力/能量”。其结果表明我们通过点积对原始向量进行了多大程度的增强(可以是正数、负数或零)。
如果点积为0,这说明向量是正交的。
关于点积的理解可以参考:https://betterexplained.com/articles/vector-calculus-understanding-the-dot-product/
v1 = np.array([1, 2])
v2 = np.array([2, 3])
dot_product = np.dot(v1, v2)
print("Dot Product:", dot_product)
2.4向量空间(Vector space)
向量空间(或线性空间)是指可以进行向量加法和数乘(称为标量乘法)的任何向量集合。要称作向量空间 V,必须满足一系列公理。
3.矩阵(matrix)
矩阵(matrix)是线性代数中的重要概念,它以行和列的形式组织数据和运算。每个矩阵都由数值组成,这些数值排列成若干行和若干列,形成一个二维的表格结构。矩阵在数学和计算机科学中广泛应用,能够表示和处理各种数据和运算关系。例如,矩阵可以用于描述线性方程组、表示图像的像素值、执行线性变换和投影,以及实现各种数值计算和数据分析算法。通过矩阵,我们能够更有效地理解和解决复杂的数学和工程问题,为科学研究和技术应用提供了强大的工具。
这是一个有2行2列的二维矩阵。
3.1线性变换(Linear Transformation)
线性变换是指在两个向量空间 V → W 之间的映射,它保持向量加法和标量乘法的运算。在实际应用中,将一个矩阵 A 应用于一个向量 x,得到另一个向量 y(通过运算 Ax = y),就是一个线性变换。
在数据科学中,线性变换被广泛应用于:
下面是一个最简单矩阵变换示例:
import numpy as np
import matplotlib.pyplot as plt
T = np.array([[1, 2], [2, 1]])
square = np.array([[0, 0, 1, 1, 0], [0, 1, 1, 0, 0]])
transformed_square = np.dot(T, square)
plt.figure(figsize=(8, 4))
plt.subplot(1, 2, 1)
plt.plot(square[0], square[1], 'o-', color='blue')
plt.title('Original Square')
plt.xlim(-1, 3)
plt.ylim(-1, 3)
plt.axhline(0, color='grey', linewidth=0.5)
plt.axvline(0, color='grey', linewidth=0.5)
plt.grid(True)
plt.subplot(1, 2, 2)
plt.plot(transformed_square[0], transformed_square[1], 'o-', color='red')
plt.title('Transformed Square')
plt.xlim(-1, 4)
plt.ylim(-1, 4)
plt.axhline(0, color='grey', linewidth=0.5)
plt.axvline(0, color='grey', linewidth=0.5)
plt.grid(True)
plt.show()
3.2逆矩阵(Inverse Matrix)和
奇异矩阵(Singular Matrix)
矩阵乘以其逆矩阵得到单位矩阵。
Python中计算逆矩阵(Inverse Matrix))的示例:
import numpy as np
A = np.array([[1, 2], [3