# ---
# jupyter:
#   jupytext:
#     text_representation:
#       extension: .py
#       format_name: light
#       format_version: '1.5'
#       jupytext_version: 1.14.4
#   kernelspec:
#     display_name: Python 3
#     language: python
#     name: python3
# ---

# +
import numpy as np

import matplotlib.pyplot as plt

from sklearn import cluster, preprocessing, datasets

# %matplotlib inline
# -

np.random.seed(42)

# +
x, y = datasets.make_blobs(centers=3, n_features=2, n_samples=1500, cluster_std=2.5)
x[:, 0] *= 10000
x1, x2 = x.T

plt.scatter(x1, x2, alpha=0.5);
# -

plt.scatter(x1, x2, c=y, alpha=0.5);

# Note que os eixos não estão na mesma escala. Ao utilizar uma medida de distância, pode haver distorção no espaço.

# +
km = cluster.KMeans(n_clusters=3)
km.fit(x)

plt.scatter(*x.T, c=km.predict(x), alpha=0.5)
plt.scatter(*km.cluster_centers_.T, marker='*', s=200, c='r');
# -

plt.scatter(x1, x2, c=km.predict(x), alpha=0.5)
plt.scatter(*km.cluster_centers_.T, marker='*', s=200, c='r')
plt.xlim((-150000, 150000))
plt.ylim((-150000, 150000));

# Para colocar ambos os eixos na mesma escala, basta calcular o mínimo e máximo de cada atributo $X_i$, e então utilizar uma transformação $X'_i = \frac{X_i - min\{X_i\}}{max\{X_i\} - min\{X_i\}}$.
#
# Essa transformação já está implementada na classe `sklearn.preprocessing.MinMaxScaler`.

scaler = preprocessing.MinMaxScaler()
x_t = scaler.fit_transform(x)

x[:5]

x_t[:5]

# +
km_t = cluster.KMeans(n_clusters=3)
km_t.fit(x_t)

plt.scatter(*x_t.T, c=km_t.predict(x_t), alpha=0.5)
plt.scatter(*km_t.cluster_centers_.T, marker='*', s=200, c='r');

StarcoderdataJupyterScriptsDedupFiltered