카테고리 없음

고등학교 선형대수 수행 준비

nullbyte 2025. 5. 15. 01:07

write up 적는거처럼 이렇게라도 해야 머리에 뭐라도 들어올거 같아서 뭐하는 코드인지 해석정도만 해볼거다

아마 내일 수행보고 글 지울지도 모르겠다

 

0320.py

 

M = np.array([
    [1,1,0,1,0],
    [1,0,0,1,1],
    [1,1,0,1,0],
    [0,0,1,0,0],
    [0,0,1,1,1]
])

a = np.array([
    [0,0,0,0,0],
    [0,0,0,0,0],
    [0,0,0,0,0],
    [0,1,0,0,0],
    [0,1,0,0,0],
])

b = np.array([
    [0,0,0,0,0],
    [0,0,0,0,0],
    [0,0,0,0,0],
    [0,0,1,0,0],
    [0,0,0,0,0],
])

 

행렬 3개가 주어진다

 

단순히 행렬의 덧셈 뺄셈은

print(M + a - b)

 

위와 같이 표기하고

 

곱셈은 numpy에서 지원하는 @ 연산을 사용해 표기한다

 

a = np.array([[13,15,50], [13.5,20,60], [14,18,40],[12.8,13,30]])
w = np.array([0.4,0.3,0.3])
s = a@w

 

역행렬을 구하기 위해선 코드에서 두 가지 과정을 거친다

 

Routine 1

np.linalg.det() 함수의 인자로 행렬을 넣어 행렬식을 구한다

이 행렬식이 0이면 역행렬이 존재하지 않는다는걸 의미한다

 

Routine2

np.linalg.inv() 함수를 사용해 역행렬을 구할 수 있다. 역시 인자로 행렬을 받는다

 


0410.py

고윳값, 고유벡터, 고유분해를 구하는 과정을 다룬다

 

a = np.array([[0,3],[1,2]])

 

2x2 정사각행렬이 주어진다

nxn 정사각행렬은 최대 n개의 고유값과 각 고윳값에 대한 고유벡터 1개씩 (또는 그 이상)을 가지기에 여러개를 구할 수 있다

eigenVal, eigenVec = np.linalg.eig(a)

print('고윳값', eigenVal[0])
print('고유벡터', eigenVec[:, 0])
print('고윳값', eigenVal[1])
print('고유벡터', eigenVec[:, 1])

 

eigenVal[0]은 첫번째 행을, eigenVec[:, 0]은 첫번째 열을 가져온다

 

행렬의 대각화

import numpy as np

n=5
A = np.array([[0,3], [1,2]])

eigenVal, eigenVec = np.linalg.eig(A)

D = np.diag([eigenVal[1], eigenVal[0]])

P = np.column_stack((eigenVec[:, 1], eigenVec[:, 0]))

print('n이 %d일 때'%(n))
print('A :\n', A)
print('P :\n', P)
print('D^n : \n', D**n)
print('P Inv : \n', np.linalg.inv(P))

 

A=PDP**1

A: 원래 행렬, D: 대각행렬, P: 고유벡터 행렬

 

n = 5: A의 5제곱을 구하고 싶음

고윳값을 대각행렬 D로 만듦

 

  • 고유벡터들을 열벡터로 쌓아서 P 행렬 구성
  • 순서를 D와 맞추기 위해 [:, 1] 먼저 넣음
  • D^n: 대각행렬의 n제곱은 그냥 각 대각 원소만 n제곱하면 됨
  • np.linalg.inv(P): P의 역행렬 (나중에 A^n 구할 때 필요)

0424.py

 

숫자모양으로 행렬 놓은거 축소해주는 합성곱 신경망인지 뭔지 설명할 때 나왔던 코드다

 

주석처리 열심히 했으므로 이 파트는 PoC로 퉁치겠다

 

import numpy as np
import matplotlib.pyplot as plt

seven = np.array([
    [0,1,1,1,0],
    [0,1,0,1,0],
    [0,1,1,1,0],
    [0,1,0,1,0],
    [0,1,1,1,0]
])

# 3x3 필터
A = np.array([
  [0,0,0],
  [1,1,1],
  [0,0,0]
])

