본문 바로가기
기본소양/선형대수학

파이썬으로 하는 선형대수학 (3. Span, Rank, Basis, Projection)

by EXUPERY 2021. 1. 18.
반응형

3.1 2차원 벡터

a = [1,3]
b = [2,6]
plt.figure(figsize=(2.5,5))
plt.xlim(0, 3.5)          
plt.ylim(0, 7)
plt.xticks(ticks=np.arange(0, 4, step=1))
plt.yticks(ticks=np.arange(0, 7, step=1))
plt.arrow(0, 0, a[0], a[1], width = 0.05,head_width = .2, head_length = .1, color = 'red', alpha = 0.3)
plt.arrow(0, 0, b[0], b[1], head_width = .1, head_length = .1, color = 'blue', alpha = 0.3)
plt.axhline(0, color='gray', alpha = 0.3)
plt.axvline(0, color='gray', alpha = 0.3)
plt.annotate('vector g',(1,3),fontsize = 13, color = 'red')
plt.annotate('vector h',(2,6),fontsize = 13, color = 'blue')
plt.title("Vector")
plt.grid()
plt.show()

  • 행렬식이 0이므로 스팬 확장 못함.
  • 스팬은 선임
  • h와 g는 선형 종속임
  • Rank = 1
  • 선위에 선이 있음

3.2 3차원 벡터

l = [1,0,0]
m = [0,1,0]
n = [0,0,1]

fig = plt.figure()
ax = plt.axes(projection='3d')
ax.quiver(0,0,0,l[0],l[1],l[2], color='r',label='l')
ax.quiver(0,0,0,m[0],m[1],m[2],  color='b', label='m')
ax.quiver(0,0,0,n[0],n[1],n[2], color='g',label='n')
ax.legend()
plt.show()
  • 행렬식이 0이 아니므로 스팬 확장 가능.
  • 스팬은 R3 
  • l과 m,n 은 선형 독립임
  • Rank = 3
  • 선위에 선이 있음

3.3 Basis

plt.figure(figsize=(5,5))
plt.xlim(-2,2)
plt.ylim(-2,2)
plt.xticks(ticks=np.arange(-2, 3, step=1))
plt.yticks(ticks=np.arange(-2, 3, step=1))
plt.arrow(0, 0, 1, 0, linewidth = 3, head_width = .05, head_length = .05, color = 'b', alpha = 0.4)
plt.arrow(0, 0, 0, 1, linewidth = 3, head_width = .05, head_length = .05, color = 'r', alpha = 0.4)
plt.grid()
plt.show()

3.4 Orthogonality

fig, axes = plt.subplots(1, 3, figsize=(21,6.5))
for ax in range(3) :
  axes[ax].set_xlim(-5,5); axes[ax].set_xticks(ticks=np.arange(-4, 5, step=1));
  axes[ax].set_ylim(-5,5); axes[ax].set_yticks(ticks=np.arange(-4, 5, step=1))
  
axes[0].arrow(0, 0, 1, 3, linewidth = 3, head_width = .05, head_length = .05, color = 'b', alpha = 0.4)
axes[0].arrow(0, 0, -3, 1, linewidth = 3, head_width = .05, head_length = .05, color = 'r', alpha = 0.4)

axes[1].arrow(0, 0, -2, 4, linewidth = 3, head_width = .05, head_length = .05, color = 'b', alpha = 0.4)
axes[1].arrow(0, 0, 4,2, linewidth = 3, head_width = .05, head_length = .05, color = 'r', alpha = 0.4)

axes[2].arrow(0, 0, 4, 1, linewidth = 3, head_width = .05, head_length = .05, color = 'b', alpha = 0.4)
axes[2].arrow(0, 0, 1, -4, linewidth = 3, head_width = .05, head_length = .05, color = 'r', alpha = 0.4)

axes[0].grid();axes[1].grid();axes[2].grid();
plt.show()

dot을 했을 때 값이 0이어야 수직이 된다. (내적했을 때 투영한길이가 0이므로)

3.5 Projection

# V proj 구하기
v = [2, 7]
x = 8
y = 10
def myProjection(v):
  v = np.array(v)
  xy = np.array([x, y])
  xy_norm = np.sqrt(sum(xy**2))     
  vprime = (np.dot(v, xy)/xy_norm**2)*xy
  return vprime
vprime = myProjection(v)
vprime

# 시각화
plt.figure(figsize = (7,7))
plt.xlim(0,10)          
plt.ylim(0,10)
plt.xticks(ticks=np.arange(0, 10, step=1))
plt.yticks(ticks=np.arange(0, 10, step=1))

vprime = myProjection(v)
vprime_norm = np.sqrt(sum(vprime**2))

axes = plt.gca()
plt.gca().set_aspect('equal')
x_vals = np.array(axes.get_xlim())
y_vals = x_vals

plt.arrow(0, 0, vprime[0], vprime[1],linestyle = '--', color = 'green')
plt.arrow(0, 0, v[0], v[1], linewidth = 3, head_width = .05, head_length = .05, color = 'b', alpha = 0.4)
plt.arrow(v[0], v[1],vprime[0]-v[0], vprime[1]-v[1], linewidth = 3, head_width = .05, head_length = .05, color = 'orange', alpha = 0.5)
plt.arrow(0, 0,x, y, linewidth = 3, head_width = .05, head_length = .05, color = 'red', alpha = 0.5)

plt.grid()
plt.show()

3.6 Unit Vector

f = np.array([4, 16, 7, 37, 0])
norm_f = np.sqrt(np.dot(f,f))
unit_f = f / norm_f
unit_f.round(2)

def get_norm (a):
  norm_f = np.sqrt(np.dot(a,a))
  return norm_f
print(f/get_norm(f))

반응형

댓글