numerics-2022/Task 1/kmeans.ipynb

214 lines
118 KiB
Plaintext
Raw Permalink Normal View History

2022-09-24 11:25:54 +03:00
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np \n",
"import matplotlib.pyplot as plt "
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"def scatter_plot(data, col=None):\n",
" from mpl_toolkits.mplot3d import Axes3D \n",
" %matplotlib inline\n",
" fig = plt.figure()\n",
" ax = fig.add_subplot(111, projection='3d')\n",
" ax.scatter(data[:,0], data[:,1], data[:,2], s = 0.5, color=col)\n",
" plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"N = 1000\n",
"K = 3\n",
"d = 3\n",
"L = 10"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"# Generate some data\n",
"np.random.seed(42)\n",
"mu_true = np.random.uniform(-L, L, size = (K, d))\n",
"data = np.random.normal(mu_true, size = (N, K, d))\n",
"data = np.vstack(data)\n",
"np.random.shuffle(data)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"if d == 3:\n",
" scatter_plot(data, None)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"mu = data[np.random.choice(range(data.shape[0]), K, replace=False)]\n",
"c = np.random.randint(low=0, high=K-1, size=data.shape[0])"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"def dist_i(x, mu):\n",
" # x: N datapoints, mu: N cluster centers\n",
" # returns: D_{i}, squared distances from x[i] to mu[i]\n",
" dist = np.zeros(x.shape[0])\n",
" for i in range(x.shape[0]):\n",
" dist[i] = np.sum((x[i] - mu[i])**2)\n",
" return dist\n",
"def dist_ij(x, mu):\n",
" # x: N datapoints, mu: K cluster centers\n",
" # returns: D_{ij}, squared distances from x[i] to mu[j]\n",
" dist = np.zeros((x.shape[0], mu.shape[0]))\n",
" for i in range(x.shape[0]):\n",
" for j in range(mu.shape[0]):\n",
" dist[i, j] += np.sum((x[i] - mu[j])**2)\n",
" return dist"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"ss_list = []\n",
"for n in range(10):\n",
" c = np.argmin(dist_ij(data, mu), axis = 1) \n",
" ss = np.mean(dist_i(data, mu[c]))\n",
" ss_list.append(ss) \n",
" for i in range(K):\n",
" cluster_members = data[c == i]\n",
" cluster_members = cluster_members.mean(axis = 0)\n",
" mu[i] = cluster_members"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x1fa6bf68ba8>]"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.plot(ss_list)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"colors = np.array([plt.cm.cool(i/(K-1)) for i in range(K)])"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"if d == 3:\n",
" scatter_plot(data, colors[c])"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.3"
}
},
"nbformat": 4,
"nbformat_minor": 2
}