# 필터 적용 결과값 담을 list
S = []

# 3x3 9개로 나눈 후 각각 M과 A를 행렬곱한 후 다 더함
for i in range(3):
  for j in range(3):
    M = seven[i : i + 3, j : j + 3]
    S.append((M@A).sum())

# S는 총 9개의 값이므로 3x3 배열로 reshape
S = np.array(S).reshape(3,3)

# RGB로 시각화
imgData1 = np.zeros((5,5,3))

# 0인 부분 [1,1,1] 흰색 설정 나머지는 [0,0,0] 검은색
for i in range(len(seven)):
  for j in range(len(seven[i])):
    if not seven[i][j]:
      imgData1[i][j] = [1,1,1]

# 필터 처리 후 S 시각화
imgData2 = np.zeros((3,3,3))

#S [i][j]가 0이 아니면 빨간색 채널을 사용해 강조 (강할수록 진한 빨강).
for i in range(len(S)):
  for j in range(len(S[i])):
    if S[i][j]:
      imgData2[i][j] = [S[i][j] * 0.1, 0, 0]
    else:
      imgData2[i][j] = [1,1,1]

fig = plt.figure()
rows = 1
cols = 2
ax1 = fig.add_subplot(rows, cols, 1)
ax1.imshow(imgData1)
ax2 = fig.add_subplot(rows, cols, 2)
ax2.imshow(imgData2)

plt.show()
print(S)

 

 


0508.py

마지막인데 이건 내가 내일까지 다 이해하고 외울 자신이 없다

 

그냥 써놓기만 하겠다

 

import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import MinMaxScaler
import matplotlib.pyplot as plt
import math

'''
stdA = (80 - 60) / 10
stdB = (90 - 80) / 20

print('수학점수 표준화 : %.2f, 영어점수 표준화 : %.2f' % (stdA, stdB))

if stdA > stdB:
    print('수학점수가 높다')
else:
    print('영어점수가 높다')
'''

Health = np.array([[176.5,1.2],[169.2,0.8],[180.3,0.1],[162.7,0.5]])
'''
# (1) 표준화 (standardization)
Health_std = np.copy(Health)
for i in range(Health.shape[1]):
    avg = np.average(Health[:, i])
    std = np.std(Health[:, i])
    Health_std[:, i] = (Health_std[:, i] - avg) / std

print('표준화: \n', Health_std)
print()

# (2) 정규화 (normalization)

Health_norm = np.copy(Health)
for i in range(Health.shape[1]):
    Health_norm[:, i] = Health_norm[:, i] - np.min(Health_norm[:, i])
    Health_norm[:, i] = Health_norm[:, i] / np.max(Health_norm[:, i])

print('정규화: \n', Health_norm)
'''
'''
Health_std2 = StandardScaler().fit_transform(Health)
print('표준화(사이킷런 라이브러리) : \n', Health_std2)
print()

# (2) 정규화 - 사이킷런 라이브러리 활용
Health_norm2 = MinMaxScaler().fit_transform(Health)
print('정규화 (사이킷런 라이브러리) : \n', Health_norm2)
'''
'''
x = np.arrange(-3, 3, 0.2)
plt.axhlie(y=0, color='k')
plt.axhlie(x=0, color='k')
plt.xlim(-4, 4)
plt.ylim(-4, 4)
plt.plot(x, 2**x, 'r')
plt.plot(x, (1/2) ** x, 'y')
plt.plot(x, -2 ** x, 'g')
plt.show()
'''

x = np.arrange(-4,10,0.2)
y = np.log(x) / np.log(3)
y = np.array(y)

plt.axhline(y=0, color='k')
plt.axhline(x=0, color='k')
plt.xlim(-4, 10)
plt.ylim(-10, 10)

plt.plot(x, 3**x, 'g')
plt.text(2, 5, 'y=3**2')

plt.plot(x, y, 'r')
plt.text(9, 2.5, 'y=logx / log3')

plt.plot(x, x, 'k')
plt.text(6, 5, 'y=x')

plt.show()

 


모르겠다 그냥 졸리다 자고싶다 수행 날먹하고싶다

 

2025.5.15 후기: 수행에 코드는 하나도 안나왔다