import%20marimo%0A%0A__generated_with%20%3D%20%220.23.16%22%0Aapp%20%3D%20marimo.App()%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%0A%20%20%20%20return%20(mo%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20METADATA%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%22id%22%3A%20%22kmeans%22%2C%0A%20%20%20%20%20%20%20%20%22name%22%3A%20%22K-Means%22%2C%0A%20%20%20%20%20%20%20%20%22types%22%3A%20%5B%22algorithm%22%5D%2C%0A%20%20%20%20%20%20%20%20%22families%22%3A%20%5B%22clustering%22%2C%20%22distance%22%5D%2C%0A%20%20%20%20%20%20%20%20%22tasks%22%3A%20%5B%22clustering%22%5D%2C%0A%20%20%20%20%20%20%20%20%22data%22%3A%20%5B%22tabular%22%5D%2C%0A%20%20%20%20%20%20%20%20%22learning%22%3A%20%5B%22unsupervised%22%5D%2C%0A%20%20%20%20%20%20%20%20%22capacity%22%3A%20%22parametric%22%2C%0A%20%20%20%20%20%20%20%20%22mechanisms%22%3A%20%5B%22centroid_optimization%22%2C%20%22distance%22%5D%2C%0A%20%20%20%20%20%20%20%20%22properties%22%3A%20%5B%22interpretable%22%5D%2C%0A%20%20%20%20%20%20%20%20%22constraints%22%3A%20%5B%22requires_scaling%22%2C%20%22sensitive_to_high_dimension%22%2C%20%22sensitive_to_outliers%22%5D%2C%0A%20%20%20%20%20%20%20%20%22difficulty%22%3A%20%22beginner%22%2C%0A%20%20%20%20%20%20%20%20%22status%22%3A%20%22complete%22%2C%0A%20%20%20%20%20%20%20%20%22explainability%22%3A%20%22medium%22%2C%0A%20%20%20%20%20%20%20%20%22training_cost%22%3A%20%22low%22%2C%0A%20%20%20%20%20%20%20%20%22inference_cost%22%3A%20%22low%22%2C%0A%20%20%20%20%20%20%20%20%22data_appetite%22%3A%20%22medium%22%2C%0A%20%20%20%20%7D%0A%0A%20%20%20%20mo.md(f%22%23%20%7BMETADATA%5B'name'%5D%7D%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20In%20one%20sentence%0A%0A%20%20%20%20K-Means%20divides%20points%20into%20%24k%24%20groups%20by%20repeatedly%20assigning%20each%20point%20to%20its%20nearest%20center%20and%20moving%20centers%20to%20the%20assigned%20averages.%0A%0A%20%20%20%20%23%23%20Mental%20model%0A%0A%20%20%20%20Place%20%24k%24%20magnets%20in%20a%20cloud%20of%20points.%20Each%20point%20chooses%20its%20nearest%20magnet%2C%20then%20every%20magnet%20moves%20to%20the%20average%20location%20of%20its%20followers.%20Repeat%20until%20little%20changes.%0A%0A%20%20%20%20This%20picture%20reveals%20the%20model's%20bias%3A%20it%20prefers%20compact%2C%20roughly%20round%20groups%20under%20the%20chosen%20distance.%0A%0A%20%20%20%20%23%23%20Input%20and%20output%0A%0A%20%20%20%20-%20**Input%3A**%20numerical%20feature%20vectors%20and%20a%20chosen%20number%20of%20clusters.%0A%20%20%20%20-%20**Output%3A**%20a%20cluster%20label%20for%20each%20point%20and%20%24k%24%20centroids.%0A%20%20%20%20-%20**Learns%3A**%20centroid%20positions%20minimizing%20within-cluster%20squared%20distance.%0A%0A%20%20%20%20%23%23%20How%20it%20works%0A%0A%20%20%20%20K-Means%20alternates%20two%20steps%3A%0A%0A%20%20%20%201.%20Assign%20each%20point%20to%20its%20nearest%20centroid.%0A%20%20%20%202.%20Replace%20each%20centroid%20with%20the%20mean%20of%20its%20assigned%20points.%0A%0A%20%20%20%20Each%20step%20reduces%20or%20preserves%20the%20objective%2C%20but%20the%20result%20can%20settle%20in%20a%20local%20optimum.%20Different%20initial%20centers%20can%20produce%20different%20groupings%2C%20which%20is%20why%20k-means%2B%2B%20initialization%20and%20multiple%20restarts%20matter.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20A%20practical%20example%0A%0A%20%20%20%20A%20product%20team%20might%20cluster%20users%20from%20activity%20frequency%2C%20recency%2C%20breadth%2C%20and%20spend.%20The%20clusters%20can%20support%20exploration%2C%20but%20labels%20such%20as%20%22power%20user%22%20should%20be%20added%20only%20after%20examining%20centroid%20profiles%2C%20example%20members%2C%20size%2C%20stability%2C%20and%20business%20usefulness.%0A%0A%20%20%20%20%23%23%20When%20to%20use%20it%0A%0A%20%20%20%20-%20You%20need%20a%20fast%20clustering%20baseline.%0A%20%20%20%20-%20Features%20form%20a%20meaningful%20Euclidean%20space.%0A%20%20%20%20-%20Compact%20centroid-based%20groups%20are%20plausible.%0A%20%20%20%20-%20Cluster%20prototypes%20are%20useful%20for%20summarization%20or%20compression.%0A%20%20%20%20-%20The%20dataset%20is%20large%20enough%20to%20benefit%20from%20efficient%20updates.%0A%0A%20%20%20%20%23%23%20When%20to%20avoid%20it%0A%0A%20%20%20%20-%20Clusters%20have%20irregular%20shapes%20or%20very%20different%20densities.%0A%20%20%20%20-%20Categorical%20variables%20dominate%20without%20a%20suitable%20representation.%0A%20%20%20%20-%20Outliers%20strongly%20distort%20means.%0A%20%20%20%20-%20You%20do%20not%20have%20a%20defensible%20reason%20to%20choose%20%24k%24.%0A%20%20%20%20-%20You%20expect%20discovered%20clusters%20to%20be%20objective%20natural%20categories.%0A%0A%20%20%20%20%23%23%20Data%20preparation%0A%0A%20%20%20%20Scale%20features%20or%20define%20a%20representation%20where%20distance%20means%20something.%20Consider%20robust%20scaling%20when%20outliers%20are%20genuine%20but%20extreme.%20Remove%20identifiers%20and%20leaked%20outcome%20variables.%20PCA%20can%20reduce%20noise%20or%20dimension%2C%20but%20verify%20that%20it%20preserves%20task-relevant%20distinctions.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Important%20controls%0A%0A%20%20%20%20%7C%20Control%20%7C%20Role%20%7C%0A%20%20%20%20%7C---------%7C------%7C%0A%20%20%20%20%7C%20%60n_clusters%60%20%7C%20The%20number%20of%20centroids%20%7C%0A%20%20%20%20%7C%20%60init%60%20%7C%20k-means%2B%2B%20is%20a%20strong%20default%20%7C%0A%20%20%20%20%7C%20%60n_init%60%20%7C%20Number%20of%20restarts%20%7C%0A%20%20%20%20%7C%20%60max_iter%60%20%2F%20tolerance%20%7C%20Convergence%20controls%20%7C%0A%0A%20%20%20%20The%20elbow%20curve%20and%20silhouette%20score%20can%20inform%20%24k%24%2C%20but%20neither%20discovers%20a%20uniquely%20correct%20answer.%20Domain%20usefulness%20and%20stability%20across%20samples%20matter%20more.%0A%0A%20%20%20%20---%0A%0A%20%20%20%20%23%23%20Notebook%20%E2%80%94%20useful%20bias%20and%20visible%20failure%0A%0A%20%20%20%20**Question%3A**%20what%20geometry%20does%20K-Means%20assume%3F%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20matplotlib.pyplot%20as%20plt%0A%20%20%20%20from%20sklearn.cluster%20import%20KMeans%0A%20%20%20%20from%20sklearn.datasets%20import%20make_blobs%2C%20make_moons%0A%20%20%20%20from%20sklearn.preprocessing%20import%20StandardScaler%0A%0A%20%20%20%20blobs%2C%20_%20%3D%20make_blobs(n_samples%3D500%2C%20centers%3D3%2C%20cluster_std%3D0.7%2C%20random_state%3D6)%0A%20%20%20%20moons%2C%20_%20%3D%20make_moons(n_samples%3D500%2C%20noise%3D0.07%2C%20random_state%3D6)%0A%20%20%20%20return%20KMeans%2C%20StandardScaler%2C%20blobs%2C%20moons%2C%20plt%0A%0A%0A%40app.cell%0Adef%20_(KMeans%2C%20StandardScaler%2C%20blobs%2C%20moons%2C%20plt)%3A%0A%20%20%20%20fig%2C%20axes%20%3D%20plt.subplots(1%2C%202%2C%20figsize%3D(10%2C%204))%0A%20%20%20%20for%20ax%2C%20_X%2C%20title%2C%20_k%20in%20%5B%0A%20%20%20%20%20%20%20%20(axes%5B0%5D%2C%20blobs%2C%20%22Compact%20groups%3A%20a%20good%20fit%22%2C%203)%2C%0A%20%20%20%20%20%20%20%20(axes%5B1%5D%2C%20moons%2C%20%22Curved%20groups%3A%20a%20poor%20fit%22%2C%202)%2C%0A%20%20%20%20%5D%3A%0A%20%20%20%20%20%20%20%20Xs%20%3D%20StandardScaler().fit_transform(_X)%0A%20%20%20%20%20%20%20%20model%20%3D%20KMeans(n_clusters%3D_k%2C%20n_init%3D20%2C%20random_state%3D0).fit(Xs)%0A%20%20%20%20%20%20%20%20ax.scatter(Xs%5B%3A%2C%200%5D%2C%20Xs%5B%3A%2C%201%5D%2C%20c%3Dmodel.labels_%2C%20s%3D12%2C%20cmap%3D%22viridis%22)%0A%20%20%20%20%20%20%20%20ax.scatter(%0A%20%20%20%20%20%20%20%20%20%20%20%20model.cluster_centers_%5B%3A%2C%200%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20model.cluster_centers_%5B%3A%2C%201%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20c%3D%22red%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20marker%3D%22x%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20s%3D100%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20ax.set_title(title)%0A%20%20%20%20plt.tight_layout()%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(KMeans%2C%20StandardScaler%2C%20blobs%2C%20plt)%3A%0A%20%20%20%20inertias%20%3D%20%5B%5D%0A%20%20%20%20_X%20%3D%20StandardScaler().fit_transform(blobs)%0A%20%20%20%20for%20_k%20in%20range(1%2C%209)%3A%0A%20%20%20%20%20%20%20%20inertias.append(KMeans(n_clusters%3D_k%2C%20n_init%3D20%2C%20random_state%3D0).fit(_X).inertia_)%0A%20%20%20%20plt.plot(range(1%2C%209)%2C%20inertias%2C%20marker%3D%22o%22)%0A%20%20%20%20plt.xlabel(%22k%22)%0A%20%20%20%20plt.ylabel(%22within-cluster%20squared%20distance%22)%0A%20%20%20%20plt.title(%22The%20elbow%20informs%20k%3B%20it%20does%20not%20define%20meaning%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20---%0A%0A%20%20%20%20%23%23%20Evaluation%20and%20diagnosis%0A%0A%20%20%20%20Inspect%20cluster%20sizes%2C%20centroid%20profiles%2C%20representative%20examples%2C%20and%20distances%20to%20centroids.%20Refit%20across%20seeds%20and%20samples.%20If%20identities%20change%20wildly%2C%20the%20segmentation%20may%20be%20fragile.%0A%0A%20%20%20%20External%20labels%20can%20be%20used%20after%20clustering%20to%20understand%20associations%2C%20but%20avoid%20retrofitting%20a%20story%20to%20every%20partition.%0A%0A%20%20%20%20%23%23%20Cost%20profile%0A%0A%20%20%20%20Standard%20K-Means%20is%20efficient%20and%20scales%20roughly%20with%20examples%2C%20clusters%2C%20features%2C%20and%20iterations.%20Mini-batch%20variants%20reduce%20cost%20for%20very%20large%20datasets.%0A%0A%20%20%20%20%23%23%20Related%20models%0A%0A%20%20%20%20-%20**KNN**%20also%20depends%20on%20distance%20but%20predicts%20from%20labeled%20neighbors.%0A%20%20%20%20-%20Gaussian%20mixtures%20provide%20soft%20probabilistic%20assignments%20and%20elliptical%20clusters.%0A%20%20%20%20-%20DBSCAN%20and%20HDBSCAN%20target%20density-shaped%20clusters%20and%20can%20mark%20noise.%0A%20%20%20%20-%20**PCA**%20creates%20lower-dimensional%20coordinates%20rather%20than%20groups.%0A%0A%20%20%20%20%23%23%20Practical%20takeaway%0A%0A%20%20%20%20K-Means%20always%20returns%20clusters%20when%20asked.%20The%20hard%20question%20is%20whether%20those%20clusters%20are%20stable%20and%20useful%20outside%20the%20algorithm.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
d4273ae0075f4c391e63ef23c2c43187