#install.packages("Rtsne") # jika belum ada
library(Rtsne)
library(ggplot2)
library(plotly)
library(dplyr)
data(iris)   
head(iris)

Preprocessing

# Cek jumlah baris duplikat
dup_rows <- iris[duplicated(iris), ]
cat("Jumlah baris duplikat:", nrow(dup_rows), "\n")
Jumlah baris duplikat: 1 
if(nrow(dup_rows) > 0){
  print("Baris duplikat:")
  print(dup_rows)
}
[1] "Baris duplikat:"
# Hapus baris duplikat
df <- iris %>% distinct()
cat("Jumlah baris setelah hapus duplikat:", nrow(df), "\n")
Jumlah baris setelah hapus duplikat: 149 

Standarisasi Data

X <- scale(df[, 1:4])  # fitur numerik
y <- df$Species         # label / kelas

t-SNE

set.seed(42)
tsne_2d <- Rtsne(
  X,
  dims = 2,          # output 2 dimensi
  perplexity = 30,   # jumlah tetangga efektif
  eta = 200,         # learning rate
  max_iter = 1000    # jumlah iterasi
)
# Gabungkan hasil ke dataframe
df_tsne2 <- as.data.frame(tsne_2d$Y)
colnames(df_tsne2) <- c("TSNE1", "TSNE2")
df_tsne2$Class <- y

Visualisasi

ggplot(df_tsne2, aes(x = TSNE1, y = TSNE2, color = Class)) +
  geom_point(size = 3, alpha = 0.8) +
  theme_minimal() +
  ggtitle("t-SNE Visualization of Iris Dataset")

Tuning Parameter

set.seed(42)
tsne_2d <- Rtsne(
  X,
  dims = 2,          # output 2 dimensi
  perplexity = 30,   # jumlah tetangga efektif
  eta = 200,         # learning rate
  max_iter = 1000    # jumlah iterasi
)

contoh dengan 3 dimensi

set.seed(42)
tsne_3d <- Rtsne(
  X,
  dims = 3, 
  perplexity = 30, 
  eta = 200, 
  max_iter = 1000
)

df_tsne3 <- as.data.frame(tsne_3d$Y)
colnames(df_tsne3) <- c("Dim1", "Dim2", "Dim3")
df_tsne3$Class <- y

visualisasi

plot_ly(df_tsne3, 
        x = ~Dim1, y = ~Dim2, z = ~Dim3,
        color = ~Class, colors = c("red","green","blue"),
        type = "scatter3d", mode = "markers") %>%
  layout(title = "t-SNE 3D (Iris)")
