import numpy as np
from sklearn.datasets import load_digits
from sklearn.mixture import GaussianMixture
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from scipy.stats import mode

digits = load_digits()
X = digits.data
y = digits.target

scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

pca = PCA(n_components=20)
X_pca = pca.fit_transform(X_scaled)

gmm = GaussianMixture(n_components=10, random_state=42)
gmm.fit(X_pca)

clusters = gmm.predict(X_pca)

labels = np.zeros_like(clusters)

for i in range(10):
    mask = (clusters == i)
    if np.sum(mask) == 0:
        continue
    labels[mask] = mode(y[mask])[0]

accuracy = np.mean(labels == y)

print(accuracy)