如何在我的 Colab 笔记本上实现基于 FFT 加速插值的 t-SNE (FIt-SNE)?
我试图在狗情绪的kaggle数据集上计算t-SNE, 我首先尝试获取第一个组件。
pc = 60
pca = decomposition.PCA(n_components=pc)
_ = pca.fit(images)
imgPCA = pca.transform(images)
tsne = TSNE(n_components=2)
Z = tsne.fit_transform(imgPCA)
plot_embedding(Z)
然后我尝试了多核t-SNE来提高迭代次数,但我仍然不喜欢它
!pip install git+https://github.com/DmitryUlyanov/Multicore-TSNE.git
from MulticoreTSNE import MulticoreTSNE
Z = MulticoreTSNE(n_jobs=4, n_iter=10000).fit_transform(imgPCA)
plot_embedding(Z, show_axis = True)
现在我想尝试使用FIt-SNE,但我不知道如何使用它,你能帮助我吗? 或者,如果您愿意,也许您可以帮助改进之前的代码片段。
有代码可以理解数据集的格式:
import pandas as pd
import cv2
img_size = (192,192,3)
num_px = img_size[0] * img_size[1] * img_size[2]
directory = '/content/drive/MyDrive/Colab Notebooks/ML/Dog_Emotion/'
images = []
labels = []
labels_df = pd.read_csv(directory + "labels.csv")
n_images = 0
for image in tqdm(labels_df.iloc, desc = "loading images", unit = "images", total = 4000):
images.append(np.asarray(cv2.resize(cv2.imread(directory + image[2] + '/' + image[1], cv2.IMREAD_COLOR), img_size[0:2])[:, :, ::-1]))
labels.append(image[2])
images, labels = np.array(images).reshape(4000, num_px), np.array(labels)
print(f'labels shape: {labels.shape}')
print(f'images shape: {images.shape}')
print(f'images size: {img_size}')
def plot_embedding(Z, show_axis="False"):
plt.figure(figsize=(10, 8))
map = {label: i for i, label in enumerate(np.unique(labels))}
color = np.array([map[l] for l in labels])
plt.scatter(Z[:, 0], Z[:, 1], c = color, cmap = "jet")
plt.colorbar()
plt.title('2d t-SNE Visualization')
if not show_axis:
plt.axis("off")
plt.axis("equal")
plt.show()
标签形状:(4000,) 图像形状:(4000, 110592) 图片尺寸:(192, 192, 3)
当数据标准化时,PCA 和 t-SNE 通常表现更好。在应用 PCA 之前,请确保像素值从 0 缩放到 1。这有助于将数据以零为中心并标准化比例。
为 PCA 选择 60 个分量可能是合适的,但您可以尝试不同的数字以查看它们如何影响 t-SNE 结果。根据捕获的方差量,组件越少可能越好。例如,您可以从 4 开始,逐渐增加到 8、16、24...,然后看看哪一个效果最好。
我还需要提到 t-SNE 有几个可以调整的参数: 困惑:影响 t-SNE 如何平衡数据的局部特征和全局特征之间的注意力。 (典型值范围在 5 到 50 之间。) Learning_rate:我认为默认是200,但你可能也需要调整它。 试试这些,我希望你会更喜欢这个结果。