Próbuję napisać TSNE, używając zestawu danych scikit-learn i scikit-learn, ale podczas wyświetlania wyniku chcę prawdziwych obrazów MNIST zamiast kilku kolorowych kropek / wykresów. Używam matplotlib i seaborn
Oto mój kod:
import sklearn
import seaborn as sb
import pandas as pd
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import fetch_mldata
mnist = fetch_mldata("MNIST original")
X = mnist.data / 255.0
y = mnist.target
feat_cols = [ 'pixel' + str(i) for i in range(X.shape[1]) ]
df = pd.DataFrame(X,columns=feat_cols)
df['y'] = y
df['label'] = df['y'].apply(lambda i: str(i))
X, y = None, None
np.random.seed(42)
rndperm = np.random.permutation(df.shape[0])
N= 520000
df_subset = df.loc[rndperm[:N],:].copy()
data_subset = df_subset[feat_cols].values
tsne = TSNE(n_components=2, verbose=1, perplexity=40, n_iter=300)
tsne_results = tsne.fit_transform(data_subset)
df_subset['tsne-2d-one'] = tsne_results[:,0]
df_subset['tsne-2d-two'] = tsne_results[:,1]
plt.figure(figsize=(16,10))
sb.scatterplot(
x="tsne-2d-one", y="tsne-2d-two",
hue="y",
palette=sb.color_palette("hls", 10),
data=df_subset,
legend="full",
alpha=0.3
)
1 odpowiedź
Nie wiem, czy potrafisz zrobić orzeł, czy reszkę tej fabuły, ale jeśli dobrze zrozumiałem twoje pytanie, to właśnie próbujesz zrobić?
from matplotlib.offsetbox import OffsetImage, AnnotationBbox
pixel_cols = df_subset.columns.str.startswith('pixel')
img_w, img_h = 28,28
zoom = 0.5
fig, ax = plt.subplots(figsize=(16,10))
for i,row in df_subset.iterrows():
image = row[pixel_cols].values.astype(float).reshape((img_w, img_h))
im = OffsetImage(image, zoom=zoom)
ab = AnnotationBbox(im, (row["tsne-2d-one"], row["tsne-2d-two"]), xycoords='data', frameon=False)
ax.add_artist(ab)
ax.update_datalim([(row["tsne-2d-one"], row["tsne-2d-two"])])
ax.autoscale()
Ten kod jest oparty na demonstracji pola adnotacji i ta odpowiedź na SO
Podobne pytania
Powiązane pytania
Nowe pytania
python
Python to wielozadaniowy, wielozadaniowy język programowania dynamicznie typowany. Został zaprojektowany tak, aby był szybki do nauczenia się, zrozumienia i użycia oraz wymuszania czystej i jednolitej składni. Należy pamiętać, że Python 2 oficjalnie nie jest obsługiwany od 01-01-2020. Mimo to, w przypadku pytań Pythona specyficznych dla wersji, dodaj znacznik [python-2.7] lub [python-3.x]. Korzystając z wariantu Pythona (np. Jython, PyPy) lub biblioteki (np. Pandas i NumPy), należy umieścić go w tagach.