Codelog
[AIB] Intermediate Linear Algebra ๋ณธ๋ฌธ
๐ก Variance, ๋ถ์ฐ
๋ถ์ฐ์ ๋ฐ์ดํฐ๊ฐ ์ผ๋ง๋ ํผ์ ธ์๋์ง๋ฅผ ์ธก์ ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
์ด๋ ๊ฐ ๊ฐ๋ค์ ํ๊ท ์ผ๋ก๋ถํฐ ์ฐจ์ด์ ์ ๊ณฑ ํ๊ท ๊ฐ์ด๋ค.
์ฆ, ๋ถ์ฐ์ ๊ตฌํ๊ธฐ ์ํด์๋ ์ผ๋ฐ์ ์ผ๋ก ํ๊ท ์ ๋จผ์ ๊ณ์ฐํด์ผํ๋ค.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import random
# ๋๋คํ 50๊ฐ์ ์ ์๋ฅผ ํฌํจํ๋ 2 ๋ณ์ ์ค์ .
variance_one = []
variance_two = []
for x in range(50):
variance_one.append(random.randint(25,75))
variance_two.append(random.randint(0,100))
variance_data = {'v1': variance_one, 'v2': variance_two}
variance_df = pd.DataFrame(variance_data)
variance_df['zeros'] = pd.Series(list(np.zeros(50)))
variance_df.head()
output :
# scatter plot
plt.scatter(variance_df.v1, variance_df.zeros)
plt.xlim(0,100)
plt.title("Plot 1")
plt.show()
plt.scatter(variance_df.v2, variance_df.zeros)
plt.xlim(0,100)
plt.title("Plot 2")
plt.show()
output :
์์ ๋ ๋ฐ์ดํฐ์ ๋ํด์, ํผ์ ธ์๋ ์ ๋์ ์ฐจ์ด๋ฅผ ์ฝ๊ฒ ํ์ธํ ์ ์๋ค.
๋ถ์ฐ์ ์ผ๋ฐ์ ์ผ๋ก ์๋ฌธ์ v๋ก ํ๊ธฐ๋๋ฉฐ ํ์์ ๋ฐ๋ผ σ^2 ๋ก ํ๊ธฐ๋๊ธฐ๋ ํ๋ค.
# ํ๊ท
v1_mean = variance_df.v1.mean()
print("v1 mean: ", v1_mean)
v2_mean = variance_df.v2.mean()
print("v2 mean: ", v2_mean)
# ๊ฐ ๋ฐ์ดํฐ๋ก๋ถํฐ ํ๊ท ๊น์ง์ ๊ฑฐ๋ฆฌ
variance_df['v1_distance'] = variance_df.v1 - v1_mean
variance_df['v2_distance'] = variance_df.v2 - v2_mean
variance_df.head()
output :
# ์ ๊ณฑ
variance_df['v1_squared_distance'] = variance_df.v1_distance ** 2
variance_df['v2_squared_distance'] = variance_df.v2_distance ** 2
# ์ ๊ณฑ์ ํตํด์ ์์๋ฅผ ์์๋ก ๋ฐ๊ฟ ์ ์๋ค.
variance_df.head()
output :
# ๋ํ๊ณ ๋๋
observations = len(variance_df)
print("Number of Observations: ", observations)
Variance_One = variance_df.v1_squared_distance.sum() / observations
Variance_Two = variance_df.v2_squared_didstance.sum() / observations
print("Variance One: ", Variance_One)
print("Variance Two: ", Variance_Two)
output :
random number๋ฅผ ์์ฑํ ๋, v1์ 25~75 ๋ฒ์์์, v2๋ 0~100 ๋ฒ์์์ ์๋ก 2๋ฐฐ ์ ๋ ์ฐจ์ด๊ฐ ๋๊ฒ ์์ฑํ์ง๋ง,
๋ถ์ฐ ์ฐจ์ด๋ 2๋ฐฐ๋ณด๋ค ํจ์ฌ ๋ ํฌ๋ค.
โจ ํ์ด์ฌ ๋ด์ฅ ํจ์๋ฅผ ์ฌ์ฉํด์ Variance ์ฝ๊ฒ ๊ณ์ฐํ๊ธฐ
print(variance_df.v1.var(ddof = 1))
print(variance_df.v2.var(ddof = 1))
# ddof ํ๋ผ๋ฏธํฐ
# Delta Degrees of Freedom, ์์ ๋
output :
์ฃผ์ํ ์ ์ผ๋ก, ์์ ๊ฒฐ๊ณผ๋ ์ด์ ์ ์ง์ ๊ณ์ฐํ๋ ๊ฒฐ๊ณผ์ ์กฐ๊ธ์ ๋ค๋ฅด๋ค.
๊ทธ ์ด์ ๋ ๋ถ์ฐ์ ๊ณ์ฐํ๋ ๋ฐฉ๋ฒ์ด ๋ชจ์ง๋จ์ด๋ ํน์ ์ํ์ด๋์ ๋ฐ๋ผ์ ๋ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์ด๋ค.
์ผ๋ฐ์ ์ผ๋ก, ์ํ์ ๋ถ์ฐ์ ๊ณ์ฐํ ๋๋ N-1 ๋ก ๋๋์ด์ผ ํ๋ค.
์์ ์ฐ๋ฆฌ๊ฐ ๋ฐ์ดํฐ๋ฅผ ํตํด ๊ณ์ฐํ๋ ๋ฐฉ์์ ๋ชจ์ง๋จ์ ๋ถ์ฐ์ด๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์์ ๋๋ฅผ 0์ผ๋ก ์ค์ ํ๋ ๊ฒฝ์ฐ, ๋์ผํ ๊ฐ์ ์ป์ ์ ์๋ค.
๐ก Standard Deviation, ํ์คํธ์ฐจ
ํ์คํธ์ฐจ๋ ๋ถ์ฐ์ ๋ฃจํธ(√)๋ฅผ ์์ด ๊ฐ์ด๋ค.
๋ถ์ฐ์ ๊ตฌํ ๋, ์ ๊ณฑ ๊ฐ๋ค์ ๋ํ๋ ๊ณผ์ ์ด ์๋๋ฐ ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ํ๊ท ์ ๋นํด์ ์ค์ผ์ผ์ด ์ปค์ง๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
ํ์คํธ์ฐจ๋ ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ ์ ๊ณฑ๋ ์ค์ผ์ผ์ ๋ฎ์ถ๋ ๋ฐฉ๋ฒ์ด๋ค.
print(variance_df.v1.std(ddof = 0))
print(variance_df.v2.std(ddof = 0))
output :
๐ก Covariance, ๊ณต๋ถ์ฐ
๊ณต๋ถ์ฐ์ด๋, 1๊ฐ์ ๋ณ์ ๊ฐ์ด ๋ณํํ ๋ ๋ค๋ฅธ ๋ณ์๊ฐ ์ด๋ ํ ์ฐ๊ด์ฑ์ ๋ํ๋ด๋ฉฐ ๋ณํ๋์ง๋ฅผ ์ธก์ ํ๋ ๊ฒ์ด๋ค.
(ํ๋๊ฐ ์ฆ๊ฐํ ๋, ๋ค๋ฅธ ํ๋๋ ์ฆ๊ฐํ๋ ๊ฒฝํฅ์ ํ์ ํ๋ ๊ฒ.)
- ์ฒซ๋ฒ์งธ ๊ทธ๋ํ์ ๊ฒฝ์ฐ, y์ ๊ฐ์ด ๋์ ๋ x์ ๊ฐ์ ๋ฎ๋ค. ์ด๋ negative ๊ณต๋ถ์ฐ ๊ฐ์ ๊ฐ๋๋ค ๋ผ๊ณ ํํํ๋ค.
- ๋๋ฒ์งธ ๊ทธ๋ํ์์๋ ๋ ๋ณ์์ ๋๊ณ ๋ฎ์์ ๋ํ์ฌ ๊ด๋ จ์ฑ์ ์ ์ ์๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์ด๋ฌํ ํํ๋ 0์ ๊ฐ๊น์ด ๊ณต๋ถ์ฐ ๊ฐ์ ๊ฐ๋๋ค.
- ์ธ๋ฒ์งธ ๊ทธ๋ํ์์ y ๊ฐ์ด ๋ฎ์ ๋ x์ ๊ฐ๋ ๋ฎ์ผ๋ฉฐ, ๋์ ๋๋ ๊ฐ์ด ๋์์ง๋ค. ์ด ๊ฒฝ์ฐ ๋ณ์๊ฐ์ ๊ณต๋ถ์ฐ ๊ฐ์ positive ๊ฐ์ ๊ธฐ๋ํ ์ ์๋ค.
ํฐ ๊ฐ์ ๊ณต๋ถ์ฐ์ ๋ ๋ณ์๊ฐ์ ํฐ ์ฐ๊ด์ฑ์ ๋ํ๋ธ๋ค.
๊ทธ๋ฌ๋ ๋ง์ฝ ๋ณ์๋ค์ด ๋ค๋ฅธ ์ค์ผ์ผ์ ๊ฐ์ง๊ณ ์๋ค๋ฉด ๊ณต๋ถ์ฐ์ ์ค์ ๋ณ์์ ์ฐ๊ด์ฑ์ ๊ด๊ณ ์์ด ์ํฅ์ ๋ฐ๊ฒ ๋ ๊ฒ์ด๋ค.
๋ง์ฝ ๋ ๋ณ์๊ฐ ์ฐ๊ด์ฑ์ด ์ ๋๋ผ๋ ํฐ ์ค์ผ์ผ์ ๊ฐ์ง๊ณ ์๋ค๋ฉด, ์ฐ๊ด์ด ๋์ง๋ง ์ค์ผ์ผ์ด ์์ ๋ณ์๋ค์ ๋นํด์ ๋์ ๊ณต๋ถ์ฐ ๊ฐ์ ๊ฐ์ง๊ฒ ๋ ๊ฒ์ด๋ค.
a = b = np.arange(5, 50, 5)
c = d = np.arange(10, 100, 10)
fake_data = {"a" : a, "b" : b, "c" : c, "d" : d}
df = pd.DataFrame(fake_data)
plt.scatter(df.a, df.b)
plt.xlim(0, 100)
plt.ylim(0, 100)
plt.show()
plt.scatter(df.c, df.d)
plt.xlim(0, 100)
plt.ylim(0, 100)
plt.show()
output :
๐ก Variance-covariance matirx, ๋ถ์ฐ-๊ณต๋ถ์ฐ ํ๋ ฌ
df.cov() # ๊ณต๋ถ์ฐ ๊ณ์ฐ
output :
์ ๋ฐ์ดํฐ์ ๋ํด์ ๊ณต๋ถ์ฐ์ ๊ณ์ฐํ ๊ฒฐ๊ณผ์ด๋ค. ์ด๋ฌํ matrix๋ฅผ variance-covariance matrix ๋ผ๊ณ ํํํ๋ฉฐ,
๋๊ฐ์ ๋ถ๋ถ์ ๊ณต๋ถ์ฐ์ด ์๋, ๋ถ์ฐ์ ํํํ๋ค.
๐ก Correlation coefficient
๋ถ์ฐ์์ ์ค์ผ์ผ์ ์กฐ์ ํ๊ธฐ ์ํด์ ํ์คํธ์ฐจ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ฒ๋ผ, ์ด๋ฒ์๋ ๊ณต๋ถ์ฐ์ ์ค์ผ์ผ์ ์กฐ์ ํ ์ ์๋ค.
๊ณต๋ถ์ฐ์ ๋ ๋ณ์์ ํ์คํธ์ฐจ๋ก ๊ฐ๊ฐ ๋๋ ์ฃผ๋ฉด ์ค์ผ์ผ์ ์กฐ์ ํ ์ ์๊ณ , ์ด๋ฅผ ์๊ด๊ณ์ ๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์๊ด๊ณ์๋ -1์์ 1๊น์ง๋ก ์ ํด์ง ๋ฒ์ ์์ ๊ฐ๋ง์ ๊ฐ์ง๋ฉฐ ์ ํ์ฐ๊ด์ฑ์ด ์๋ ๊ฒฝ์ฐ 0์ ๊ทผ์ ํ๊ฒ ๋๋ค.
๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์๊ด๊ณ์๊ฐ ๊ณต๋ถ์ฐ๋ณด๋ค ๋ ์ข์ ์งํ๋ก์จ ์ฌ์ฉ๋๋ฉฐ ๊ทธ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ๋ค.
- ๊ณต๋ถ์ฐ์ ์ด๋ก ์ ๋ชจ๋ ๊ฐ์ ๊ฐ์ง ์ ์์ง๋ง, ์๊ด๊ณ์๋ -1 ~ 1 ์ฌ์ด๋ก ์ ํด์ ธ ๋น๊ตํ๊ธฐ๊ฐ ์ฝ๋ค.
- ๊ณต๋ถ์ฐ์ ํญ์ ์ค์ผ์ผ, ๋จ์๋ฅผ ํฌํจํ๊ณ ์์ง๋ง, ์๊ด๊ณ์๋ ์ด์ ์ํฅ์ ๋ฐ์ง ์๋๋ค.
- ์๊ด๊ณ์๋ ๋ฐ์ดํฐ์ ํ๊ท ํน์ ๋ถ์ฐ์ ํฌ๊ธฐ์ ์ํฅ์ ๋ฐ์ง ์๋๋ค.
์๊ด๊ณ์๋ ์ผ๋ฐ์ ์ผ๋ก ์๋ฌธ์ r๋ก ํํ๋๋ค.
df.corr() # ์๊ด๊ณ์ ๊ณ์ฐ
์๊ด๊ณ์๊ฐ 1์ด๋ผ๋ ๊ฒ์ ํ ๋ณ์๊ฐ ๋ค๋ฅธ ๋ณ์์ ๋ํด์ ์๋ฒฝํ ์์ ์ ํ๊ด๊ณ๋ฅผ ๊ฐ๊ณ ์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
๐ฅ Spearman correlation
์์์ ๋ฐฐ์ด correlation coefficient๋ Pearson correlation ์ด๋ผ ๋ถ๋ฅด๋ฉฐ ์ด๋ ๋ฐ์ดํฐ๋ก๋ถํฐ ๋ถ์ฐ๊ณผ ๊ฐ์ ํต๊ณ์น๋ฅผ ๊ณ์ฐํ ์ ์์ ๋ ์ฌ์ฉ๊ฐ๋ฅํ๋ค. ๊ทธ๋ฌ๋ ๋ง์ฝ ๋ฐ์ดํฐ๊ฐ numeric์ด ์๋๋ผ categorical ์ด๋ผ๋ฉด Spearman correlation coefficient ๋ฅผ ์ฌ์ฉํด์ผํ๋ค. Spearman correlation coefficient๋ ๊ฐ๋ค์ ๋ํด์ ์์ ํน์ rank๋ฅผ ๋งค๊ธฐ๊ณ , ๊ทธ๋ฅผ ๋ฐํ์ผ๋ก correlation์ ์ธก์ ํ๋ Non-parametricํ ๋ฐฉ์์ด๋ค.
### Pearson correlation
import scipy.stats
r, p = scipy.stats.pearsonr(x, y)
r # coefficient
>>> 0.7586402890911869
p # pvalue
>>> 0.010964341301680829
np.corrcoef(x, y)
>>> array([[1. , 0.75864029],
[0.75864029, 1. ]])
### Spearman correlation
import scipy.stats
result = scipy.stats.spearmanr(x, y)
result
>>> SpearmanrResult(correlation=0.9757575757575757, pvalue=1.4675461874042197e-06)
result.correlation
>>> 0.9757575757575757
result.pvalue
>>> 1.4675461874042197e-06
๐ก Unit Vectors, ๋จ์ ๋ฒกํฐ
์ ํ๋์์์, ๋จ์ ๊ธธ์ด(1)์ ๊ฐ๋ ๋ชจ๋ ๋ฒกํฐ๋ฅผ ๋งํ๋ค.
๐ก Span
Span์ด๋, ์ฃผ์ด์ง ๋ ๋ฒกํฐ์ (ํฉ์ด๋ ์ฐจ์ ๊ฐ์) ์กฐํฉ์ผ๋ก ๋ง๋ค ์ ์๋ ๋ชจ๋ ๊ฐ๋ฅํ ๋ฒกํฐ์ ์งํฉ์ด๋ค.
1. ์ ํ ๊ด๊ณ์ ๋ฒกํฐ (Linearly Dependent Vector)
๋ง์ฝ ๋ ๋ฒกํฐ๊ฐ ๊ฐ์ ์ ์์ ์๋ ๊ฒฝ์ฐ, ์ด ๋ฒกํฐ๋ค์ ์ ํ ๊ด๊ณ์ ์๋ค๊ณ ํํํ๋ค.
์ฆ, ์ด ๋ ๋ฒกํฐ๋ค์ ์กฐํฉ์ ํตํด์ ์ ์ธ๋ถ์ ์๋ก์ด ๋ฒกํฐ๋ฅผ ์์ฑํ ์ ์๋ค.
์ด๋ฌํ ๋ฒกํฐ์ Span์ ํ๋ฉด ๊ณต๊ฐ์ด ์๋, ๋ฒกํฐ๊ฐ ์ด๋ฏธ ์ฌ๋ ค์ ธ ์๋ ์ ์ผ๋ก ์ ํ๋๋ค.
2. ์ ํ ๊ด๊ณ๊ฐ ์๋ ๋ฒกํฐ (Linearly Independent Vectors)
๋ฐ๋๋ก ๊ฐ์ ์ ์์ ์์ง ์์ ๋ฒกํฐ๋ค์ ์ ํ์ ์ผ๋ก ๋ ๋ฆฝ๋์ด ์๋ค๊ณ ํํํ๋ฉฐ, ์ฃผ์ด์ง ๊ณต๊ฐ(2๊ฐ์ ๋ฒกํฐ์ ๊ฒฝ์ฐ R2 ํ๋ฉด)์ ๋ชจ๋ ๋ฒกํฐ๋ฅผ ์กฐํฉ์ ํตํด ๋ง๋ค์ด ๋ผ ์ ์๋ค.
โจ Rank
- ๋งคํธ๋ฆญ์ค์ rank๋, ๋งคํธ๋ฆญ์ค์ ์ด์ ์ด๋ฃจ๊ณ ์๋ ๋ฒกํฐ๋ค๋ก ๋ง๋ค ์ ์๋ (Span) ๊ณต๊ฐ์ ์ฐจ์์ด๋ค.
- ๋งคํธ๋ฆญ์ค์ ์ฐจ์๊ณผ๋ ๋ค๋ฅผ ์๋ ์์ผ๋ฉฐ ๊ทธ ์ด์ ๋ ํ๊ณผ ์ด์ ์ด๋ฃจ๊ณ ์๋ ๋ฒกํฐ๋ค ๊ฐ์ด๋ฐ ์๋ก ์ ํ ๊ด๊ณ๊ฐ ์์ ์๋ ์๊ธฐ ๋๋ฌธ์ด๋ค.
- Rank๋ฅผ ํ์ธํ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์์ง๋ง, ๊ทธ ์ค ํ๋์ธ Gaussian Elimination์ ํตํด ์์๋ณผ ์ ์๋ค.
๐ก Gaussian Elimiantion
Gaussian Elimination์ ์ฃผ์ด์ง ๋งคํธ๋ฆญ์ค๋ฅผ "Row Echelon form"์ผ๋ก ๋ฐ๊พธ๋ ๊ณ์ฐ๊ณผ์ ์ด๋ค.
Row-Echelon form ์ด๋, ๊ฐ ํ์ ๋ํด์ ์ผ์ชฝ์ 1, ๊ทธ ์ดํ ๋ถ๋ถ์ 0์ผ๋ก ์ด๋ฃจ์ด์ง ํํ์ด๋ค.
์ด๋ฌํ ๋งคํธ๋ฆญ์ค๋ ์ผ๋ฐ์ ์ผ๋ก upper-triangular์ ํํ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
๋ง์ง๋ง ์ค์ด [0, 0, 0] ์ด ๋๋ ๊ฒ์ 3๊ฐ์ ํ์ด ์ ํ ๊ด๊ณ๋ฅผ ๊ฐ๋๋ค๋ ์๋ฏธ์ด๋ค.
๋ฐ๋ผ์ ์ฒ์ ์ฃผ์ด์ก๋ ๋งคํธ๋ฆญ์ค์ Rank๋ 2์ด๋ฉฐ, ์ด๋ 3x3 ๋งคํธ๋ฆญ์ค์ด์ง๋ง R3 ๊ณต๊ฐ์ด ์๋ R2๋ง์ ๋ฒกํฐ๋ค๋ก ๋ง๋ค์ด ๋ผ ์ ์์์ ์๋ฏธํ๋ค.
Row Echelon form (ํ ์ฌ๋ค๋ฆฌ๊ผด ํ์) ์ ์กฐ๊ฑด
all zeros row : ๋ชจ๋ ๊ฐ์ด 0์ธ ํ ex) [0, 0, 0]
nonzero row : 1๊ฐ๋ผ๋ 0์ด ์๋ ๊ฐ์ ๊ฐ๊ณ ์๋ ํ ex) [0, 1, 2]
leading entry : nonzero row์์ ๊ฐ์ฅ ์ผ์ชฝ์ ์์นํ nonzero entry ex) [0, 1, 2]์์์ leading entry๋ 1
- ๋ชจ๋ nonzero row๋ all zeros row ๋ณด๋ค ์์ชฝ์ ์์นํด์ผํ๋ค.
- ๊ฐ ํ์ leading entry ๋ ์์ ๋ณด๋ค ์์ชฝ์ ์์นํ ํ์ leading entry ๋ณด๋ค ์ค๋ฅธ์ชฝ์ ์กด์ฌํ๋ค.
- leading entry๋ ๋ฐ๋์ 1 ์ด์ด์ผํ๋ค.
reference.
https://www.youtube.com/watch?v=2GKESu5atVQ
'Boot Camp > section1' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[AIB] Clustering (+ PCA ๊ฐ๋ ) (0) | 2022.02.09 |
---|---|
[AIB] High dimensional Data (0) | 2022.01.06 |
[AIB] Vector/Matrices (0) | 2021.12.20 |
[AIB] Bayesian (0) | 2021.11.02 |
[AIB] Confidence Intervals (0) | 2021.11.02 |