{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "name": "Clustering.ipynb",
      "provenance": [],
      "collapsed_sections": []
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "language_info": {
      "name": "python"
    }
  },
  "cells": [
    {
      "cell_type": "markdown",
      "source": [
        "# Introduction \n",
        "\n"
      ],
      "metadata": {
        "id": "PNmnb8Nf2G1a"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "Clustering refers to a very broad set of techniques for finding *subgroups*, or *clusters*, in a data set. When we cluster the observations of a data set, we seek to partition them into distinct groups so that the observations within each group are quite similar to each other.\n",
        "\n",
        "For instance, suppose that we have a set of $n$ observations, each with $p$ features. The $n$ observations could correspond to tissue samples for patients with breast cancer, and the $p$ features could correspond to measurements collected for eah tissue sample, these could be clinical measurements, such as tumor stage or grade, or they could be gene expression measurements. \n",
        "\n",
        "We may have a reason to believe that there are a few different *unknown* subtype of breast cancer. \n",
        "\n",
        " Clustering could be used to find these subgroups. This is an unsupervised problem because we are trying to discover the structure - in this case, distinct clusters - on the basis of a data set. \n",
        "\n",
        "Both clustering and PCA seek to simplify the data via a small number of summaries, but their mechanisms are different.\n",
        "\n",
        "- PCA looks to find a low-dimensional representation of the observations that explain a good fracton of the variance. \n",
        "\n",
        "- Clustering looks to find homogeneous subgroups among the observations."
      ],
      "metadata": {
        "id": "bpWDKqsSfv-g"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "#K-Means Algorithm\n",
        "\n",
        "\n",
        "\n"
      ],
      "metadata": {
        "id": "8UpHPtXk2R1t"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "1. Specify number of clusters $K$.\n",
        "2. Initialize centtroids by first shuffling the dataset and then randomly selecting $K$ data points for the centroids without replacement.\n",
        "3. Keep iterating until there is no change to the centroids i.e assignment of data points to clusters isn't changing\n",
        "  - Compute the sum of the square distance between data points and all centroids\n",
        "  - Assign each data point to the closest cluster(centroid).\n",
        "  - Compute the centroids for the clusters by taking the average of the all data points that belong to each cluster."
      ],
      "metadata": {
        "id": "2mVcCYXm4Yxi"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "# Implementation"
      ],
      "metadata": {
        "id": "InfG7sMa3lO3"
      }
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "7sNxr1R2079x",
        "outputId": "1673d685-80f2-4207-966f-89977fdfa87f"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Mounted at /content/drive\n"
          ]
        }
      ],
      "source": [
        "import random\n",
        "from google.colab import drive\n",
        "drive.mount('/content/drive')"
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "import pandas as pd\n",
        "import numpy as np\n",
        "import seaborn as sns\n",
        "import random\n",
        "import matplotlib.pyplot as plt\n",
        "\n",
        "\n",
        "%cd /content/drive/My\\ Drive/colab_notebooks/machine_learning/data/\n",
        "df = pd.read_csv(\"clustering.csv\")"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "8SbZHVxU1DDB",
        "outputId": "0e2b49e1-94c8-4cf8-aa8c-0c1760bc7897"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "/content/drive/My Drive/colab_notebooks/machine_learning/data\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "df = df[['ApplicantIncome','LoanAmount']]\n",
        "\n",
        "y1 = df['ApplicantIncome']\n",
        "n_bins = 20\n",
        "plt.hist(y1, bins=n_bins,edgecolor = \"white\")\n",
        "plt.show()"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 265
        },
        "id": "a2tv1u591UEU",
        "outputId": "55e359b6-673c-4c1c-e53f-c4916a08476b"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ],
            "image/png": "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\n"
          },
          "metadata": {
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "y1 = df['LoanAmount']\n",
        "n_bins = 20\n",
        "plt.hist(y1, bins=n_bins,edgecolor = \"white\")\n",
        "plt.show()"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 265
        },
        "id": "F2vvGjzG1-f3",
        "outputId": "2936cf51-9aff-4d5d-811e-a010f62db1a6"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ],
            "image/png": "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\n"
          },
          "metadata": {
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "def KMeanClustering(arr,K,eps):\n",
        "\n",
        "  # No of clusters are equivalent to \n",
        "  # Initialize random Centroids \n",
        " \n",
        "  n = len(arr)\n",
        "  random_centroids = random.sample(range(1, n), K)\n",
        "  centroid_val = arr[random_centroids,:]\n",
        "  centroids_lst=[]\n",
        "  centroids_lst.append(centroid_val)\n",
        "  clusters_lst = []\n",
        "  diff = 9999\n",
        "  j = 0\n",
        "  while diff > eps:\n",
        "    \n",
        "    ###########################################################\n",
        "      # 1. Code to calculate the Eucledian distance between the centroids \n",
        "      # and all the other observations.\n",
        "      # 2. Assigning observations to centroids with least distance.\n",
        "    ###########################################################\n",
        "\n",
        "    euclidean_centroid_dist = np.sqrt(np.sum(np.square(arr[:,np.newaxis,:] - centroid_val),axis=2))\n",
        "    assigned_cluster = np.argmin(euclidean_centroid_dist,axis=1).reshape(n,1)\n",
        "    clusters_lst.append(assigned_cluster)\n",
        "    ###########################################################\n",
        "      # 3. Code segment to calculate the new centroids, based on\n",
        "      #    on the assignment in the previous \"assigned cluster\"\n",
        "      #    ASSIGNMENT.\n",
        "    ###########################################################\n",
        "\n",
        "    centroid_val_old = centroid_val\n",
        "    centroid_val = np.zeros([K,arr.shape[1]])\n",
        "\n",
        "    for i in range(0,K):\n",
        "\n",
        "      cluster = np.where(assigned_cluster==i)[0]\n",
        "      cluster_arr = arr[cluster,:]\n",
        "      centroid_val[i,:] = np.mean(cluster_arr,axis=0)\n",
        "      \n",
        "    \n",
        "    ###########################################################\n",
        "      # 4. Code segment for the exit condition of the while loop\n",
        "      # - Calculate the difference between new and the previous \n",
        "      #   centroid, if the difference is below the given eps,\n",
        "      #   end the while and return the clusters and the \n",
        "      #   cluster centroids.\n",
        "      # - and if not, keep executing the while loop\n",
        "    ###########################################################\n",
        "\n",
        "    diff =  (1/n)*np.sum(np.square(centroid_val_old - centroid_val))\n",
        "    j+=1\n",
        "  \n",
        "  return assigned_cluster,centroid_val,clusters_lst,centroids_lst,j\n"
      ],
      "metadata": {
        "id": "yybuH8I_2GIh"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "arr = np.array(df)\n",
        "K = 3\n",
        "eps = 1e-5\n",
        "\n",
        "clusters,centroids,clusters_lst,centroids_lst,iter = KMeanClustering(arr,K,eps)\n"
      ],
      "metadata": {
        "id": "z3f9Ld8m4GBL"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "print(arr.shape)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "Mn7XdrC8odWQ",
        "outputId": "2bfe995c-8d23-46b9-f7e6-e3f22cdea938"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "(381, 2)\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "index0 = np.argwhere(clusters == 0).ravel()\n",
        "print(len(index0))\n",
        "cluster0 = arr[index0,:]\n",
        "print(cluster0.shape)\n",
        "index1 = np.argwhere(clusters == 1).ravel()\n",
        "cluster1 = arr[index1,:]\n",
        "\n",
        "index2 = np.argwhere(clusters == 2).ravel()\n",
        "cluster2 = arr[index2,:]"
      ],
      "metadata": {
        "id": "_91yH86BoELU",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "0f4d0eef-2652-4287-f7ca-cec871d844a9"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "86\n",
            "(86, 2)\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "plt.scatter(cluster0[:,0],cluster0[:,1],color='red',alpha=0.5,label='Cluster-1')\n",
        "plt.scatter(cluster1[:,0],cluster1[:,1],color='green',alpha=0.5,label='Cluster-2')\n",
        "plt.scatter(cluster2[:,0],cluster2[:,1],color='blue',alpha=0.5,label='Cluster-3')\n",
        "plt.title(\"Outcome of K-Mean clustering algorithm\")\n",
        "plt.legend()\n",
        "plt.grid()\n",
        "plt.show()"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 281
        },
        "id": "BG6w6yMBgFCS",
        "outputId": "aca316d8-749f-41b6-ec91-bb81ff28733d"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ],
            "image/png": "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\n"
          },
          "metadata": {
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "# Hierarchical Clustering\n",
        "\n",
        "1. Begin with $n$ observations and a measure (such as Euclidean distance) of all the  ${n \\choose 2} = n(n-1)/2$ pairwise dissimilarities. Treat each observation as its own cluster.\n",
        "\n",
        "2. For $i = n,n-1,\\ldots, 2$:\n",
        "\n",
        "  (a) Examine all pairwise inter-cluster dissimilarities among the $i$ clusters and identify the pair of clusters that are least dissimilar ( that is, most similar). Fuse these two clusters. The dissimilarity between these two clusters indicates the height in the denogram at which the fusion should be placed. \n",
        "\n",
        "  (b) Compute the new pairwise inter-cluster dissimilarities among the $i-1$ remaining clusters \n",
        "\n",
        "\n",
        "---------------------------------\n",
        "\n",
        "The above mentioned algorithm is simple enough, but one issue has not been addressed. \n",
        "- We have a concept of the dissimilarity between paris of observations, but how do we define the dissimilarity between two clusters if one or both of the clusters contains multiple observations ?\n",
        "\n",
        "- The concept of dissimilarity between a pair of observations needs to be extended to a pair of *groups of observations*. This extension is achieved by developing the notion of *linkage*, which defines the dissimilarity between two groups of observations. \n",
        "\n",
        "- The four most common types of linkage - *complete,average,single and centroid*.\n",
        "\n",
        "For our implementation, we will consider the **Complete Linkage**\n",
        "\n",
        "**Complete Linkage** : Maximal intercluster dissimilarity. Compute all pairwise dissimilarities between the observations in cluster $A$ and the observations in cluster $B$, and record the largest of these dissimilarities. \n"
      ],
      "metadata": {
        "id": "31SiPB9UNXTo"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Example : Agglomerative Hierarchical Clustering\n",
        "\n",
        "[Source](https://online.stat.psu.edu/stat555/node/86/)\n",
        "\n",
        "Clustering starts by computing a distance between every pair of units that you want to cluster. A distance matrix will be symmetric. The table below is an example of a distance matrix. Only the lower triangle is show, because the upper triangle can be filled in my reflection.\n",
        "\n",
        "\\begin{align}\n",
        "\\begin{array}{|c|} \\hline\n",
        " & 1 & 2 & 3 & 4 & 5\\\\ \\hline\n",
        "1 & 0 &  &  \\\\\n",
        "2 & 9 & 0  \\\\\n",
        "3 & 3 & 7 & 0 \\\\ \n",
        "4 & 6 & 5 & 9 & 0\\\\\n",
        "5 & 11 & 10 & 2 & 8 & 0\\\\ \\hline\n",
        "\\end{array}\n",
        "\\end{align}\n",
        "\n",
        "- Now let's start clustering. The smallest distance is between three and five and they get linked up or merged first into a cluster '35'.\n",
        "\n",
        "- To obtain the new distance matrix, we need to remove the 3 and 5 entries and replace with by entry '35'.\n",
        "- Since we are using complete linkage clustering, the distance between '35' and every other item is the maximum of the distance between this item and 3 and this item and 5.\n",
        "\n",
        "    - for example : $d(1,3) = 3, d(1,5)=11 => D(1,\"35\")=11$\n",
        "    This gives us the distance matrix. The items in with the smallest distance get clustered next.\n",
        "\n",
        "\\begin{align}\n",
        "\\begin{array}{|c|} \\hline\n",
        " & 35 & 1 & 2& 4 \\\\ \\hline\n",
        "35 & 0 &  &  \\\\\n",
        "1 & 11 & 0  \\\\\n",
        "2 & 10 & 9 & 0 \\\\ \n",
        "4 & 9 & 6 & 5 & 0\\\\  \\hline\n",
        "\\end{array}\n",
        "\\end{align}\n",
        "\n",
        "Similarly\n",
        "\n",
        "Now, we combine $2 \\text{ & } 4$\n",
        "\n",
        "\\begin{align}\n",
        "\\begin{array}{|c|} \\hline\n",
        " & 35 & 24 & 1 \\\\ \\hline\n",
        "35 & 0 &  &  \\\\\n",
        "24 & 10 & 0  \\\\\n",
        "1 & 11 & 9 & 0 \\\\ \\hline\n",
        "\\end{array}\n",
        "\\end{align}\n",
        "\n",
        "Now we combine $'24' \\text{ with } 1$\n",
        "\n",
        "\\begin{align}\n",
        "\\begin{array}{|c|} \\hline\n",
        " & 35 & 241  \\\\ \\hline\n",
        "35 & 0 &  &  \\\\\n",
        "241 & 11 & 0  \\\\ \\hline\n",
        "\\end{array}\n",
        "\\end{align}\n",
        "\n",
        "The above results is summarized below. On this plot, the y-axis shows the distance between the objects at the time they were clustered. This is called the **Clustered Height**. \n",
        "\n",
        "\n",
        "\n"
      ],
      "metadata": {
        "id": "EV4cCITlduWp"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "![Screenshot 2022-03-09 174050.png](data:image/png;base64,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)"
      ],
      "metadata": {
        "id": "cpuYVIq_jtnx"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "**Determining Clusters**\n",
        "\n",
        "One of the problems with hierarchical clustering is that there is no objective way to say how many clusters there are. \n",
        "If we cut the single linkage tree at the point shown, we would say we have two clusters. \n"
      ],
      "metadata": {
        "id": "T09L2-HvjxjY"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "![Screenshot 2022-03-09 174050.png](data:image/png;base64,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)"
      ],
      "metadata": {
        "id": "DABXLpR6Su5o"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "However, if we cut the tree lower we might say that there is one cluster and two singletons."
      ],
      "metadata": {
        "id": "LnrdewEJS8mr"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "![Screenshot 2022-03-09 174050.png](data:image/png;base64,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)"
      ],
      "metadata": {
        "id": "YhT_LApITJQj"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "\n",
        "\n"
      ],
      "metadata": {
        "id": "x1dITj_HTKaY"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# to run the code on the data set above and then a little larger data set \n",
        "\n",
        "class HierarchicalClustering:\n",
        "\n",
        "  def __init__(self,arr):\n",
        "    self.arr = arr\n",
        "    self.n = len(self.arr)\n",
        "    self.stagearr = np.zeros([2,self.n])\n",
        "    l = int(np.ceil(self.n/2))\n",
        "    print(\"l\",l)\n",
        "    self.clusters = np.empty(l,dtype=object)\n",
        "    self.clusterCounter = 0\n",
        "  \n",
        "  #def euclideanDist(self)\n",
        "  \n",
        "  def CompleteLinkage(self):\n",
        "\n",
        "    # call the EuclideanDist Function\n",
        "    # For this example, we are skipping that step\n",
        "\n",
        "\n",
        "    self.arr = np.where(self.arr == 0, 100, self.arr)\n",
        "\n",
        "    for k in range(len(self.arr),2,-1):\n",
        "\n",
        "      print(\"k\",k)\n",
        "      \n",
        "      \n",
        "      self.pos = np.where(self.arr == np.min(self.arr))[0]\n",
        "\n",
        "      print(\"self.pos\",self.pos)\n",
        "\n",
        "      # First calling the cluster function, to save the newly groups \n",
        "      # cluster \n",
        "      \n",
        "      self.storeclusters()\n",
        "\n",
        "      self.stagearr = self.arr[self.pos,:]\n",
        "\n",
        "      #2 Delete statement one row and one column\n",
        "      self.arr[self.pos,:] =  100\n",
        "      self.arr[:,self.pos] =  100\n",
        "      print(\"self.arr\",\"\\n\",self.arr)\n",
        "      #self.arr = np.delete(self.arr,self.pos,axis=1)\n",
        "      #self.arr = np.delete(self.arr,self.pos,axis=0)\n",
        "    \n",
        "      # deleting the present cluster indexes from the stage arr\n",
        "      print(\"stagearr\",\"\\n\",self.stagearr)\n",
        "      self.stagearr[:,self.pos] =  100\n",
        "   \n",
        "      \n",
        "      print(\"After placeete\",self.stagearr)\n",
        "      self.arr[self.pos,:] =  self.stagearr\n",
        "      self.arr[:,self.pos] =  self.stagearr.T\n",
        "      newrow = np.max(self.stagearr,axis=0)\n",
        "      newrow = newrow.reshape(len(self.stagearr[1]),1)\n",
        "\n",
        "      #self.arr = np.hstack((self.arr, newrow))\n",
        "\n",
        "      newrow = np.append(newrow,100)\n",
        "      #self.arr = np.vstack((self.arr, newrow.T))\n",
        "      \n",
        "\n",
        "      print(\"self.arr\")\n",
        "      print(self.arr)\n",
        "      \n",
        "  \n",
        "  def storeclusters(self):\n",
        "    \n",
        "    print(\"we are in clusters \")\n",
        "    is_looping = True\n",
        "\n",
        "    # When no clusters are created yet.\n",
        "    if self.clusterCounter == 0:\n",
        "      self.clusters[0] = self.pos\n",
        "      is_looping = False\n",
        "\n",
        "    else:\n",
        "      i = 0\n",
        "      while  i < self.clusterCounter:\n",
        "        \n",
        "        for j in range(0,2):\n",
        "          print(\"j0\",j)\n",
        "          print(\"i\",i)\n",
        "         \n",
        "          if self.clusters[i] is None:\n",
        "            self.clusters[i] = self.pos\n",
        "            is_looping = False\n",
        "            break\n",
        "          elif any(x in self.pos for x in self.clusters[i]):\n",
        "            self.clusters[i] = np.append(self.clusters[i],self.pos)\n",
        "            print(\"elIf\", self.clusters )\n",
        "            is_looping = False\n",
        "            break\n",
        "          else:\n",
        "            continue\n",
        "\n",
        "        if is_looping is False:\n",
        "          break  \n",
        "        else:\n",
        "          i+=1\n",
        "          \n",
        "          \n",
        "    # Case when none of the existing clusters contain any of the \n",
        "    # 2 new cluster values.\n",
        "    if is_looping is True:\n",
        "      self.clusters[self.clusterCounter+1] = self.pos\n",
        "     \n",
        "\n",
        "    self.clusterCounter +=1\n",
        "    print(\"Cluster Counter\",self.clusterCounter)\n",
        "    print(\"Cluster\",self.clusters)\n",
        "    return self.clusters\n",
        "\n"
      ],
      "metadata": {
        "id": "88MG6dsijudS"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "f = HierarchicalClustering(x)\n",
        "f.CompleteLinkage()\n",
        "#f.clusters()"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 426
        },
        "id": "51XYPvwTm-YV",
        "outputId": "05e5c49a-0846-42d4-dda6-6b24b3cdd2bc"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "l 13\n",
            "k 25\n",
            "self.pos [9]\n",
            "we are in clusters \n",
            "Cluster Counter 1\n",
            "Cluster [array([9]) None None None None None None None None None None None None]\n"
          ]
        },
        {
          "output_type": "error",
          "ename": "IndexError",
          "evalue": "ignored",
          "traceback": [
            "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
            "\u001b[0;31mIndexError\u001b[0m                                Traceback (most recent call last)",
            "\u001b[0;32m<ipython-input-33-c130cb51fea9>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m      1\u001b[0m \u001b[0mf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mHierarchicalClustering\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mCompleteLinkage\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      3\u001b[0m \u001b[0;31m#f.clusters()\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
            "\u001b[0;32m<ipython-input-29-acaeabce0c99>\u001b[0m in \u001b[0;36mCompleteLinkage\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m     40\u001b[0m       \u001b[0;31m#2 Delete statement one row and one column\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     41\u001b[0m       \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marr\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpos\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m  \u001b[0;36m100\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 42\u001b[0;31m       \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marr\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpos\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m  \u001b[0;36m100\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     43\u001b[0m       \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"self.arr\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\"\\n\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     44\u001b[0m       \u001b[0;31m#self.arr = np.delete(self.arr,self.pos,axis=1)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
            "\u001b[0;31mIndexError\u001b[0m: index 9 is out of bounds for axis 1 with size 2"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "import random\n",
        "random.seed(2)\n",
        "x = np.random.normal(10,5,50).reshape(25,2)\n",
        "x[0:25,0] = x[0:25,0]+ 3\n",
        "x[0:25,1] = x[0:25,1]-4\n",
        "print(x)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "ToWQFpFE6RpK",
        "outputId": "338d15d5-dc4d-4bc1-b0a2-de0ff8217202"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "[[ 5.34527179  9.4738194 ]\n",
            " [12.45726243  9.7374621 ]\n",
            " [11.94022622 12.54273861]\n",
            " [18.64258696 12.94332958]\n",
            " [14.15161936 10.44465552]\n",
            " [ 6.60958318  3.50734521]\n",
            " [16.57726073  8.24986018]\n",
            " [15.59865107  6.19294276]\n",
            " [ 4.85377854  9.50420034]\n",
            " [13.48193936 -0.30374516]\n",
            " [24.95740923  4.15751527]\n",
            " [23.04742754 14.06541976]\n",
            " [ 8.23589844 13.4393038 ]\n",
            " [15.08959773 10.02123544]\n",
            " [ 7.55952291 11.11464924]\n",
            " [13.06392298  3.96984672]\n",
            " [16.07720439  4.52031749]\n",
            " [10.04113041  8.9965649 ]\n",
            " [12.05649419  6.48268752]\n",
            " [17.24744721 15.21122072]\n",
            " [14.23036583  9.28744381]\n",
            " [ 5.97560551  1.52259464]\n",
            " [10.92930899  6.17710445]\n",
            " [15.94983823  3.40697168]\n",
            " [15.79299311  1.98262685]]\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "import scipy.cluster.hierarchy as sch\n",
        "dendrogram = sch.dendrogram(sch.linkage(x, method='ward'))"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 271
        },
        "id": "rvkctGrj5UzD",
        "outputId": "47be6da1-a2cd-4daf-8be2-9f1eeb4ddc8b"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ],
            "image/png": "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\n"
          },
          "metadata": {
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "import numpy as np\n",
        "g = np.array([[0,9,3,6,11],\n",
        "                [9,0,7,5,10],\n",
        "                [3,7,0,9,2],\n",
        "                [6,5,9,0,8],\n",
        "                [11,10,2,8,0]])\n"
      ],
      "metadata": {
        "id": "LBEd7kFHk-WC"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "f = [3,5]\n",
        "t = [[7,8],[4,5],[6,0]]\n",
        "\n",
        "any(x in f for x in t[1])\n"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "BV_iy5xEKb4k",
        "outputId": "e1ed9a8b-4c15-4d42-a006-ae5d6fbb9d29"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "True"
            ]
          },
          "metadata": {},
          "execution_count": 156
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "import pandas as pd\n",
        "import numpy as np\n",
        "import seaborn as sns\n",
        "import matplotlib.pyplot as plt\n",
        "\n",
        "\n",
        "%cd /content/drive/My\\ Drive/colab_notebooks/machine_learning/data/\n",
        "df = pd.read_csv(\"Mall_Customers.csv\")"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "3EU9AawtJFiw",
        "outputId": "61991605-1db2-4f77-ec8f-0488340a4116"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "/content/drive/My Drive/colab_notebooks/machine_learning/data\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "df.columns\n",
        "df = df.loc[:,['Annual Income (k$)','Spending Score (1-100)']]\n",
        "df"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 423
        },
        "id": "sgTTXhl_hH_5",
        "outputId": "5eac8691-05a5-4087-b4db-9edb6e761825"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/html": [
              "\n",
              "  <div id=\"df-37c99dde-fe0a-4590-a5c6-3186f2915241\">\n",
              "    <div class=\"colab-df-container\">\n",
              "      <div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>Annual Income (k$)</th>\n",
              "      <th>Spending Score (1-100)</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>15</td>\n",
              "      <td>39</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>15</td>\n",
              "      <td>81</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>16</td>\n",
              "      <td>6</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>16</td>\n",
              "      <td>77</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>17</td>\n",
              "      <td>40</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>...</th>\n",
              "      <td>...</td>\n",
              "      <td>...</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>195</th>\n",
              "      <td>120</td>\n",
              "      <td>79</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>196</th>\n",
              "      <td>126</td>\n",
              "      <td>28</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>197</th>\n",
              "      <td>126</td>\n",
              "      <td>74</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>198</th>\n",
              "      <td>137</td>\n",
              "      <td>18</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>199</th>\n",
              "      <td>137</td>\n",
              "      <td>83</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "<p>200 rows × 2 columns</p>\n",
              "</div>\n",
              "      <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-37c99dde-fe0a-4590-a5c6-3186f2915241')\"\n",
              "              title=\"Convert this dataframe to an interactive table.\"\n",
              "              style=\"display:none;\">\n",
              "        \n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "       width=\"24px\">\n",
              "    <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n",
              "    <path d=\"M18.56 5.44l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94zm-11 1L8.5 8.5l.94-2.06 2.06-.94-2.06-.94L8.5 2.5l-.94 2.06-2.06.94zm10 10l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94z\"/><path d=\"M17.41 7.96l-1.37-1.37c-.4-.4-.92-.59-1.43-.59-.52 0-1.04.2-1.43.59L10.3 9.45l-7.72 7.72c-.78.78-.78 2.05 0 2.83L4 21.41c.39.39.9.59 1.41.59.51 0 1.02-.2 1.41-.59l7.78-7.78 2.81-2.81c.8-.78.8-2.07 0-2.86zM5.41 20L4 18.59l7.72-7.72 1.47 1.35L5.41 20z\"/>\n",
              "  </svg>\n",
              "      </button>\n",
              "      \n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      flex-wrap:wrap;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "      <script>\n",
              "        const buttonEl =\n",
              "          document.querySelector('#df-37c99dde-fe0a-4590-a5c6-3186f2915241 button.colab-df-convert');\n",
              "        buttonEl.style.display =\n",
              "          google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "        async function convertToInteractive(key) {\n",
              "          const element = document.querySelector('#df-37c99dde-fe0a-4590-a5c6-3186f2915241');\n",
              "          const dataTable =\n",
              "            await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                     [key], {});\n",
              "          if (!dataTable) return;\n",
              "\n",
              "          const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "            '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "            + ' to learn more about interactive tables.';\n",
              "          element.innerHTML = '';\n",
              "          dataTable['output_type'] = 'display_data';\n",
              "          await google.colab.output.renderOutput(dataTable, element);\n",
              "          const docLink = document.createElement('div');\n",
              "          docLink.innerHTML = docLinkHtml;\n",
              "          element.appendChild(docLink);\n",
              "        }\n",
              "      </script>\n",
              "    </div>\n",
              "  </div>\n",
              "  "
            ],
            "text/plain": [
              "     Annual Income (k$)  Spending Score (1-100)\n",
              "0                    15                      39\n",
              "1                    15                      81\n",
              "2                    16                       6\n",
              "3                    16                      77\n",
              "4                    17                      40\n",
              "..                  ...                     ...\n",
              "195                 120                      79\n",
              "196                 126                      28\n",
              "197                 126                      74\n",
              "198                 137                      18\n",
              "199                 137                      83\n",
              "\n",
              "[200 rows x 2 columns]"
            ]
          },
          "metadata": {},
          "execution_count": 125
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        ""
      ],
      "metadata": {
        "id": "5q3-dBcjkMno"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "import numpy as np\n",
        "\n",
        "a = np.array([[1,2,3],[4,6,7],[10,11,12]])\n",
        "print(a)\n",
        "g = np.square(a - a[:,np.newaxis,:])\n",
        "print(g)\n",
        "h = np.sum(g,axis=2)\n",
        "print(h)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "4W-qM9CrYsFH",
        "outputId": "7e8e1465-69fe-41bf-84ea-544a0683bb6c"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "[[ 1  2  3]\n",
            " [ 4  6  7]\n",
            " [10 11 12]]\n",
            "[[[ 0  0  0]\n",
            "  [ 9 16 16]\n",
            "  [81 81 81]]\n",
            "\n",
            " [[ 9 16 16]\n",
            "  [ 0  0  0]\n",
            "  [36 25 25]]\n",
            "\n",
            " [[81 81 81]\n",
            "  [36 25 25]\n",
            "  [ 0  0  0]]]\n",
            "[[  0  41 243]\n",
            " [ 41   0  86]\n",
            " [243  86   0]]\n"
          ]
        }
      ]
    }
  ]
}