본문 바로가기
[코드스테이츠]AI

[AI 부트캠프]3주차 총 복습

by b___gly 2022. 4. 26.

이걸 이제야 쓰다니....프젝까지 다 끝나고.....

우선 감상부터 쓰겠다....

3주차때 멘탈 나간 거 인정하겠다...

문과로써 대학에 처음 가서 들은 자연계 과목이 기초수학(선형대수)였고, 행렬 열심히 더하고 빼고 하는 거 재밌어서 열심히 들었던 기억이 있다. 그러다 벡터 개념 나오면서 차원..? 무슨 차원...? 이러다 과감히 때려치웠더랬다.

나에게 벡터는 그런 녀석...

통계를 공부할 때도 우린 주어진 데이터를 표준편차 구하고 오차 구하고 최소제곱법 가지고 유의미한 숫자를 뽑아내는 것에 집중했지, 그 데이터를 직접 가공할 일이 적었다. 그래서 솔직히 너무 어려웠다.

내용이 어려운게 아니라 뭔지 알겠는데, 뭔지 모르겠는... 가장 위험한 상태였다고 할 수 있겠다.

확실히 깨달았다. 데이터 사이언티스트는 아니다. 애널리스트가 맞구나.

직접 데이터를 가공하는 건 흥미가 없다. (근데 사실 데이터를 분석하는 것도 그렇게 즐겁지 않다.)

 

그리고 이번에 알게된 것, 스프린트를 끝낼 때 마다 총정리 해주시는 분이 계시는데, 그 분이 왜 팀장인지 알겠더라....

설명 기깔나게 해주시더라.

물론 수강생들 각자의 백그라운드가 달라서 이해가 안 되는 부분도, 쉽게 이해하고 넘어가는 부분도 달랐지만,

기본 개념을 짚어주실 때, 느낌이 확 왔다. 이 분은 진짜 다 아는 거다.

강사를 해본 사람으로써 그 정도로 쉽게 얘기하려면 최소 그 분야에서 5년 이상 고민해봐야한다는 것. 

만약에 데이터 애널리스트로써 흥미가 안 생기면 이런 코딩 교육하는 데 취업을 해도 되겠다 싶었다. 

그런 사람이라면 돼보고 싶기도 했다. 

 


  • 행렬 기본 파이썬 문법
#sum
np.dot(a,b)

#transpose
df.T

#determinant
linalg.det(df)

#inverse
np.linalg.inv(df)

#norm
np.linalg.norm(df)
  • 스칼라는 상수, 벡터는 곱해지는 대상(컴포넌트라 불리는 원소가 순서를 가지는 것)
  • Determinant : 행렬의 부피라고 보는 게 가장 가까운 듯. 디터미넌트가 0이라는 건 부피가 없다. 즉, 선형관계에 있다. 
  • ddof는 자유도, ddof = 0는 모집단, ddof = 1는 표본

 

  • 공분산(데이터 크기에 영향 받음)과 상관계수(0~1사이의 값)
#공분산
np.cov(a,b)[0,1]

#상관계수
np.corrcoef(a,b)[0,1]
  • Orthogonality : 서로 수직인 상태. 내적이 0인것으로 판별.
  • Span : 주어진 벡터의 조합으로 만들 수 있는 모든 가능한 벡터의 집합. 선형 종속이면 선, 선형 독립이면 면.
  • Rank : Span의 차원. 행렬 안의 벡터들끼리 선형 종속일 수도 있기 때문에 행렬의 차원과는 다를 수 있음.
  • basis : 기저. 벡터 공간을 생성하는 선형독립인 벡터들. span의 역개념.
  • 선형독립 : 벡터들을 더해서 0을 못 만듬. / 선형종속 : 벡터들을 더해서 0을 만들 수 있음.
  • span: 하나 이상의 벡터들로 만들 수 있는 공간의 집합(n차원의 공간)
    rank: span의 차원의 수(n차원의 공간에서의 n)
    • rank는 행렬의 연산으로 나온 수치이다. rank를 통해서 가역행렬인지 판단할 수 있고, 연립방정식 형태일 때 해가 몇 개가 있는지 판단할 수 있는 등 하나의 수단으로 사용되는 수치라고 할 수 있다.
    • rank의 여러 성질 중 하나가 어떤 행렬의 rank의 값은 그 행렬의 span의 같은 것이다.
    • 결과적으론 rank 값과 span 값은 같지만, span은 어떠한 매트릭스에서 각 벡터가 선형결합하여 만들수 있는 공간의 차원을 나타내게 되고, rank는 행렬의 특정한 연산 중 하나라는 점에서 차이점이 있다.
    • (출처)https://velog.io/@yuns_u/%EB%8B%A8%EC%9C%84%EB%B2%A1%ED%84%B0-%EA%B8%B0%EC%A0%80%EB%B2%A1%ED%84%B0-span-rank-linear-projections
