728x90
반응형
In [1]:
import numpy as np
In [6]:
X = np.array([[1,1,0,0,0],
[0,1,0,0,0],
[0,0,1,0,0],
[0,0,0,1,0],
[0,0,0,0,1]])
In [14]:
# 데이터, shape, 차원
# Document Term matrix
# Row: Documents(5)
# Column: Term(5)
X , X.shape, X.ndim
Out[14]:
In [16]:
# 단어에 대해서 단어 레벨을 곱해주는 것
# 내적은 코사인 시밀러티의 기반이됨
X[0],X.T[0]
Out[16]:
In [18]:
# TDM
# 행이 단어
X.T
Out[18]:
In [33]:
# 0~5번째 0~5번째 문서의 내적으로 만들어진 5X5행렬이 나오게 됨
# 대각을 기준으로 대칭적임
# 대각은 1이 됨 ( cosine similarity 이기 때문에 : 그냥 같은 문서라 똑같아서 1 )
X.dot(X)
Out[33]:
In [27]:
X.T[0].reshape(1,5).shape, X[:,[0]].shape
Out[27]:
In [28]:
X.T[0] # 0번째 문서
Out[28]:
In [30]:
X[:,0] # 0번째 문서
X[:,1] # 1번째 문서
Out[30]:
In [35]:
X.T[0].dot(X[:,1] )
Out[35]:
In [39]:
# 자기 자신을 다 곱한것.
# 0행 x 0행
# cosine
# cos(X,Y) = innerproduct(X,Y) / len(X)len(Y)
_X = X.dot(X.T)
In [41]:
X
Out[41]:
In [42]:
# 거리
np.linalg.norm(X[0])
# = sqrt(1^2+1^2) = sqrt(2)의 값
Out[42]:
In [43]:
np.linalg.norm(X, axis=1) # 행별로 자기 자신의 곱
# 각각 문서에 대한 길이
# 위의 len(x)가 된 것.
Out[43]:
In [44]:
np.linalg.norm(X.T, axis=0) # transpose하고 열단위로 계산 , len(y)
# 둘의 곱셈을 위해 (1,5)로 reshape
Out[44]:
In [46]:
np.linalg.norm(X, axis=1).reshape(5,1) * np.linalg.norm(X.T, axis=0).reshape(1,5)
Out[46]:
In [48]:
_X / (np.linalg.norm(X, axis=1).reshape(5,1) * np.linalg.norm(X.T, axis=0).reshape(1,5))
# 1번2번이 그나마 연관이 있는 것.
# 나머지는 그냥 자기자신과 연관
Out[48]:
In [49]:
X
Out[49]:
In [51]:
np.linalg.svd(_X)
Out[51]:
In [101]:
C = np.array([[1,0,1,0,0,0],
[0,1,0,0,0,0],
[1,1,0,0,0,0],
[1,0,0,1,1,0],
[0,0,0,1,0,1]
])
In [102]:
C.shape
Out[102]:
In [103]:
# False로 해야 차원을 맞춤
U,sigma,Vt = np.linalg.svd(C,full_matrices=False)
In [104]:
U.shape,sigma.shape,Vt.shape
Out[104]:
In [105]:
np.round(Vt)
Out[105]:
In [106]:
# K*K 형태로 만들어줘야함
sigma
Out[106]:
In [107]:
_sigma = np.diag(sigma)
_sigma
Out[107]:
In [108]:
_C = U.dot(_sigma).dot(Vt)
In [109]:
# 원본과 같다.
C == np.round(_C)
Out[109]:
In [110]:
np.round(U.dot(_sigma))
# 열에서 1들로 묶어서 cluster에서 중요한지를 표현함
Out[110]:
In [111]:
np.round(U)
Out[111]:
In [112]:
V = ["ship","boat","ocean","wood","tree"]
In [113]:
import pandas as pd
In [114]:
pd.DataFrame(U.dot(_sigma), index=V)
Out[114]:
In [115]:
sigma[:2] # K = min(m,n) / 클러스터의 수, 잠재의미의 수
Out[115]:
In [116]:
_sigma = np.diag(sigma[:2])
_sigma
Out[116]:
In [117]:
# shape 맞추려고 자름
U[:,:2].dot(_sigma)
Out[117]:
In [118]:
Vt[:2,:].shape
Out[118]:
In [127]:
# 2차원으로 줄이고 복구한 것
# 원본 정보를 아주 조금 손실함
# 즉 차원을 줄여도 큰 영향이 없다는 것을 말한다.
pd.DataFrame(U[:,:2].dot(_sigma.dot(Vt[:2,:])), index=V)
Out[127]:
In [128]:
pd.DataFrame(U.dot(np.diag(sigma)).dot(Vt),index=V)
Out[128]:
In [129]:
# 위의 세 개 다 같아야함
pd.DataFrame(C,index=V)
Out[129]:
In [130]:
U, sigma, Vt
Out[130]:
In [134]:
U.shape, np.diag(sigma).shape
Out[134]:
In [135]:
# latent semantic 차원에서의 단어의 중요도
_U = U.dot(np.diag(sigma))
In [138]:
np.round(_U)
Out[138]:
In [141]:
# Cosine similarity
pd.DataFrame(_U.dot(_U.T) / (np.linalg.norm(_U, axis=1).reshape(5,1) * np.linalg.norm(_U.T, axis=0).reshape(1,5)),index=V,columns=V)
Out[141]:
In [181]:
# K = 2 바꾸기
# detail을 조금 잘라낸 것
# K차원을 낮추니 애매했던 것들이 명확해짐
_U = U[:,:2].dot(_sigma)
In [143]:
pd.DataFrame(_U.dot(_U.T) / (np.linalg.norm(_U, axis=1).reshape(5,1) * np.linalg.norm(_U.T, axis=0).reshape(1,5)),index=V,columns=V)
Out[143]:
In [169]:
_U = np.diag(sigma).dot(Vt)
In [170]:
# 열이 문서차원
_U.shape
Out[170]:
In [171]:
# 문서
pd.DataFrame(_U.T.dot(_U) / (np.linalg.norm(_U.T, axis=1).reshape(6,1) * np.linalg.norm(_U, axis=0).reshape(1,6)))
Out[171]:
In [180]:
# K = 2 바꾸기
_U = _sigma.dot(Vt[:2,:])
_U.shape
Out[180]:
In [177]:
# 1,2문서가 가까움
# 차원을 줄이면서 정보를 버리게 되면서 관계를 찾아내게 됨.
pd.DataFrame(_U.T.dot(_U) / (np.linalg.norm(_U.T, axis=1).reshape(6,1) * np.linalg.norm(_U, axis=0).reshape(1,6)))
Out[177]:
In [183]:
_U = U[:,:2].dot(_sigma)
In [185]:
cluster = pd.DataFrame(_U,index=V)
cluster
Out[185]:
In [193]:
temp = cluster.sort_values(by=[1],ascending=False)
temp[temp[1] > 0 ][1].to_dict()
Out[193]:
In [196]:
temp = cluster.sort_values(by=[0],ascending=False)
temp[temp[0] > 0 ][0].to_dict()
Out[196]:
In [301]:
# DTM
voca = ['cute','kitty','eat','rice','cake','hamster','bread']
docu = ['A','B','C','D','E','F']
D = np.array([[1,1,0,0,0,0,0],
[0,0,1,1,1,0,0],
[0,1,0,0,0,1,0],
[0,0,1,0,0,0,1],
[0,0,0,1,1,0,1],
[1,0,1,0,1,1,1]])
In [302]:
U,sigma,Vt = np.linalg.svd(D.T,full_matrices=False)
In [303]:
U.shape, sigma.shape, Vt.shape
Out[303]:
In [304]:
_sigma = np.diag(sigma)
_sigma.shape
Out[304]:
In [306]:
_D = np.round(U.dot(_sigma.dot(Vt)))
pd.DataFrame(_D,index=voca,columns=docu)
Out[306]:
In [307]:
U.shape
Out[307]:
In [308]:
pd.DataFrame(U.dot(_sigma),index=voca,columns=docu)
Out[308]:
In [309]:
_sigma = np.diag(sigma[:2])
_sigma
Out[309]:
In [310]:
U[:,:2].dot(_sigma)
Out[310]:
In [311]:
# K = 2
pd.DataFrame(U[:,:2].dot(_sigma.dot(Vt[:2,:])), index=voca,columns=docu)
Out[311]:
In [313]:
# 원래
pd.DataFrame(U.dot(np.diag(sigma)).dot(Vt),index=voca,columns=docu)
Out[313]:
In [314]:
_U = U.dot(np.diag(sigma))
_U.shape
Out[314]:
In [315]:
# 단어간의
# Cosine similarity
pd.DataFrame(_U.dot(_U.T) / (np.linalg.norm(_U, axis=1).reshape(7,1) * np.linalg.norm(_U.T, axis=0).reshape(1,7)),index=voca,columns=voca)
Out[315]:
In [316]:
# K = 2
# 단어 관계 찾기
_U = U[:,:2].dot(_sigma)
In [317]:
_U.shape
Out[317]:
In [318]:
pd.DataFrame(_U.dot(_U.T) / (np.linalg.norm(_U, axis=1).reshape(7,1) * np.linalg.norm(_U.T, axis=0).reshape(1,7)),index=voca,columns=voca)
Out[318]:
In [264]:
_U = np.diag(sigma).dot(Vt)
In [265]:
# 열이 문서차원
_U.shape
Out[265]:
In [300]:
# 문서에 대해서
pd.DataFrame(_U.T.dot(_U) / (np.linalg.norm(_U.T, axis=1).reshape(6,1) * np.linalg.norm(_U, axis=0).reshape(1,6)),index=docu,columns=docu)
Out[300]:
In [298]:
# K = 2 바꾸기
_U = _sigma.dot(Vt[:2,:])
_U.shape
Out[298]:
In [299]:
# 1,3 / 3,5문서가 가까움
# 차원을 줄이면서 정보를 버리게 되면서 관계를 찾아내게 됨.
pd.DataFrame(_U.T.dot(_U) / (np.linalg.norm(_U.T, axis=1).reshape(6,1) * np.linalg.norm(_U, axis=0).reshape(1,6)),index=docu,columns=docu)
Out[299]:
In [285]:
# K = 2
_sigma = np.diag(sigma[:2])
_U = U[:,:2].dot(_sigma)
In [286]:
cluster = pd.DataFrame(_U,index=voca)
cluster
Out[286]:
In [287]:
temp = cluster.sort_values(by=[1],ascending=False)
temp[temp[1] > 0 ][1].to_dict()
Out[287]:
In [319]:
# 다 -라 값이 나오지 않음
temp = cluster.sort_values(by=[1],ascending=False)
temp[temp[1] < 0][1].to_dict()
Out[319]:
728x90
반응형