{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import pandas as pd \n", "from datetime import datetime \n", "from datetime import date\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import pandas as pd\n", "from keras.models import Sequential\n", "from keras.layers import LSTM, Dense\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.preprocessing import MinMaxScaler,StandardScaler\n", "from keras.callbacks import ModelCheckpoint\n", "import tensorflow as tf\n", "import joblib" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "merged = pd.read_csv(r'../data/long_merge.csv')" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "zones = [69, 68, 67, 66, 65, 64, 42, 41, 40, 39, 38, 37, 36]\n", "rtu = 1\n", "cols = []\n", "\n", "for zone in zones:\n", " for column in merged.columns:\n", " if (\n", " f\"zone_0{zone}\" in column\n", " and \"co2\" not in column\n", " and \"hw_valve\" not in column\n", " and \"cooling_sp\" not in column\n", " and \"heating_sp\" not in column\n", " ):\n", " cols.append(column)\n", "\n", "cols = (\n", " [\"date\"]\n", " + cols\n", " + [\n", " f\"rtu_00{rtu}_fltrd_sa_flow_tn\",\n", " f\"rtu_00{rtu}_sa_temp\", \n", " \"air_temp_set_1\",\n", " \"air_temp_set_2\",\n", " \"dew_point_temperature_set_1d\",\n", " \"relative_humidity_set_1\",\n", " \"solar_radiation_set_1\",\n", " ]\n", ")\n", "\n", "for zone in zones:\n", " for column in merged.columns:\n", " if f\"zone_0{zone}\" in column:\n", " if \"cooling_sp\" in column or \"heating_sp\" in column:\n", " cols.append(column)\n", " \n", "input_dataset = merged[cols]" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\arbal\\AppData\\Local\\Temp\\ipykernel_15284\\4293840618.py:1: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " input_dataset['date'] = pd.to_datetime(input_dataset['date'], format = \"%Y-%m-%d %H:%M:%S\")\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "There are NA values in the DataFrame columns.\n" ] } ], "source": [ "input_dataset['date'] = pd.to_datetime(input_dataset['date'], format = \"%Y-%m-%d %H:%M:%S\")\n", "df_filtered = input_dataset[ (input_dataset.date.dt.date >date(2019, 1, 1)) & (input_dataset.date.dt.date< date(2021, 1, 1))]\n", "\n", "if df_filtered.isna().any().any():\n", " print(\"There are NA values in the DataFrame columns.\")" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "testdataset_df = df_filtered[(df_filtered.date.dt.date >date(2020, 3, 1)) & (df_filtered.date.dt.date date(2019, 11, 8))]\n", "\n", "traindataset_df = df_filtered[(df_filtered.date.dt.date >date(2019, 3, 1)) & (df_filtered.date.dt.date date(2020, 7, 1)) & (df_filtered.date.dt.date " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "var = 0\n", "\n", "df = pd.DataFrame([testdataset_df.index[31:],test_predict1_unscaled[:,var], y_test_unscaled[:,var]] ).T\n", "fig, ax = plt.subplots(figsize=(10,8))\n", "df.plot(x = 0, y=1, ax = ax, label = 'Predicted')\n", "df.plot(x = 0, y=2, ax = ax, label = 'Actual')\n", "\n", "anomalies = df.where(df[1]-df[2]>0.38)[0]\n", "df['anomalies'] = anomalies\n", "\n", "df_new = df.dropna()\n", "\n", "df_new.plot.scatter(x='anomalies', y=1, c='r', ax = ax, label = 'Anomalies')\n", "\n", "# ax.scatter(anomalies,test_predict1[anomalies,var], color='black',marker =\"o\",s=100 )\n", "\n", "\n", "ax.set_title('Testing Data - Predicted vs Actual [Zone 72 Temperature]', fontsize=20)\n", "ax.set_xlabel('Time', fontsize=15)\n", "ax.set_ylabel('Value', fontsize = 15)\n", "ax.legend(fontsize = 15)\n", "fig.tight_layout()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from sklearn.mixture import GaussianMixture\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from sklearn.decomposition import PCA\n", "\n", "\n", "# Generating random data for demonstration\n", "np.random.seed(0)\n", "X = test_predict1 - y_test\n", "\n", "\n", "pca = PCA(n_components=2)\n", "X = pca.fit_transform(X)\n", "\n", "\n", "# Creating the GMM instance with desired number of clusters\n", "gmm = GaussianMixture(n_components=2)\n", "\n", "# Fitting the model to the data\n", "gmm.fit(X)\n", "\n", "# Getting the cluster labels\n", "labels = gmm.predict(X)\n", "\n", "# Plotting the data points with colors representing different clusters\n", "plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', alpha=0.5)\n", "plt.title('GMM Clustering')\n", "plt.xlabel('Feature 1')\n", "plt.ylabel('Feature 2')\n", "plt.show()\n" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['pca_vav_1.pkl']" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAnYAAAHWCAYAAAD6oMSKAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAACII0lEQVR4nOzdd3zU9f3A8df3ezN7khyBkIS9h6AIyHCBW7GualXUtu5qtVVba4WOn6NWbR21KmodxYmzWsEKiuIABWTPMJPLTi7z1vfz++MgELKTu1xyeT8fj3to7vv5fj7v+3K5vO/z/QxNKaUQQgghhBA9nh7uAIQQQgghRHBIYieEEEIIESEksRNCCCGEiBCS2AkhhBBCRAhJ7IQQQgghIoQkdkIIIYQQEUISOyGEEEKICCGJnRBCCCFEhJDETgghhBAiQkhiJ4Ro0gsvvICmaaxevbrB88XFxUyaNInY2FiWLl0KwPz589E0DV3X2bVrV6O6qquriY+PR9M05s2b1xXhh1xBQQF33XUXY8aMITY2FrvdzpAhQ7jlllvYvn17fblD1yZUPvzwQ+bPnx+y+mfNmsWsWbNCVr8QIrjM4Q5ACNFz7N+/n1NPPZWCggI++eQTjj/++AbHY2Njef755/njH//Y4Pk33ngDr9eLxWLpynBD5ttvv+Wss85CKcVNN93ElClTsFqtbN26lZdffpnjjjuOsrKyLonlww8/5IknnghZcvfkk0+GpF4hRGhIYieEaJPt27dzyimn4PV6+eyzzxgzZkyjMhdffDH/+te/WLBgAbp++IbAwoULmTt3Lu+9915XhhwSLpeLc889F7vdzsqVK+nfv3/9sVmzZnHttdfy5ptvhjHC4KipqSE6OpqRI0eGOxQhRDvIrVghRKvWrl3LCSecgNls5osvvmgyqQO4+uqr2bdvX/0tWoBt27bxxRdfcPXVVzd5jsvl4le/+hU5OTlYrVb69evHrbfeSnV1dYNyTzzxBDNmzCAtLY2YmBjGjBnDgw8+iNfrbVBu1qxZjB49mlWrVjF9+nSio6MZOHAg999/P4Zh1JczDIM//elPDBs2jKioKBITExk7dix/+9vfWrwWzzzzDE6nkwcffLBBUnekCy64oMU6NE1rsoctOzu7wa3qmpqa+mtjt9tJTk5m0qRJLFq0CIB58+bxxBNP1Nd56LF7924AlFI8+eSTjB8/nqioKJKSkrjgggsa3S4/dM0+//xzpk6dSnR0dP2/19G3Ynfv3o2maTz00EM8/PDD5OTkEBsby5QpU/j666+bvF5Dhw7FZrMxcuRI/v3vfzNv3jyys7NbvEZCiI6RHjshRIu++OIL5s+fT2ZmJkuWLKFv377Nlh0yZAjTp0/nueeeY86cOQA899xzZGdnc/LJJzcqX1NTw8yZM9m/fz+//e1vGTt2LBs3buT3v/8969ev55NPPqkfn7Zz504uvfTS+gRw3bp1/PnPf2bLli0899xzDep1Op1cdtll3H777dx77728/fbb/OY3vyEjI4MrrrgCgAcffJD58+fzu9/9jhkzZuD1etmyZQvl5eUtXo8lS5ZgMpk4++yz23MZO+S2227jpZde4k9/+hMTJkygurqaDRs2UFJSAsA999xDdXU1b775Jl999VX9eYf+ja699lpeeOEFfvGLX/DAAw9QWlrKH/7wB6ZOncq6detIT0+vPyc/P5+f/OQn3HHHHfzf//1fgx7XpjzxxBMMHz6cRx99tD6WM844g9zcXBISEgB4+umnufbaa/nRj37EI488QkVFBQsWLMDtdgfzMgkhjqSEEKIJzz//vAIUoBISElRhYWGzZe+9914FqKKiIvX8888rm82mSkpKlM/nU3379lXz589XSikVExOjrrzyyvrz7rvvPqXrulq1alWD+t58800FqA8//LDJ9vx+v/J6verFF19UJpNJlZaW1h+bOXOmAtQ333zT4JyRI0eqOXPm1P981llnqfHjx7f5ehwyfPhw5XA42lz+0LU5EqDuvffeRmWzsrIaXJ/Ro0er8847r8X6b7zxxkb1K6XUV199pQD117/+tcHz+/btU1FRUeqOO+6of+7QNfvf//7XqJ6ZM2eqmTNn1v+cm5urADVmzBjl8/nqn//2228VoBYtWqSUCvwbORwONXny5Ab17dmzR1ksFpWVldXi6xJCdIzcihVCtOicc86hoqKCW2+9Fb/f32r5Cy+8EKvVyiuvvMKHH36I0+lsdibsBx98wOjRoxk/fjw+n6/+MWfOHDRNY/ny5fVl16xZwznnnENKSgomkwmLxcIVV1yB3+9n27ZtDep1OBwcd9xxDZ4bO3Yse/bsqf/5uOOOY926ddxwww18/PHHuFyutl+ULnLcccfx0Ucfcdddd7F8+XJqa2vb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3jAM5XA41P3331//XF1dnUpISFBPPfVUCCLsfh588EGVk5PTYpkrr7xSnXvuuV0TUBc77rjj1HXXXdfgueHDh6u77rqryfJ33HGHGj58eIPnrr32WnX88ceHLMbuorCwUAHqs88+a7bMsmXLFKDKysq6LrAwuvfee9W4cePaXL43v3+UUuqWW25RgwYNUoZhNHm8t71/APX222/X/9zRv0kXXXSROu200xo8N2fOHHXJJZcEPeaudPT1acq3336rALVnz55myzz//PMqISEhuMG1QHrsguyBBx4gJSWF8ePH8+c//7nF24y5ubk4nU5mz55d/5zNZmPmzJmsXLmyK8INu4qKCpKTk1stt3z5ctLS0hg6dCg/+9nPKCws7ILoQsvj8fDdd981+PcHmD17drP//l999VWj8nPmzGH16tV4vd6QxdodVFRUALTp/TJhwgT69u3LySefzLJly0IdWlht376djIwMcnJyuOSSS9i1a1ezZXvz+8fj8fDyyy9z9dVXt7pXeG96/xypo3+Tmntf9Ya/YxUVFWiaRmJiYovlqqqqyMrKon///px11lmsWbMmZDFJYhdEt9xyC6+++irLli3jpptu4tFHH+WGG25otrzT6QQgPT29wfPp6en1xyLZzp07eeyxx7juuutaLHf66afzyiuv8Omnn/LXv/6VVatWcdJJJ+F2u7so0tAoLi7G7/e369/f6XQ2Wd7n81FcXByyWMNNKcVtt93GCSecwOjRo5st17dvX55++mneeustFi9ezLBhwzj55JP5/PPPuzDarjN58mRefPFFPv74Y5555hmcTidTp06lpKSkyfK99f0D8M4771BeXs68efOaLdPb3j9H6+jfpObeV5H+d6yuro677rqLSy+9tMU9YocPH84LL7zAe++9x6JFi7Db7UybNo3t27eHJC5zSGqNIPPnz2fBggUtllm1ahWTJk3il7/8Zf1zY8eOJSkpiQsuuKC+F685R397VEq1+o2yO2nPNTokLy+P0047jQsvvJCf/vSnLZ578cUX1///6NGjmTRpEllZWfznP//h/PPP71zw3UB7//2bKt/U85Hkpptu4ocffuCLL75osdywYcMYNmxY/c9Tpkxh3759PPTQQ8yYMSPUYXa5008/vf7/x4wZw5QpUxg0aBD/+te/uO2225o8pze+fwAWLlzI6aefTkZGRrNletv7pzkd+ZvU0/+OtZfX6+WSSy7BMAyefPLJFssef/zxDSb8TZs2jWOOOYbHHnuMv//970GPTRK7Vtx0001ccsklLZbJzs5u8vlD/5A7duxoMrE7NHvN6XTSt2/f+ucLCwsbffvpztp7jfLy8jjxxBOZMmUKTz/9dLvb69u3L1lZWSH7ttNVUlNTMZlMjb7VtvTv73A4mixvNptb/PLQk91888289957fP755/Tv37/d5x9//PG8/PLLIYis+4mJiWHMmDHN/m70xvcPwJ49e/jkk09YvHhxu8/tTe+fjv5Nau591ZP+jrWH1+vloosuIjc3l08//bTF3rqm6LrOscceKz124ZKamkpqamqHzj10D/3IX5Aj5eTk4HA4WLp0KRMmTAAC40A+++wzHnjggY4FHAbtuUYHDhzgxBNPZOLEiTz//PPoevtHA5SUlLBv375mr2tPYbVamThxIkuXLmXu3Ln1zy9dupRzzz23yXOmTJnC+++/3+C5JUuWMGnSJCwWS0jj7WpKKW6++Wbefvttli9fTk5OTofqWbNmTY9/r7SV2+1m8+bNTJ8+vcnjven9c6Tnn3+etLQ0zjzzzHaf25vePx39mzRlyhSWLl3a4K7VkiVLmDp1ashj7mqHkrrt27ezbNmyDn0hUkqxdu1axowZE4IIkVmxwbJy5Ur18MMPqzVr1qhdu3ap1157TWVkZKhzzjmnQblhw4apxYsX1/98//33q4SEBLV48WK1fv169eMf/1j17dtXuVyurn4JIXfgwAE1ePBgddJJJ6n9+/er/Pz8+seRjrxGlZWV6vbbb1crV65Uubm5atmyZWrKlCmqX79+EXGNXn31VWWxWNTChQvVpk2b1K233qpiYmLU7t27lVJK3XXXXeryyy+vL79r1y4VHR2tfvnLX6pNmzaphQsXKovFot58881wvYSQuf7661VCQoJavnx5g/dKTU1NfZmjr88jjzyi3n77bbVt2za1YcMGdddddylAvfXWW+F4CSF3++23q+XLl6tdu3apr7/+Wp111lkqLi5O3j9H8Pv9asCAAerOO+9sdKw3vn8qKyvVmjVr1Jo1axRQ/3fr0KzOtvxNuvzyyxvM3P/yyy+VyWRS999/v9q8ebO6//77ldlsVl9//XWXv77Oaun6eL1edc4556j+/furtWvXNvhccrvd9XUcfX3mz5+v/vvf/6qdO3eqNWvWqKuuukqZzWb1zTffhOQ1SGIXJN99952aPHmySkhIUHa7XQ0bNkzde++9qrq6ukE5QD3//PP1PxuGoe69917lcDiUzWZTM2bMUOvXr+/i6LvG888/r4AmH0c68hrV1NSo2bNnqz59+iiLxaIGDBigrrzySrV3794wvILQeOKJJ1RWVpayWq3qmGOOabCcx5VXXqlmzpzZoPzy5cvVhAkTlNVqVdnZ2eof//hHF0fcNZp7rxz5+3P09XnggQfUoEGDlN1uV0lJSeqEE05Q//nPf7o++C5y8cUXq759+yqLxaIyMjLU+eefrzZu3Fh/vDe/fw75+OOPFaC2bt3a6FhvfP8cWtLl6MeVV16plGrb36SZM2fWlz/kjTfeUMOGDVMWi0UNHz68xybDLV2f3NzcZj+Xli1bVl/H0dfn1ltvVQMGDFBWq1X16dNHzZ49W61cuTJkr0FT6uDIWSGEEEII0aPJcidCCCGEEBFCEjshhBBCiAghiZ0QQgghRISQxE4IIYQQIkJIYieEEEIIESEksRNCCCGEiBCS2AkhhBBCRAhJ7IQQQgghIoQkdkIIIYQQEUISOyFExJg3bx6apjV67NixIyj1v/DCCyQmJgalro76/PPPOfvss8nIyEDTNN55552wxiOE6F4ksRNCRJTTTjuN/Pz8Bo+cnJxwh9WI9//buZuQqNY4juPfGW86zgnHF6IkJqQXyIWoFb0IRrUojCKIWhUMIoq4cOFCd46iuVPEBotcTPS2mEUtgqhF2KJWGYpBIFFTRLRwIcUoRsf538XlDneuY+FNbnT8feDAOc95nnOe51n9ODzP+fbtP7Wbn5+nurqaWCy2xj0SES9QsBMRTykoKGDLli1ZR15eHgD3799n7969BAIBtm/fTm9vL67rZtoODQ1RVVWF4ziEw2Ha2tpIpVIAPHnyhMbGRj5//pz5EtjT0wOQ88tZcXEx169fB+Ddu3f4fD4SiQRHjhwhEAhw69YtAOLxOJWVlQQCAXbv3s3o6Oh3x9fQ0EB/fz9nz55dg9kSEa/541d3QETk//Do0SMuXrzIyMgI9fX1vHnzhpaWFgCi0SgAfr+fkZERKioqSCaTtLW10dnZyejoKHV1dQwPD9Pd3c3MzAwAGzduXFUfurq6GBwcJB6PU1BQwNjYGNFolFgsRm1tLZOTkzQ3N+M4DpFIZG0nQETWBxMR8YhIJGJ5eXnmOE7mOHfunJmZ1dfX28DAQFb9mzdvWnl5+YrPSyQSVlZWlrmOx+MWCoWW1QPs3r17WWWhUMji8biZmSWTSQNseHg4q044HLY7d+5klfX19dmhQ4d+NNQV3ysi65u+2ImIpxw9epQrV65krh3HAeDFixc8f/6cS5cuZe4tLS2xuLjIwsICwWCQ8fFxBgYGePXqFV++fMF1XRYXF5mfn88852fs27cvcz47O8uHDx9oamqiubk5U+66LqFQ6KffJSLrk4KdiHiK4zjs3LlzWXk6naa3tzfn2rRAIMD79+85efIkra2t9PX1UVpaytOnT2lqavrhRgefz4eZZZXlavPPcJhOpwEYGxvjwIEDWfX+XhMoIrJaCnYisi7s2bOHmZmZnKEPYGJiAtd1GRwcxO//a19ZIpHIqpOfn8/S0tKytps2beLTp0+Z69evX7OwsPDd/mzevJmtW7fy9u1bLly4sNrhiIjkpGAnIutCd3c3p06dIhwOc/78efx+P9PT07x8+ZL+/n527NiB67pcvnyZ06dP8+zZM65evZr1jIqKClKpFI8fP6a6uppgMEgwGOTYsWPEYjEOHjxIOp2mq6uLDRs2/LBPPT09tLe3U1RURENDA1+/fmViYoK5uTk6OjpytkmlUln/5Usmk0xNTVFaWsq2bdt+bpJE5Pf3qxf5iYislUgkYmfOnFnx/sOHD62urs4KCwutqKjI9u/fb9euXcvcHxoasvLycissLLQTJ07YjRs3DLC5ublMndbWVisrKzPAotGomZl9/PjRjh8/bo7j2K5du+zBgwc5N09MTk4u69Pt27etpqbG8vPzraSkxA4fPmx3795dcQzj4+MGLDsikcgqZkpEvMpn9q+FISIiIiLyW9IPikVEREQ8QsFORERExCMU7EREREQ8QsFORERExCMU7EREREQ8QsFORERExCMU7EREREQ8QsFORERExCMU7EREREQ8QsFORERExCMU7EREREQ8QsFORERExCP+BL/Nz79xQVn5AAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from sklearn.cluster import KMeans\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from sklearn.decomposition import PCA\n", "\n", "# Generating random data for demonstration\n", "np.random.seed(0)\n", "X = (test_predict1 - y_test)\n", "\n", "k = 2\n", "\n", "pca = PCA(n_components=2)\n", "X = pca.fit_transform(X)\n", "\n", "kmeans = KMeans(n_clusters=k)\n", "\n", "kmeans.fit(X)\n", "\n", "\n", "\n", "# Getting the cluster centers and labels\n", "centroids = kmeans.cluster_centers_\n", "# centroids = pca.transform(centroids)\n", "labels = kmeans.labels_\n", "\n", "# Plotting the data points and cluster centers\n", "plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', alpha=0.5)\n", "plt.scatter(centroids[:, 0], centroids[:, 1], marker='x', c='red', s=200, linewidths=2)\n", "plt.text(centroids[0,0]+0.2, centroids[0,1]+0.5, 'Normal', fontsize=12, color='red')\n", "plt.text(centroids[1,0]+0.5, centroids[1,1]+0.2, 'Anomaly', fontsize=12, color='red')\n", "plt.title('KMeans Clustering')\n", "plt.xlabel('Feature 1')\n", "plt.ylabel('Feature 2')\n", "plt.tight_layout()\n", "\n", "joblib.dump(kmeans, 'kmeans_vav_1.pkl')\n", "joblib.dump(pca, 'pca_vav_1.pkl')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "k = 60\n", "X= test_predict1 - y_test\n", "processed_data = []\n", "feat_df = pd.DataFrame(columns=[\"mean\",\"std\",])\n", "for i in range(0,len(X), 60):\n", " mean = X[i:i+k].mean(axis = 0)\n", " std = X[i:i+k].std(axis = 0)\n", " max = X[i:i+k].max(axis = 0)\n", " min = X[i:i+k].min(axis = 0)\n", " iqr = np.percentile(X[i:i+k], 75, axis=0) - np.percentile(X[i:i+k], 25,axis=0)\n", " data = np.concatenate([mean, std, max, min, iqr])\n", " processed_data.append([data])\n", "processed_data = np.concatenate(processed_data,axis=0) " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "X = processed_data\n", "\n", "kmeans = KMeans(n_clusters=3, algorithm='elkan', max_iter=1000, n_init = 5)\n", "\n", "kmeans.fit(X)\n", "\n", "pca = PCA(n_components=2)\n", "X = pca.fit_transform(X)\n", "\n", "\n", "# Getting the cluster centers and labels\n", "centroids = kmeans.cluster_centers_\n", "centroids = pca.transform(centroids)\n", "labels = kmeans.labels_\n", "\n", "# Plotting the data points and cluster centers\n", "plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', alpha=0.5)\n", "plt.scatter(centroids[:, 0], centroids[:, 1], marker='x', c='red', s=200, linewidths=2)\n", "plt.title('KMeans Clustering')\n", "plt.xlabel('Feature 1')\n", "plt.ylabel('Feature 2')\n", "plt.show()\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from sklearn.mixture import GaussianMixture\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from sklearn.decomposition import PCA\n", "\n", "# Generating random data for demonstration\n", "np.random.seed(0)\n", "X = processed_data\n", "\n", "# Creating the GMM instance with desired number of clusters\n", "gmm = GaussianMixture(n_components=2, init_params='k-means++')\n", "\n", "# Fitting the model to the data\n", "gmm.fit(X)\n", "labels = gmm.predict(X)\n", "\n", "\n", "pca = PCA(n_components=2)\n", "X = pca.fit_transform(X)\n", "\n", "\n", "# Getting the cluster labels\n", "\n", "# Plotting the data points with colors representing different clusters\n", "plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', alpha=0.5)\n", "plt.title('GMM Clustering')\n", "plt.xlabel('Feature 1')\n", "plt.ylabel('Feature 2')\n", "plt.show()\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from sklearn.cluster import KMeans\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "# Generating random data for demonstration\n", "np.random.seed(0)\n", "X = test_predict1 - y_test \n", "\n", "kmeans = KMeans(n_clusters=2)\n", "\n", "kmeans.fit(X)\n", "\n", "\n", "pca = PCA(n_components=2)\n", "X = pca.fit_transform(X)\n", "\n", "\n", "\n", "# Getting the cluster centers and labels\n", "centroids = kmeans.cluster_centers_\n", "centroids = pca.transform(centroids)\n", "labels = kmeans.labels_\n", "\n", "# Plotting the data points and cluster centers\n", "plt.figure()\n", "plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', alpha=0.5)\n", "plt.scatter(centroids[:, 0], centroids[:, 1], marker='x', c='red', s=200, linewidths=2)\n", "plt.text(centroids[0,0], centroids[0,1], 'Normal', fontsize=12, color='red')\n", "plt.text(centroids[1,0], centroids[1,1], 'Anomaly', fontsize=12, color='red')\n", "plt.title('KMeans Clustering')\n", "plt.xlabel('Feature 1')\n", "plt.ylabel('Feature 2')\n", "plt.show()\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "329810" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sum(labels==0)" ] } ], "metadata": { "kernelspec": { "display_name": "tensorflow", "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.11.8" } }, "nbformat": 4, "nbformat_minor": 2 }