차원 압축 방법 t-sne을 사용하여 키르미베 아이콘의 관계를 가시화
너 뭐 했어?
t-sNE의 차원 압축 방법을 사용하여 2차원 공간에 키르미베의 아이콘 686장을 그렸다.
PCA 등 기존 방법에 비해 비선형적인 관계를 잘 나타낼 수 있다.
Multicore-TSNE 이 모듈을 사용하면 누구나 쉽게 사용할 수 있습니다.
모티프
요즘 t-SNE라는 단어를 자주 듣는다.
고차원 공간의 비선형 관계를 잘 시각화하는 알고리즘인 것 같다.
고급 원시 공간에서 비선형 관계가 있는 것 같고 각 특징량에 축소 데이터가 잘 있으면 이미지 데이터를 들 수 있다.
다만 MNIST를 비추는 것도 지루하기 때문에kilmy Baby의 공식 홈페이지에 있는 아이콘 이미지 686장을 가볍게 그려봤다.
이른바 t-SNE
대략적으로 말하면 t-sNE는 데이터가 고차원(다차원) 정적 분포에서 발생한다고 가정하고 저차원(2차원 또는 3차원)t분포를 통해 그 확률 분포와 비슷하게 원시 데이터의 차원을 삭감하는 방법이다.
이론적 배경에 관심이 있는 사람은 ALBERT의 블로그't-SNE를 이용한 차원 압축 방법 소개 등을 참고하면 된다.
뭐가 잘못됐어
t-SNE는 비선형 관계를 포착할 수 있다는 점에서 기존 방법보다 우수하다.
고전적인 차원 압축 방법을 말하자면 주요 성분 분석은 주성분 분석을 들 수 있지만 주성분 분석은 분산을 극대화하기 위해 1차원부터 차례대로 차원의 축을 조정하고 각 축의 각도로 데이터의 관계성을 나타낸다.따라서 데이터 간의 비선형 관계를 포착할 수 없다.
어떻게
scikit-learn도 설치되어 있지만, 말한 Multicore-TSNE의 모듈은 고속으로 좋은 느낌인 것 같습니다.
실제로 사용해 보세요.
사용 예
모듈 가져오기
import requests
from bs4 import BeautifulSoup
import cv2
import pathlib
import numpy as np
from MulticoreTSNE import MulticoreTSNE as TSNE
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
from matplotlib.offsetbox import OffsetImage, AnnotationBbox
%matplotlib inline
이미지 가져오기
공식 홈페이지를 확인했는데 이미지 2차 이용에 대해서는 별다른 제한이 없다.url = "http://killmebaby.tv/special_icon.html"
headers = {'User-Agent':'Mozilla/5.0'}
soup = BeautifulSoup(requests.get(url,headers=headers).content,'lxml')
images = [] # 画像リストの空配列
for img in soup.find_all('img'):
print(img.get("src"))
images.append(img.get("src"))
for target in images[8:-1]: # アイコンのpngのみを取得する
re = requests.get(target)
with open('../input/' + target.split('/')[-1], 'wb') as f:
f.write(re.content)
# スクレイピング終了確認
print("画像保存が完了しました。")
이미지를 aray로 변환
OpenCV 사용path = pathlib.Path('../input').glob('*.png')
path_l = [p for p in path]
kills = np.concatenate([cv2.imread(str(p)).flatten().reshape(1,-1) for p in path_l], axis=0)
t_SNE로 압축
perplexity는 분포의 복잡성을 나타내는 매개 변수입니다.
원논문 중 5~50개를 추천한다.tsne = TSNE(n_jobs=4, perplexity=20) # 20が一番いい感じでした
kills_reduced = tsne.fit_transform(kills)
드로잉 결과
def imscatter(x, y, image_list, ax=None, zoom=1):
if ax is None:
ax = plt.gca()
im_list = [OffsetImage(plt.imread(str(p)), zoom=zoom) for p in image_list]
x, y = np.atleast_1d(x, y)
artists = []
for x0, y0, im in zip(x, y, im_list):
ab = AnnotationBbox(im, (x0, y0), xycoords='data', frameon=False)
artists.append(ax.add_artist(ab))
ax.update_datalim(np.column_stack([x, y]))
ax.autoscale()
return artists
# perplexity: 20
fig, ax = plt.subplots(figsize=(30,30))
imscatter(kills_reduced[:,0], kills_reduced[:,1], path_l, ax=ax, zoom=0.4)
plt.show()
평가명(다갈색머리 아이)과 소냐(노란색머리 아이)와 아야리(짙은 파란색머리 아이, 좌표[3,17] 근처)가 예쁘게 갈라진 것을 알 수 있다.
캐릭터별로 분류하기보다는 이미지 전체의 색깔로 분류한다.
매우 비슷한 구도(좌표[11,3],[11,10] 등)는 곡선을 그리듯 표현해 인상적이다.
2축이 표시하는 공간에 많은 분류가 존재하기 때문에 이미지 데이터 간의 비선형 관계가 잘 표현되었음을 알 수 있다.
참조로 PCA를 사용할 때는 다음 그림과 같습니다.pca = PCA()
kills_pca = pca.fit_transform(kills)
fig, ax = plt.subplots(figsize=(30,30))
imscatter(kills_pca[:,0], kills_pca[:,1], path_l, ax=ax, zoom=0.4)
plt.show()
요즘 t-SNE라는 단어를 자주 듣는다.
고차원 공간의 비선형 관계를 잘 시각화하는 알고리즘인 것 같다.
고급 원시 공간에서 비선형 관계가 있는 것 같고 각 특징량에 축소 데이터가 잘 있으면 이미지 데이터를 들 수 있다.
다만 MNIST를 비추는 것도 지루하기 때문에kilmy Baby의 공식 홈페이지에 있는 아이콘 이미지 686장을 가볍게 그려봤다.
이른바 t-SNE
대략적으로 말하면 t-sNE는 데이터가 고차원(다차원) 정적 분포에서 발생한다고 가정하고 저차원(2차원 또는 3차원)t분포를 통해 그 확률 분포와 비슷하게 원시 데이터의 차원을 삭감하는 방법이다.
이론적 배경에 관심이 있는 사람은 ALBERT의 블로그't-SNE를 이용한 차원 압축 방법 소개 등을 참고하면 된다.
뭐가 잘못됐어
t-SNE는 비선형 관계를 포착할 수 있다는 점에서 기존 방법보다 우수하다.
고전적인 차원 압축 방법을 말하자면 주요 성분 분석은 주성분 분석을 들 수 있지만 주성분 분석은 분산을 극대화하기 위해 1차원부터 차례대로 차원의 축을 조정하고 각 축의 각도로 데이터의 관계성을 나타낸다.따라서 데이터 간의 비선형 관계를 포착할 수 없다.
어떻게
scikit-learn도 설치되어 있지만, 말한 Multicore-TSNE의 모듈은 고속으로 좋은 느낌인 것 같습니다.
실제로 사용해 보세요.
사용 예
모듈 가져오기
import requests
from bs4 import BeautifulSoup
import cv2
import pathlib
import numpy as np
from MulticoreTSNE import MulticoreTSNE as TSNE
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
from matplotlib.offsetbox import OffsetImage, AnnotationBbox
%matplotlib inline
이미지 가져오기
공식 홈페이지를 확인했는데 이미지 2차 이용에 대해서는 별다른 제한이 없다.url = "http://killmebaby.tv/special_icon.html"
headers = {'User-Agent':'Mozilla/5.0'}
soup = BeautifulSoup(requests.get(url,headers=headers).content,'lxml')
images = [] # 画像リストの空配列
for img in soup.find_all('img'):
print(img.get("src"))
images.append(img.get("src"))
for target in images[8:-1]: # アイコンのpngのみを取得する
re = requests.get(target)
with open('../input/' + target.split('/')[-1], 'wb') as f:
f.write(re.content)
# スクレイピング終了確認
print("画像保存が完了しました。")
이미지를 aray로 변환
OpenCV 사용path = pathlib.Path('../input').glob('*.png')
path_l = [p for p in path]
kills = np.concatenate([cv2.imread(str(p)).flatten().reshape(1,-1) for p in path_l], axis=0)
t_SNE로 압축
perplexity는 분포의 복잡성을 나타내는 매개 변수입니다.
원논문 중 5~50개를 추천한다.tsne = TSNE(n_jobs=4, perplexity=20) # 20が一番いい感じでした
kills_reduced = tsne.fit_transform(kills)
드로잉 결과
def imscatter(x, y, image_list, ax=None, zoom=1):
if ax is None:
ax = plt.gca()
im_list = [OffsetImage(plt.imread(str(p)), zoom=zoom) for p in image_list]
x, y = np.atleast_1d(x, y)
artists = []
for x0, y0, im in zip(x, y, im_list):
ab = AnnotationBbox(im, (x0, y0), xycoords='data', frameon=False)
artists.append(ax.add_artist(ab))
ax.update_datalim(np.column_stack([x, y]))
ax.autoscale()
return artists
# perplexity: 20
fig, ax = plt.subplots(figsize=(30,30))
imscatter(kills_reduced[:,0], kills_reduced[:,1], path_l, ax=ax, zoom=0.4)
plt.show()
평가명(다갈색머리 아이)과 소냐(노란색머리 아이)와 아야리(짙은 파란색머리 아이, 좌표[3,17] 근처)가 예쁘게 갈라진 것을 알 수 있다.
캐릭터별로 분류하기보다는 이미지 전체의 색깔로 분류한다.
매우 비슷한 구도(좌표[11,3],[11,10] 등)는 곡선을 그리듯 표현해 인상적이다.
2축이 표시하는 공간에 많은 분류가 존재하기 때문에 이미지 데이터 간의 비선형 관계가 잘 표현되었음을 알 수 있다.
참조로 PCA를 사용할 때는 다음 그림과 같습니다.pca = PCA()
kills_pca = pca.fit_transform(kills)
fig, ax = plt.subplots(figsize=(30,30))
imscatter(kills_pca[:,0], kills_pca[:,1], path_l, ax=ax, zoom=0.4)
plt.show()
t-SNE는 비선형 관계를 포착할 수 있다는 점에서 기존 방법보다 우수하다.
고전적인 차원 압축 방법을 말하자면 주요 성분 분석은 주성분 분석을 들 수 있지만 주성분 분석은 분산을 극대화하기 위해 1차원부터 차례대로 차원의 축을 조정하고 각 축의 각도로 데이터의 관계성을 나타낸다.따라서 데이터 간의 비선형 관계를 포착할 수 없다.
어떻게
scikit-learn도 설치되어 있지만, 말한 Multicore-TSNE의 모듈은 고속으로 좋은 느낌인 것 같습니다.
실제로 사용해 보세요.
사용 예
모듈 가져오기
import requests
from bs4 import BeautifulSoup
import cv2
import pathlib
import numpy as np
from MulticoreTSNE import MulticoreTSNE as TSNE
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
from matplotlib.offsetbox import OffsetImage, AnnotationBbox
%matplotlib inline
이미지 가져오기
공식 홈페이지를 확인했는데 이미지 2차 이용에 대해서는 별다른 제한이 없다.url = "http://killmebaby.tv/special_icon.html"
headers = {'User-Agent':'Mozilla/5.0'}
soup = BeautifulSoup(requests.get(url,headers=headers).content,'lxml')
images = [] # 画像リストの空配列
for img in soup.find_all('img'):
print(img.get("src"))
images.append(img.get("src"))
for target in images[8:-1]: # アイコンのpngのみを取得する
re = requests.get(target)
with open('../input/' + target.split('/')[-1], 'wb') as f:
f.write(re.content)
# スクレイピング終了確認
print("画像保存が完了しました。")
이미지를 aray로 변환
OpenCV 사용path = pathlib.Path('../input').glob('*.png')
path_l = [p for p in path]
kills = np.concatenate([cv2.imread(str(p)).flatten().reshape(1,-1) for p in path_l], axis=0)
t_SNE로 압축
perplexity는 분포의 복잡성을 나타내는 매개 변수입니다.
원논문 중 5~50개를 추천한다.tsne = TSNE(n_jobs=4, perplexity=20) # 20が一番いい感じでした
kills_reduced = tsne.fit_transform(kills)
드로잉 결과
def imscatter(x, y, image_list, ax=None, zoom=1):
if ax is None:
ax = plt.gca()
im_list = [OffsetImage(plt.imread(str(p)), zoom=zoom) for p in image_list]
x, y = np.atleast_1d(x, y)
artists = []
for x0, y0, im in zip(x, y, im_list):
ab = AnnotationBbox(im, (x0, y0), xycoords='data', frameon=False)
artists.append(ax.add_artist(ab))
ax.update_datalim(np.column_stack([x, y]))
ax.autoscale()
return artists
# perplexity: 20
fig, ax = plt.subplots(figsize=(30,30))
imscatter(kills_reduced[:,0], kills_reduced[:,1], path_l, ax=ax, zoom=0.4)
plt.show()
평가명(다갈색머리 아이)과 소냐(노란색머리 아이)와 아야리(짙은 파란색머리 아이, 좌표[3,17] 근처)가 예쁘게 갈라진 것을 알 수 있다.
캐릭터별로 분류하기보다는 이미지 전체의 색깔로 분류한다.
매우 비슷한 구도(좌표[11,3],[11,10] 등)는 곡선을 그리듯 표현해 인상적이다.
2축이 표시하는 공간에 많은 분류가 존재하기 때문에 이미지 데이터 간의 비선형 관계가 잘 표현되었음을 알 수 있다.
참조로 PCA를 사용할 때는 다음 그림과 같습니다.pca = PCA()
kills_pca = pca.fit_transform(kills)
fig, ax = plt.subplots(figsize=(30,30))
imscatter(kills_pca[:,0], kills_pca[:,1], path_l, ax=ax, zoom=0.4)
plt.show()
모듈 가져오기
import requests
from bs4 import BeautifulSoup
import cv2
import pathlib
import numpy as np
from MulticoreTSNE import MulticoreTSNE as TSNE
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
from matplotlib.offsetbox import OffsetImage, AnnotationBbox
%matplotlib inline
이미지 가져오기
공식 홈페이지를 확인했는데 이미지 2차 이용에 대해서는 별다른 제한이 없다.
url = "http://killmebaby.tv/special_icon.html"
headers = {'User-Agent':'Mozilla/5.0'}
soup = BeautifulSoup(requests.get(url,headers=headers).content,'lxml')
images = [] # 画像リストの空配列
for img in soup.find_all('img'):
print(img.get("src"))
images.append(img.get("src"))
for target in images[8:-1]: # アイコンのpngのみを取得する
re = requests.get(target)
with open('../input/' + target.split('/')[-1], 'wb') as f:
f.write(re.content)
# スクレイピング終了確認
print("画像保存が完了しました。")
이미지를 aray로 변환
OpenCV 사용
path = pathlib.Path('../input').glob('*.png')
path_l = [p for p in path]
kills = np.concatenate([cv2.imread(str(p)).flatten().reshape(1,-1) for p in path_l], axis=0)
t_SNE로 압축
perplexity는 분포의 복잡성을 나타내는 매개 변수입니다.
원논문 중 5~50개를 추천한다.
tsne = TSNE(n_jobs=4, perplexity=20) # 20が一番いい感じでした
kills_reduced = tsne.fit_transform(kills)
드로잉 결과
def imscatter(x, y, image_list, ax=None, zoom=1):
if ax is None:
ax = plt.gca()
im_list = [OffsetImage(plt.imread(str(p)), zoom=zoom) for p in image_list]
x, y = np.atleast_1d(x, y)
artists = []
for x0, y0, im in zip(x, y, im_list):
ab = AnnotationBbox(im, (x0, y0), xycoords='data', frameon=False)
artists.append(ax.add_artist(ab))
ax.update_datalim(np.column_stack([x, y]))
ax.autoscale()
return artists
# perplexity: 20
fig, ax = plt.subplots(figsize=(30,30))
imscatter(kills_reduced[:,0], kills_reduced[:,1], path_l, ax=ax, zoom=0.4)
plt.show()
평가명(다갈색머리 아이)과 소냐(노란색머리 아이)와 아야리(짙은 파란색머리 아이, 좌표[3,17] 근처)가 예쁘게 갈라진 것을 알 수 있다.
캐릭터별로 분류하기보다는 이미지 전체의 색깔로 분류한다.
매우 비슷한 구도(좌표[11,3],[11,10] 등)는 곡선을 그리듯 표현해 인상적이다.
2축이 표시하는 공간에 많은 분류가 존재하기 때문에 이미지 데이터 간의 비선형 관계가 잘 표현되었음을 알 수 있다.
참조로 PCA를 사용할 때는 다음 그림과 같습니다.
pca = PCA()
kills_pca = pca.fit_transform(kills)
fig, ax = plt.subplots(figsize=(30,30))
imscatter(kills_pca[:,0], kills_pca[:,1], path_l, ax=ax, zoom=0.4)
plt.show()
모든 캐릭터의 집합이라는 비선형 관계를 잘 표현할 수 없다.
perplexity를 바꾸면 무슨 일이 일어날지
Perplexity를 바꾸면 줄거리가 어떻게 변할지 시도해 보세요.# perplexity: 10
tsne = TSNE(n_jobs=4, perplexity=10)
kills_reduced = tsne.fit_transform(kills)
fig, ax = plt.subplots(figsize=(30,30))
imscatter(kills_reduced[:,0], kills_reduced[:,1], path_l, ax=ax, zoom=0.4)
plt.show()
퍼플시티를 낮추면 줄거리의 응집도가 높아진 것 같아요.#perplexity: 1000
fig, ax = plt.subplots(figsize=(30,30))
imscatter(kills_reduced[:,0], kills_reduced[:,1], path_l, ax=ax, zoom=0.4)
plt.show()
perplexity를 높이면 그림이 가득 그려집니다.
t-SNE의 응용 대상
머신러닝 모형의 특징량 제작에 못 쓰는 것도 아니지만, 손님과 상사에게 플롯을 보여준 결과'왠지 모르지만 대단해 보인다'는 사용법이 가장 빨랐다.
분류 문제 등에서'왜 이 특징량이 유효/작용하지 않는가'등 설명은 설득성이 있거나 특징량이 너무 많아 산포도 행렬을 그릴 수 없는 경우 이를 신속하게 가시화할 수 있다.
복잡한 분류 모델을 만들기 전에 사용하는 특징량이 정말 사용할 수 있는지, 아니면 인터페이스를 설치하는 데도 사용할 수 있는지.
※ 개인 소감
총결산
# perplexity: 10
tsne = TSNE(n_jobs=4, perplexity=10)
kills_reduced = tsne.fit_transform(kills)
fig, ax = plt.subplots(figsize=(30,30))
imscatter(kills_reduced[:,0], kills_reduced[:,1], path_l, ax=ax, zoom=0.4)
plt.show()
#perplexity: 1000
fig, ax = plt.subplots(figsize=(30,30))
imscatter(kills_reduced[:,0], kills_reduced[:,1], path_l, ax=ax, zoom=0.4)
plt.show()
머신러닝 모형의 특징량 제작에 못 쓰는 것도 아니지만, 손님과 상사에게 플롯을 보여준 결과'왠지 모르지만 대단해 보인다'는 사용법이 가장 빨랐다.
분류 문제 등에서'왜 이 특징량이 유효/작용하지 않는가'등 설명은 설득성이 있거나 특징량이 너무 많아 산포도 행렬을 그릴 수 없는 경우 이를 신속하게 가시화할 수 있다.
복잡한 분류 모델을 만들기 전에 사용하는 특징량이 정말 사용할 수 있는지, 아니면 인터페이스를 설치하는 데도 사용할 수 있는지.
※ 개인 소감
총결산
끝맺다
('키르미베'라벨이 있는 것 같은데)
Reference
이 문제에 관하여(차원 압축 방법 t-sne을 사용하여 키르미베 아이콘의 관계를 가시화), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/hanon/items/ccc9acff10b647387dca
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(차원 압축 방법 t-sne을 사용하여 키르미베 아이콘의 관계를 가시화), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/hanon/items/ccc9acff10b647387dca텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)