LS0tDQp0aXRsZTogInQtU05FIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCmBgYHtyfQ0KI2luc3RhbGwucGFja2FnZXMoIlJ0c25lIikgIyBqaWthIGJlbHVtIGFkYQ0KbGlicmFyeShSdHNuZSkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkocGxvdGx5KQ0KbGlicmFyeShkcGx5cikNCmBgYA0KYGBge3J9DQpkYXRhKGlyaXMpICAgDQpoZWFkKGlyaXMpDQpgYGANCiMgKipQcmVwcm9jZXNzaW5nKioNCmBgYHtyfQ0KIyBDZWsganVtbGFoIGJhcmlzIGR1cGxpa2F0DQpkdXBfcm93cyA8LSBpcmlzW2R1cGxpY2F0ZWQoaXJpcyksIF0NCmNhdCgiSnVtbGFoIGJhcmlzIGR1cGxpa2F0OiIsIG5yb3coZHVwX3Jvd3MpLCAiXG4iKQ0KaWYobnJvdyhkdXBfcm93cykgPiAwKXsNCiAgcHJpbnQoIkJhcmlzIGR1cGxpa2F0OiIpDQogIHByaW50KGR1cF9yb3dzKQ0KfQ0KDQojIEhhcHVzIGJhcmlzIGR1cGxpa2F0DQpkZiA8LSBpcmlzICU+JSBkaXN0aW5jdCgpDQpjYXQoIkp1bWxhaCBiYXJpcyBzZXRlbGFoIGhhcHVzIGR1cGxpa2F0OiIsIG5yb3coZGYpLCAiXG4iKQ0KYGBgDQojICoqU3RhbmRhcmlzYXNpIERhdGEqKg0KYGBge3J9DQpYIDwtIHNjYWxlKGRmWywgMTo0XSkgICMgZml0dXIgbnVtZXJpaw0KeSA8LSBkZiRTcGVjaWVzICAgICAgICAgIyBsYWJlbCAvIGtlbGFzDQpgYGANCg0KIyAqKnQtU05FKioNCmBgYHtyfQ0Kc2V0LnNlZWQoNDIpDQp0c25lXzJkIDwtIFJ0c25lKA0KICBYLA0KICBkaW1zID0gMiwgICAgICAgICAgIyBvdXRwdXQgMiBkaW1lbnNpDQogIHBlcnBsZXhpdHkgPSAzMCwgICAjIGp1bWxhaCB0ZXRhbmdnYSBlZmVrdGlmDQogIGV0YSA9IDIwMCwgICAgICAgICAjIGxlYXJuaW5nIHJhdGUNCiAgbWF4X2l0ZXIgPSAxMDAwICAgICMganVtbGFoIGl0ZXJhc2kNCikNCiMgR2FidW5na2FuIGhhc2lsIGtlIGRhdGFmcmFtZQ0KZGZfdHNuZTIgPC0gYXMuZGF0YS5mcmFtZSh0c25lXzJkJFkpDQpjb2xuYW1lcyhkZl90c25lMikgPC0gYygiVFNORTEiLCAiVFNORTIiKQ0KZGZfdHNuZTIkQ2xhc3MgPC0geQ0KYGBgDQoNCiMgKipWaXN1YWxpc2FzaSoqDQpgYGB7cn0NCmdncGxvdChkZl90c25lMiwgYWVzKHggPSBUU05FMSwgeSA9IFRTTkUyLCBjb2xvciA9IENsYXNzKSkgKw0KICBnZW9tX3BvaW50KHNpemUgPSAzLCBhbHBoYSA9IDAuOCkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBnZ3RpdGxlKCJ0LVNORSBWaXN1YWxpemF0aW9uIG9mIElyaXMgRGF0YXNldCIpDQpgYGANCiMgKipUdW5pbmcgUGFyYW1ldGVyKioNCg0KLSBwZXJwbGV4aXR5IOKGkiBqdW1sYWggdGV0YW5nZ2EgZWZla3RpZiAodW11bW55YSA14oCTNTApDQotIGV0YSAobGVhcm5pbmcgcmF0ZSkg4oaSIDEw4oCTMTAwMA0KLSBtYXhfaXRlciDihpIganVtbGFoIGl0ZXJhc2kgKG1pc2FsIDUwMCwgMTAwMCwgMjAwMCkNCmBgYHtyfQ0Kc2V0LnNlZWQoNDIpDQp0c25lXzJkIDwtIFJ0c25lKA0KICBYLA0KICBkaW1zID0gMiwgICAgICAgICAgIyBvdXRwdXQgMiBkaW1lbnNpDQogIHBlcnBsZXhpdHkgPSAzMCwgICAjIGp1bWxhaCB0ZXRhbmdnYSBlZmVrdGlmDQogIGV0YSA9IDIwMCwgICAgICAgICAjIGxlYXJuaW5nIHJhdGUNCiAgbWF4X2l0ZXIgPSAxMDAwICAgICMganVtbGFoIGl0ZXJhc2kNCikNCmBgYA0KDQojIyMjIGNvbnRvaCBkZW5nYW4gMyBkaW1lbnNpDQpgYGB7cn0NCnNldC5zZWVkKDQyKQ0KdHNuZV8zZCA8LSBSdHNuZSgNCiAgWCwNCiAgZGltcyA9IDMsIA0KICBwZXJwbGV4aXR5ID0gMzAsIA0KICBldGEgPSAyMDAsIA0KICBtYXhfaXRlciA9IDEwMDANCikNCg0KZGZfdHNuZTMgPC0gYXMuZGF0YS5mcmFtZSh0c25lXzNkJFkpDQpjb2xuYW1lcyhkZl90c25lMykgPC0gYygiRGltMSIsICJEaW0yIiwgIkRpbTMiKQ0KZGZfdHNuZTMkQ2xhc3MgPC0geQ0KYGBgDQojIyMjIHZpc3VhbGlzYXNpDQpgYGB7cn0NCnBsb3RfbHkoZGZfdHNuZTMsIA0KICAgICAgICB4ID0gfkRpbTEsIHkgPSB+RGltMiwgeiA9IH5EaW0zLA0KICAgICAgICBjb2xvciA9IH5DbGFzcywgY29sb3JzID0gYygicmVkIiwiZ3JlZW4iLCJibHVlIiksDQogICAgICAgIHR5cGUgPSAic2NhdHRlcjNkIiwgbW9kZSA9ICJtYXJrZXJzIikgJT4lDQogIGxheW91dCh0aXRsZSA9ICJ0LVNORSAzRCAoSXJpcykiKQ0KYGBgDQoNCg0KDQoNCg==