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
。
import numpy as np
X = np.array([[1, 1], [2, -1]])
y = np.array([14, 10])
result = np.linalg.solve(X, y)
print(result)
[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也可以求解到方程的解
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)
[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写正规方程解答
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)
[ 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库使用正规方程
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)
[ 3.45714358 6.90856568 10.8264159 0.44734523 6.86091921 6.24871714
17.47728367 12.78738885]
很明显,计算得到的结果与linalg正规方程的结果不一致。
稍安勿躁,将X矩阵的第一行数据带入到结果中计算,观察一下结果。
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比较接近
继续上面代码
print('是否计算截距:', model.fit_intercept) # 是否计算截距
print('截距的值:', model.intercept_) # 截距的值
会得到:
是否计算截距: True
截距的值: 14.92820500839805
model.fit(X, y)
方法,默认的fit_intercept
值是True,
当fit_intercept=True是,不通过正规方程求解
创建模型时,将fit_intercept设置成False,代码底层执行时会按照正规方程解法执行。就可以得到与正规方程相同过的结果
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 vTAv>0,那么A就是正定矩阵;
- 对于任意向量 v ⃗ ≠ 0 \vec{v} \neq 0 v=0,都有 v ⃗ T A v ⃗ < 0 \vec{v}^TA\vec{v} < 0 vTAv<0,那么A就是负定矩阵;
实对称矩阵A负定,代码演示:
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))
给定向量任意向量v: [3 5 6]
求解矩阵A正定判定条件结果是: -714
实对称矩阵A正定,代码演示:
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))
给定向量任意向量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是半负定矩阵
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)
矩阵的特征向量是: [[-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