#span구하기
np.linalg.matrix_rank(df)

 

  • transformation : 스칼라들을 유닛벡터에 곱해주는 과정.
  • 고유벡터(Eigenvectot), 고유값(Eigenvalue) : 고차원의(많은 feature) 데이터를 효과적으로 줄이기 위해 추출할 필요가 있음. 얼마만큼의 tranformation 됐는지를 알고싶어서 아이겐 벡터를 찾는 것. 그리고 transformation 된 정도가 아이겐 밸류
#eigenvalue, eigenvector
value, vector = np.linalg.eig(X)
  • PCA
    • 더 많은 feature를 넣으면 상대적으로 부정확해짐
    • 오버플로우 문제를 예방할 수 있음
    • 같은 정보를 담고 있는 feature가 중복될 수도 있음
    • PCA 데이터를 파악할 때 쓰는 게 아니고 결과를 예측하고 싶을 때 쓰는 것이다
  • 가장 큰 아이겐 밸류(unit에다가 공분산 매트릭스를 해준 걸 아이겐 벡터와 밸류를 찾음)를 가지도록 pca를 함
  • 사실 지금도 팍 안 옴. 나중에 다시 이해해보면 또 괜찮지 않을까....
#PCA 코드
from sklearn.preprocessing import StandardScaler, Normalizer
from sklearn.decomposition import PCA

scaler = StandardScaler()
Z = scaler.fit_transform(X)
pca = PCA(2)
pca.fit(Z)
B = pca.transform(Z)

 

  • Scree plot : 담고있는 분산(Variance)이 7~80% 정도면 괜찮으니까 그 정도의 PCA 개수로 골라야함.
import matplotlib.pyplot as plt
def scree_plot(pca):
    num_components = len(pca.explained_variance_ratio_)
    ind = np.arange(num_components)
    vals = pca.explained_variance_ratio_
    
    ax = plt.subplot()
    cumvals = np.cumsum(vals)
    
    print(cumvals)
    
    ax.bar(ind, vals, color = ['#00da75', '#f1c40f']) # Bar plot
    ax.plot(ind, cumvals, color = '#c0392b') # Line plot 
    
    for i in range(num_components):
        ax.annotate(r"%s" % ((str(vals[i]*100)[:3])), (ind[i], vals[i]), va = "bottom", ha = "center", fontsize = 13)
     
    ax.set_xlabel("PC")
    ax.set_ylabel("Variance")
    plt.title('Scree plot')
    
scree_plot(pc)
  • elbow methods : 기울기가 완만해지기 시작하는 지점의 숫자를 cluster의 개수로 골라야함.
import matplotlib.pyplot as plt
sum_of_squared_distances = []
K = range(1, 15)
for k in K:
    km = KMeans(n_clusters = k)
    km = km.fit(points)
    sum_of_squared_distances.append(km.inertia_)
    
plt.plot(K, sum_of_squared_distances, 'bx-')
plt.xlabel('k')
plt.ylabel('Sum_of_squared_distances')
plt.title('Elbow Method For Optimal k')
plt.show()
  • k-means 
from sklearn.cluster import KMeans
#클러스터 개수 정해주기
km = KMeans(4)
# x, y로 맞춤
kmeans = km.fit(points[['x','y']])
#라벨 붙여주고
points['cluster_id'] = kmeans.labels_
#시각화
sns.scatterplot(x = 'x', y = 'y', data = points, hue='cluster_id', palette='RdYlBu_r')

댓글