1. 多元线性回归
通过现有数据,总结出数据所对应的线性方程的斜率与截距
f ( x 1 , x 2 , . . . , x n ) = w 1 x 1 + w 2 x 2 + . . . + w n x n + b f(x_1, x_2, ..., x_n) = w_1x_1 + w_2x_2 + ... + w_nx_n + b f(x1,x2,...,xn)=w1x1+w2x2+...+wnxn+b
- w:斜率
- b:截距
1.1 基本概念
1.1.1 简单线性回归
算法其实就是公式,简单线性回归属于一个算法,对应公式如下:
y = w x + b y = wx +b y=wx+b
公式中的y是目标变量,即未来要预测的值(因变量),x是影响y的因素(自变量),w,b是公式上的参数,即要求的模型。
如上述:w其实就是斜率,b就是截距
所以,如果模型就出来了,未来影响y的值的因素只有x一个,所以就叫做:简单线性回归。
1.1.2 最优解
- 真实值:一般用y表示;
- 预测值:把已知的x带入到公式里,与猜测出来的w,b计算得到,一般用 y ^ \hat y y^表示;
- 误差:预测值与真是值之间的误差,一般用 ε \varepsilon ε表示;
- 最优解:尽可能找到一个模型,使整体误差最小,整体误差通常用Loss表示。
- Loss:整体误差,通过损失函数Loss function计算得到。
1.1.3 多元线性回归
现实中,影响结果y的因素通常有多个,这时,x就从一个变成n个, x 1 , x 2 , . . . , x n x_1, x_2, ..., x_n x1,x2,...,xn同事简单线性回归的公式也就不适用了。多元线性回归公式如下:
y ^ = w 1 x 1 + w 2 x 2 + . . . + w n x n + b \hat y= w_1x_1 + w_2x_2 + ... + w_nx_n + b y^=w1x1+w2x2+...+wnxn+b
截距b也可以用 w 0 w_0 w0表示
y ^ = w 1 x 1 + w 2 x 2 + . . . + w n x n + w 0 \hat y= w_1x_1 + w_2x_2 + ... + w_nx_n + w_0 y^=w1x1+w2x2+...+wnxn+w0
y ^ = w 1 x 1 + w 2 x 2 + . . . + w n x n + w 0 ∗ 1 \hat y= w_1x_1 + w_2x_2 + ... + w_nx_n + w_0 * 1 y^=w1x1+w2x2+...+wnxn+w0∗1
使用向量来表示, X X X代表所有变量,使一维向量; W W W表示所有系数(包含 w 0 w_0 w0),是一维向量,根据向量惩罚规律,可以写成如下表示:
y ^ = W T X \hat y = W^T X y^=WTX
A = [ w 1 w 2 . . . w n ] ⋅ [ x 1 , x 2 , . . . , x n ] A = \left[\begin{array}{} w_1\\w_2\\...\\w_n \end{array}\right] \cdot \left[\begin{array}{}x_1,x_2, ..., x_n\end{array}\right] A= w1w2...wn ⋅[x1,x2,...,xn]
1.2 正规方程
1.2.1 最小二乘法公式:
J ( θ ) = 1 2 ∑ i = 1 n ( h θ ( x i ) − y i ) 2 J(\theta) = \frac1 2 \sum_{i=1}^n(h_\theta(x_i) - y_i)^2 J(θ)=21∑i=1n(hθ(xi)−yi)2
把 θ \theta θ换成 W W W更容易理解
J ( W ) = 1 2 ∑ i = 1 n ( h W ( x i ) − y i ) 2 J(W) = \frac1 2 \sum_{i=1}^n(h_W(x_i) - y_i)^2 J(W)=21∑i=1n(hW(xi)−yi)2
- 公式里的 y i y_i yi是真实值
- h W ( x i ) h_W(x_i) hW(xi)是预测值,即计算得到的值
- 相减后平方得到方差
- 方差求和,得到最小值,计算出W
那么 h W ( x i ) h_W(x_i) hW(xi)就是方程/算法/模型,就是 y ^ \hat y y^
1.2.2 最小二乘法矩阵表示
最小二乘法 可以讲误差方程转化为有确定解的代数方程(其方程式数目正好等于未知数的个数),从而可以求解出这些未知数。这个有确定姐的代数方程组称为最小二乘法估计的正规方程 ,公式如下:
θ = ( X T X ) − 1 X T y \theta = (X^TX)^{-1}X^Ty θ=(XTX)−1XTy 或者 W = ( X T X ) − 1 X T y W = (X^TX)^{-1}X^Ty W=(XTX)−1XTy,其中 θ , W \theta,W θ,W是方程的解!
1.2.3 推导公式
使用矩阵表示最小二乘法:
J ( w ) = 1 2 ∑ i = 0 n ( h w ( x i ) − y ) ( h w ( x i ) − y ) ⟹ J(w) = \frac 1 2 \sum_{i=0}^n(h_w(x_i) - y)(h_w(x_i) - y) \Longrightarrow J(w)=21∑i=0n(hw(xi)−y)(hw(xi)−y)⟹
J ( w ) = 1 2 ( X w − y ) T ( X w − y ) J(w) = \frac 1 2 (Xw - y)^T(Xw - y) J(w)=21(Xw−y)T(Xw−y)
- 因为 ( h w ( x i ) − y ) (h_w(x_i) - y) (hw(xi)−y)在第一个式子里,其实是多组数据,因为角标 i i i代表了任意多个 x x x的值。
- 多组数据可以看成是数组,矩阵
- 他们独立平方后求和,就可以转换成矩阵运算
- 因为矩阵内积的结果,也是求和
举例解释上面的内容
假设: ( h w ( x i ) − y ) (h_w(x_i) - y) (hw(xi)−y) 的值分别是: 1 , 2 , 3 1,2,3 1,2,3
用 J ( w ) = 1 2 ∑ i = 0 n ( h w ( x i ) − y ) 2 J(w) = \frac 1 2 \sum_{i=0}^n(h_w(x_i) - y)^2 J(w)=21∑i=0n(hw(xi)−y)2计算得到的结果是:1+4+9
用矩阵表示上述内容: [ 1 2 3 ] \left[\begin{array}{}1\\2\\3\end{array}\right] 123 ,为了得到相同的结果,使用 [ 1 , 2 , 3 ] ⋅ [ 1 2 3 ] \left[\begin{array}{}1,2,3\end{array}\right]\cdot \left[\begin{array}{}1\\2\\3\end{array}\right] [1,2,3]⋅ 123 就能得到1 + 4 + 9
于是就得到了上面的第二个式子 J ( w ) = 1 2 ( X w − y ) T ( X w − y ) J(w) = \frac 1 2 (Xw - y)^T(Xw - y) J(w)=21(Xw−y)T(Xw−y)
多元一次方程举例
- 二元一次方程
{ x + y = 14 2 x − y = 10 \begin{cases} x + y = 14\\2x - y = 10 \end{cases} {x+y=142x−y=10
通过线性代数的solve方法求解
- linalg:线性代数工具包
- solve(a, b):求解线性矩阵方程或线性标量方程组。
计算确定的"精确"解"x",即完整解
秩,线性矩阵方程ax = b
。
python
import numpy as np
X = np.array([[1, 1], [2, -1]])
y = np.array([14, 10])
result = np.linalg.solve(X, y)
print(result)
bash
[8. 6.]
得到的结果是x=8,y=6
那么此时的x,y需要看成 w 1 w_1 w1, w 2 w_2 w2 ,
也就得到了方程: f ( x 1 , x 2 ) = 8 x 1 + 6 x 2 f(x_1, x_2) = 8x_1 + 6x_2 f(x1,x2)=8x1+6x2
将上面方程的特征值,也就是方程里未知数x,y的系数[1,1],[2, -1]带入方程,就能够得到 { f ( 1 , 1 ) = 8 + 6 = 14 f ( 2 , − 1 ) = 16 − 6 = 10 \begin{cases}f(1, 1) = 8 + 6 = 14\\ f(2, -1) = 16 - 6 = 10\end{cases} {f(1,1)=8+6=14f(2,−1)=16−6=10
通过正规方程 W = ( X T X ) − 1 X T y W = (X^TX)^{-1}X^Ty W=(XTX)−1XTy也可以求解到方程的解
python
import numpy as np
X = np.array([[1, 1], [2, -1]])
y = np.array([14, 10])
# (X^TX)
a = X.T.dot(X)
# (X^TX)^{-1}
at = np.linalg.inv(a)
# (X^TX)^{-1}X^Ty$
result = at.dot(X.T).dot(y)
print(result)
bash
[8. 6.]
- 三元一次方程
{ x − y + z = 100 2 x + y − z = 80 3 x − 2 y + 6 z = 256 \begin{cases} x - y + z = 100\\ 2x + y - z = 80 \\ 3x - 2y + 6z = 256 \end{cases} ⎩ ⎨ ⎧x−y+z=1002x+y−z=803x−2y+6z=256
同样先提取出系数矩阵 [ 1 , − 1 , 1 2 , 1 , − 1 3 , − 2 , 6 ] \left[\begin{array}{}1, -1, 1\\ 2, 1, -1\\ 3, -2, 6 \end{array}\right] 1,−1,12,1,−13,−2,6 ,真实值矩阵 [ 100 80 256 ] \left[\begin{array}{}100\\ 80\\ 256 \end{array}\right] 10080256
代码计算过程省略。。。
[!IMPORTANT]
方程里的x,y,z对应的是特征值的 w 1 , w 2 , w 3 w_1, w_2, w_3 w1,w2,w3
x, y, z的系数,对应的是测试组数据
等号右边的数值,对应的是真实值
1.2.3 八元一次方程举例
{ 14 x 2 + 8 x 3 + 5 x 5 + − 2 x 6 + 9 x 7 + − 3 x s = 339 − 4 x 1 + 10 x 2 + 6 x 3 + 4 x 4 + − 14 x 5 + − 2 x 6 + − 14 x 7 + 8 x s = − 114 − 1 x 1 + − 6 x 2 + 5 x 3 + − 12 x 4 + 3 x 5 + − 3 x 6 + 2 x 7 + − 2 x s = 30 5 x 1 + − 2 x 2 + 3 x 3 + 10 x 4 + 5 x 5 + 11 x 6 + 4 x 7 + − 8 x s = 126 − 15 x 1 + − 15 x 2 + − 8 x 3 + − 15 x 4 + 7 x 5 + − 4 x 6 + − 12 x 7 + 2 x s = − 395 11 x 1 + − 10 x 2 + − 2 x 3 + 4 x 4 + 3 x 5 + − 9 x 6 + − 6 x 7 + 7 x s = − 87 − 14 x 1 + 4 x 3 + − 3 x 4 + 5 x 5 + 10 x 6 + 13 x 7 + 7 x s = 422 − 3 x 1 + − 7 x 2 + − 2 x 3 + − 8 x 4 + − 6 x 6 + − 5 x 7 + − 9 x s = − 309 \begin{cases}14x_2 + 8x_3 + 5x_5 + -2x_6 + 9x_7 + -3x_s = 339\\ -4x_1+10x_2+6x_3 +4x_4 +-14x_5 + -2x_6 +-14x_7 + 8x_s = -114\\ -1x_1 + -6x_2 +5x_3 +-12x_4 + 3x_5 + -3x_6 + 2x_7 + -2x_s = 30\\ 5x_1+-2x_2+3x_3+10x_4 +5x_5 +11x_6+4x_7 +-8x_s = 126\\ -15x_1+-15x_2+-8x_3+-15x_4+7x_5+-4x_6 +-12x_7 + 2x_s =-395\\ 11x_1+-10x_2+-2x_3 + 4x_4 +3x_5 + -9x_6 +-6x_7 + 7x_s = -87\\ -14x_1+ 4x_3+-3x_4 + 5x_5 +10x_6 +13x_7 + 7x_s = 422\\ -3x_1+-7x_2+-2x_3 +-8x_4+-6x_6 +-5x_7 +-9x_s = -309\end{cases} ⎩ ⎨ ⎧14x2+8x3+5x5+−2x6+9x7+−3xs=339−4x1+10x2+6x3+4x4+−14x5+−2x6+−14x7+8xs=−114−1x1+−6x2+5x3+−12x4+3x5+−3x6+2x7+−2xs=305x1+−2x2+3x3+10x4+5x5+11x6+4x7+−8xs=126−15x1+−15x2+−8x3+−15x4+7x5+−4x6+−12x7+2xs=−39511x1+−10x2+−2x3+4x4+3x5+−9x6+−6x7+7xs=−87−14x1+4x3+−3x4+5x5+10x6+13x7+7xs=422−3x1+−7x2+−2x3+−8x4+−6x6+−5x7+−9xs=−309
上面八元一次方程对应的X数据
[ 0 , 14 , 8 , 0 , 5 , − 2 , 9 , − 3 − 4 , 10 , 6 , 4 , − 14 , − 2 , − 14 , 8 − 1 , − 6 , 5 , − 12 , 3 , − 3 , 2 , − 2 5 , − 2 , 3 , 10 , 5 , 11 , 4 , − 8 − 15 , − 15 , − 8 , − 15 , 7 , − 4 , − 12 , 2 11 , − 10 , − 2 , 4 , 3 , − 9 , − 6 , 7 − 14 , 0 , 4 , − 3 , 5 , 10 , 13 , 7 − 3 , − 7 , − 2 , − 8 , 0 , − 6 , − 5 , − 9 ] \left[\begin{array}{} 0, 14, 8, 0 ,5 ,-2, 9 ,-3\\ -4, 10 ,6 ,4 ,-14, -2, -14 ,8\\ -1,-6, 5, -12, 3 ,-3, 2, -2\\ 5 ,-2 ,3 ,10 ,5 ,11 ,4 ,-8\\ -15, -15, -8, -15 ,7, -4, -12 ,2\\ 11, -10, -2 ,4, 3 ,-9 ,-6 ,7\\ -14, 0 ,4, -3 ,5, 10 ,13 ,7\\ -3, -7 ,-2 ,-8, 0, -6, -5 ,-9\end{array}\right] 0,14,8,0,5,−2,9,−3−4,10,6,4,−14,−2,−14,8−1,−6,5,−12,3,−3,2,−25,−2,3,10,5,11,4,−8−15,−15,−8,−15,7,−4,−12,211,−10,−2,4,3,−9,−6,7−14,0,4,−3,5,10,13,7−3,−7,−2,−8,0,−6,−5,−9
#对应的y
[339, -114, 30, 126, -395, -87, 422, -309]
1.2.3.1 使用np的linalg写正规方程解答
python
import numpy as np
X = np.array(
[[0, 14, 8, 0, 5, -2, 9, -3],
[-4, 10, 6, 4, -14, -2, -14, 8],
[-1, -6, 5, -12, 3, -3, 2, -2],
[5, -2, 3, 10, 5, 11, 4, -8],
[-15, -15, -8, -15, 7, -4, -12, 2],
[11, -10, -2, 4, 3, -9, -6, 7],
[-14, 0, 4, -3, 5, 10, 13, 7],
[-3, -7, -2, -8, 0, -6, -5, -9]])
y = np.array([339, -114, 30, 126, -395, -87, 422, -309])
# (X^TX)
a = X.T.dot(X)
# (X^TX)^{-1}
at = np.linalg.inv(a)
# (X^TX)^{-1}X^Ty$
result = at.dot(X.T).dot(y)
print(result)
bash
[ 1. 5. 15. 3. 8. 4. 17. 12.]
得到的结果就是各个特征值的斜率,也就是特征方程的 W W W
方程就是:$f(x_1, x_2, x_3, x_4, x_5, x_6, x_7, x_9, x_8) = $
1.2.3.2 sklearn库使用正规方程
python
import numpy as np
# linear:线性,model:算法,模型,
# LinearRegression:线性回归
from sklearn.linear_model import LinearRegression
X = np.array(
[[0, 14, 8, 0, 5, -2, 9, -3],
[-4, 10, 6, 4, -14, -2, -14, 8],
[-1, -6, 5, -12, 3, -3, 2, -2],
[5, -2, 3, 10, 5, 11, 4, -8],
[-15, -15, -8, -15, 7, -4, -12, 2],
[11, -10, -2, 4, 3, -9, -6, 7],
[-14, 0, 4, -3, 5, 10, 13, 7],
[-3, -7, -2, -8, 0, -6, -5, -9]])
y = np.array([339, -114, 30, 126, -395, -87, 422, -309])
model = LinearRegression()
# X:训练数据,y:真实值
# fit:训练,拟合,找到X与y之间的规律
model.fit(X, y)
# coef_:方程的解(系数,斜率,W,\theta)
W = model.coef_
print(W)
bash
[ 3.45714358 6.90856568 10.8264159 0.44734523 6.86091921 6.24871714
17.47728367 12.78738885]
很明显,计算得到的结果与linalg 正规方程的结果不一致。
稍安勿躁,将X矩阵的第一行数据带入到结果中计算,观察一下结果。
python
3.45714358*0 + 6.90856568*14 + 10.8264159*8 + 0.44734523*0 + 6.86091921*5 + 6.24871714*(-2) + 17.47728367*9 + 12.78738885*(-3)
结果是:324.07179497000004,与真实值339比较接近
继续上面代码
python
print('是否计算截距:', model.fit_intercept) # 是否计算截距
print('截距的值:', model.intercept_) # 截距的值
会得到:
是否计算截距: True
截距的值: 14.92820500839805
model.fit(X, y)
方法,默认的fit_intercept
值是True,
当fit_intercept=True是,不通过正规方程求解
创建模型时,将fit_intercept设置成False,代码底层执行时会按照正规方程解法执行。就可以得到与正规方程相同过的结果
python
model = LinearRegression(fit_intercept=False)
[ 1. 5. 15. 3. 8. 4. 17. 12.]
是否计算截距: False
截距的值: 0.0
1.2.4 带截距的线性方程
将上面解方程的结果[ 1. 5. 15. 3. 8. 4. 17. 12.]
凹凸性
一元函数
- 凸函数:二阶导数>0
f ( x ) = x 2 f(x) = x^2 f(x)=x2的二阶导数是 2,>0 - 凹函数:二阶导数<0
驻点,拐点
驻点:增减性的交替点
拐点:凹凸性的交替点
脑补 f ( x ) = s i n x f(x) = sinx f(x)=sinx
在 π/2,π3/4是驻点
在 π位置,是拐点
雅可比矩阵
多元函数的一阶偏导数矩阵
y = f ( x ) y=f(x) y=f(x),其中x是n维向量,表示有n哥未知数,即n个自变量,y是k维的向量,表示函数对应关系计算返回k个因变量
y i = f ( x i ) y_{i}=f(x_{i}) yi=f(xi),其中 x i x_{i} xi和每个 y i y_{i} yi都是相关的,也就是每个 y i y_{i} yi是单独从 x i x_{i} xi映射过来的函数。
函数 f ( x ) f(x) f(x)的雅可比矩阵就是每个 y i y_{i} yi分别对每个 x i x_{i} xi求偏导,然后构成的矩阵叫做雅可比矩阵
[ ∂ y 1 ∂ x 1 ∂ y 1 ∂ x 2 . . . ∂ y 1 ∂ x n ∂ y 2 ∂ x 1 ∂ y 2 ∂ x 2 . . . ∂ y 2 ∂ x n . . . . . . . . . . . . ∂ y k ∂ x 1 ∂ y k ∂ x 2 . . . ∂ y k ∂ x n ] \left[ \begin{array}{cc} \frac{\partial y_{1}}{\partial x_{1}} & \frac{\partial y_{1}}{\partial x_{2}} & ... & \frac{\partial y_{1}}{\partial x_{n}} \\ \frac{\partial y_{2}}{\partial x_{1}} & \frac{\partial y_{2}}{\partial x_{2}} & ... & \frac{\partial y_{2}}{\partial x_{n}} \\ ... & ... & ... & ...\\ \frac{\partial y_{k}}{\partial x_{1}} & \frac{\partial y_{k}}{\partial x_{2}} & ... & \frac{\partial y_{k}}{\partial x_{n}} \end{array} \right] ∂x1∂y1∂x1∂y2...∂x1∂yk∂x2∂y1∂x2∂y2...∂x2∂yk............∂xn∂y1∂xn∂y2...∂xn∂yk
雅可比矩阵示例
{ y 1 y 2 } ⟹ y 1 = x 1 2 + 3 x 1 x 2 + 2 x 3 y 2 = 2 x 2 − 2 x 1 x 2 + x 3 2 ⟹ { x 1 x 2 x 3 } \begin{Bmatrix} y_{1} \\ y_{2} \end{Bmatrix} \Longrightarrow \begin{array}{} y_{1} = x_{1}^2 + 3x_{1}x_{2} + 2x_{3}\\ y_{2} = 2x_{2} - 2x_{1}x_{2} + x_{3}^2\end{array} \Longrightarrow \begin{Bmatrix} x_{1}\\ x_{2}\\ x_{3} \end{Bmatrix} {y1y2}⟹y1=x12+3x1x2+2x3y2=2x2−2x1x2+x32⟹⎩ ⎨ ⎧x1x2x3⎭ ⎬ ⎫
自变量 x 1 , x 2 , x 3 x_{1}, x_{2}, x_{3} x1,x2,x3根据函数 f ( x ) f(x) f(x)映射为因变量 y 1 , y 2 y_{1}, y_{2} y1,y2,那么 y 1 y_{1} y1是 x 1 , x 2 , x 3 x_{1}, x_{2}, x_{3} x1,x2,x3的函数, y 2 y_{2} y2也是 x 1 , x 2 , x 3 x_{1}, x_{2}, x_{3} x1,x2,x3的函数,那么函数 f ( x ) {f(x)} f(x)的雅可比矩阵如下:
6.Hessian矩阵
多元函数的二阶偏导数矩阵,一般是对称矩阵
[ ∂ 2 y 1 ∂ 2 x 1 ∂ 2 y 1 ∂ x 1 x 2 . . . ∂ 2 y 1 ∂ 2 x 1 x n ∂ 2 y 2 ∂ x 2 x 1 ∂ 2 y 2 ∂ 2 x 2 . . . ∂ y 2 ∂ x 2 x n . . . . . . . . . . . . ∂ 2 y k ∂ x n x 1 ∂ 2 y k ∂ x n x 2 . . . ∂ 2 y k ∂ 2 x n ] \left[ \begin{array}{cc} \frac{\partial^2 y_{1}}{\partial^2 x_{1}} & \frac{\partial^2 y_{1}}{\partial x_{1}x_{2}} & ... & \frac{\partial^2 y_{1}}{\partial^2 x_{1}x_{n}} \\ \frac{\partial^2 y_{2}}{\partial x_{2}x_{1}} & \frac{\partial^2 y_{2}}{\partial^2 x_{2}} & ... & \frac{\partial y_{2}}{\partial x_{2}x_{n}} \\ ... & ... & ... & ...\\ \frac{\partial^2 y_{k}}{\partial x_{n}x_{1}} & \frac{\partial^2 y_{k}}{\partial x_{n}x_{2}} & ... & \frac{\partial^2 y_{k}}{\partial^2 x_{n}} \end{array} \right] ∂2x1∂2y1∂x2x1∂2y2...∂xnx1∂2yk∂x1x2∂2y1∂2x2∂2y2...∂xnx2∂2yk............∂2x1xn∂2y1∂x2xn∂y2...∂2xn∂2yk
7.极致判定法则
实对称矩阵正定负定判定
实对称矩阵A正定负定判定条件:
- 对于任意向量 v ⃗ ≠ 0 \vec{v} \neq 0 v =0,都有 v ⃗ T A v ⃗ > 0 \vec{v}^TA\vec{v} > 0 v TAv >0,那么A就是正定矩阵;
- 对于任意向量 v ⃗ ≠ 0 \vec{v} \neq 0 v =0,都有 v ⃗ T A v ⃗ < 0 \vec{v}^TA\vec{v} < 0 v TAv <0,那么A就是负定矩阵;
实对称矩阵A负定,代码演示:
python
import numpy as np
A = np.array([[-2, -3, -1],
[-3, -6, -4],
[-1, -4, -5]])
v = np.array([3, 5, 6])
print('给定向量任意向量v:', v)
print('求解矩阵A正定判定条件结果是:', v.T.dot(A).dot(v))
bash
给定向量任意向量v: [3 5 6]
求解矩阵A正定判定条件结果是: -714
实对称矩阵A正定,代码演示:
python
import numpy as np
A = np.array([[5, 1, -4],
[1, 3, -2],
[-4, -2, 7]])
v = np.array([-5, 2, -3])
print('给定向量任意向量v:', v)
print('求解矩阵A正定判定条件结果是:', v.T.dot(A).dot(v))
bash
给定向量任意向量v: [-5 2 -3]
求解矩阵A正定判定条件结果是: 84
根据特征值正负判定矩阵正定与否
- 对称矩阵A的特征值全部 > 0 \gt0 >0,A是正定矩阵
- 对称矩阵A的特征值全部 < 0 \lt0 <0,A是负定矩阵
- 对称矩阵A的特征值有的 > 0 \gt0 >0,有的 < 0 \lt0 <0是不定矩阵
- 对称矩阵A的特征值有的 ≥ 0 \geq0 ≥0,A是半正定矩阵
- 对称矩阵A的特征值有的 ≤ 0 \leq0 ≤0,A是半负定矩阵
python
import numpy as np
A = np.array([[5, 1, -4],
[1, 3, -2],
[-4, -2, 7]])
w, v = np.linalg.eig(A)
print('矩阵的特征向量是:', v, '\n特征值是:', w)
bash
矩阵的特征向量是: [[-0.58123713 -0.60851363 -0.54025416]
[-0.27299496 -0.4796241 0.83392714]
[ 0.76657495 -0.63219608 -0.11265418]]
特征值是: [10.74515039 1.63251546 2.62233415]
上面代码得出的A的特征值都是正数,所以A是正定矩阵。
那么:什么是特征值呢?特征值eigenvalue与特征向量eigenvector