Skip to content

Instantly share code, notes, and snippets.

@mahyahemmat
Created February 14, 2020 20:35
Show Gist options
  • Save mahyahemmat/849e39837625fe191935ea9fd14d1a11 to your computer and use it in GitHub Desktop.
Save mahyahemmat/849e39837625fe191935ea9fd14d1a11 to your computer and use it in GitHub Desktop.
Created on Cognitive Class Labs
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a href=\"https://www.bigdatauniversity.com\"><img src = \"https://ibm.box.com/shared/static/cw2c7r3o20w9zn8gkecaeyjhgw3xdgbj.png\" width = 400, align = \"center\"></a>\n",
"# <center>Density-Based Clustering</center>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Most of the traditional clustering techniques, such as k-means, hierarchical and fuzzy clustering, can be used to group data without supervision. \n",
"\n",
"However, when applied to tasks with arbitrary shape clusters, or clusters within cluster, the traditional techniques might be unable to achieve good results. That is, elements in the same cluster might not share enough similarity or the performance may be poor.\n",
"Additionally, Density-based Clustering locates regions of high density that are separated from one another by regions of low density. Density, in this context, is defined as the number of points within a specified radius.\n",
"\n",
"\n",
"\n",
"In this section, the main focus will be manipulating the data and properties of DBSCAN and observing the resulting clustering."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Import the following libraries:\n",
"<ul>\n",
" <li> <b>numpy as np</b> </li>\n",
" <li> <b>DBSCAN</b> from <b>sklearn.cluster</b> </li>\n",
" <li> <b>make_blobs</b> from <b>sklearn.datasets.samples_generator</b> </li>\n",
" <li> <b>StandardScaler</b> from <b>sklearn.preprocessing</b> </li>\n",
" <li> <b>matplotlib.pyplot as plt</b> </li>\n",
"</ul> <br>\n",
"Remember <b> %matplotlib inline </b> to display plots"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Solving environment: failed\n",
"\n",
"PackagesNotFoundError: The following packages are not available from current channels:\n",
"\n",
" - basemap==1.1.0\n",
"\n",
"Current channels:\n",
"\n",
" - https://conda.anaconda.org/conda-forge/linux-64\n",
" - https://conda.anaconda.org/conda-forge/noarch\n",
" - https://repo.anaconda.com/pkgs/main/linux-64\n",
" - https://repo.anaconda.com/pkgs/main/noarch\n",
" - https://repo.anaconda.com/pkgs/free/linux-64\n",
" - https://repo.anaconda.com/pkgs/free/noarch\n",
" - https://repo.anaconda.com/pkgs/r/linux-64\n",
" - https://repo.anaconda.com/pkgs/r/noarch\n",
" - https://repo.anaconda.com/pkgs/pro/linux-64\n",
" - https://repo.anaconda.com/pkgs/pro/noarch\n",
"\n",
"To search for alternate channels that may provide the conda package you're\n",
"looking for, navigate to\n",
"\n",
" https://anaconda.org\n",
"\n",
"and use the search bar at the top of the page.\n",
"\n",
"\n"
]
}
],
"source": [
"# Notice: For visualization of map, you need basemap package.\n",
"# if you dont have basemap install on your machine, you can use the following line to install it\n",
"!conda install -c conda-forge basemap==1.1.0 matplotlib==2.2.2 -y\n",
"# Notice: you maight have to refresh your page and re-run the notebook after installation"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np \n",
"from sklearn.cluster import DBSCAN \n",
"from sklearn.datasets.samples_generator import make_blobs \n",
"from sklearn.preprocessing import StandardScaler \n",
"import matplotlib.pyplot as plt \n",
"%matplotlib inline"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Data generation\n",
"The function below will generate the data points and requires these inputs:\n",
"<ul>\n",
" <li> <b>centroidLocation</b>: Coordinates of the centroids that will generate the random data. </li>\n",
" <ul> <li> Example: input: [[4,3], [2,-1], [-1,4]] </li> </ul>\n",
" <li> <b>numSamples</b>: The number of data points we want generated, split over the number of centroids (# of centroids defined in centroidLocation) </li>\n",
" <ul> <li> Example: 1500 </li> </ul>\n",
" <li> <b>clusterDeviation</b>: The standard deviation between the clusters. The larger the number, the further the spacing. </li>\n",
" <ul> <li> Example: 0.5 </li> </ul>\n",
"</ul>"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"def createDataPoints(centroidLocation, numSamples, clusterDeviation):\n",
" # Create random data and store in feature matrix X and response vector y.\n",
" X, y = make_blobs(n_samples=numSamples, centers=centroidLocation, \n",
" cluster_std=clusterDeviation)\n",
" \n",
" # Standardize features by removing the mean and scaling to unit variance\n",
" X = StandardScaler().fit_transform(X)\n",
" return X, y"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Use <b>createDataPoints</b> with the <b>3 inputs</b> and store the output into variables <b>X</b> and <b>y</b>."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"X, y = createDataPoints([[4,3], [2,-1], [-1,4]] , 1500, 0.5)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Modeling\n",
"DBSCAN stands for Density-Based Spatial Clustering of Applications with Noise. This technique is one of the most common clustering algorithms which works based on density of object.\n",
"The whole idea is that if a particular point belongs to a cluster, it should be near to lots of other points in that cluster.\n",
"\n",
"It works based on two parameters: Epsilon and Minimum Points \n",
"__Epsilon__ determine a specified radius that if includes enough number of points within, we call it dense area \n",
"__minimumSamples__ determine the minimum number of data points we want in a neighborhood to define a cluster.\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([0, 0, 1, ..., 2, 2, 2])"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"epsilon = 0.3\n",
"minimumSamples = 7\n",
"db = DBSCAN(eps=epsilon, min_samples=minimumSamples).fit(X)\n",
"labels = db.labels_\n",
"labels\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Distinguish outliers\n",
"Lets Replace all elements with 'True' in core_samples_mask that are in the cluster, 'False' if the points are outliers."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([ True, True, True, ..., True, True, True])"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Firts, create an array of booleans using the labels from db.\n",
"core_samples_mask = np.zeros_like(db.labels_, dtype=bool)\n",
"core_samples_mask[db.core_sample_indices_] = True\n",
"core_samples_mask"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"3"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Number of clusters in labels, ignoring noise if present.\n",
"n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0)\n",
"n_clusters_"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{-1, 0, 1, 2}"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Remove repetition in labels by turning it into a set.\n",
"unique_labels = set(labels)\n",
"unique_labels"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Data visualization"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [],
"source": [
"# Create colors for the clusters.\n",
"colors = plt.cm.Spectral(np.linspace(0, 1, len(unique_labels)))\n"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Plot the points with colors\n",
"for k, col in zip(unique_labels, colors):\n",
" if k == -1:\n",
" # Black used for noise.\n",
" col = 'k'\n",
"\n",
" class_member_mask = (labels == k)\n",
"\n",
" # Plot the datapoints that are clustered\n",
" xy = X[class_member_mask & core_samples_mask]\n",
" plt.scatter(xy[:, 0], xy[:, 1],s=50, c=[col], marker=u'o', alpha=0.5)\n",
"\n",
" # Plot the outliers\n",
" xy = X[class_member_mask & ~core_samples_mask]\n",
" plt.scatter(xy[:, 0], xy[:, 1],s=50, c=[col], marker=u'o', alpha=0.5)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Practice\n",
"To better underestand differences between partitional and density-based clusteitng, try to cluster the above dataset into 3 clusters using k-Means. \n",
"Notice: do not generate data again, use the same dataset as above."
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Number of clusters using k_means {0, 1, 2}\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# write your code here\n",
"from sklearn.cluster import KMeans\n",
"k_means=KMeans(init=\"k-means++\",n_clusters=3, n_init=15).fit(X)\n",
"labels2=k_means.labels_\n",
"print(\"Number of clusters using k_means\",set(labels2))\n",
"\n",
"colors = plt.cm.Spectral(np.linspace(0, 1, len(set(labels2))))\n",
"for k, col in zip(set(labels2), colors):\n",
" member_mask = (labels2 == k)\n",
"\n",
" # Plot the datapoints that are clustered\n",
" plt.scatter(X[member_mask, 0], X[member_mask, 1],s=50, c=[col], marker=u'o', alpha=0.5)\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"jupyter": {
"source_hidden": true
}
},
"source": [
"Double-click __here__ for the solution.\n",
"\n",
"<!-- Your answer is below:\n",
"\n",
"\n",
"from sklearn.cluster import KMeans \n",
"k = 3\n",
"k_means3 = KMeans(init = \"k-means++\", n_clusters = k, n_init = 12)\n",
"k_means3.fit(X)\n",
"fig = plt.figure(figsize=(6, 4))\n",
"ax = fig.add_subplot(1, 1, 1)\n",
"for k, col in zip(range(k), colors):\n",
" my_members = (k_means3.labels_ == k)\n",
" plt.scatter(X[my_members, 0], X[my_members, 1], c=col, marker=u'o', alpha=0.5)\n",
"plt.show()\n",
"\n",
"\n",
"-->"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"\n",
"\n",
"<h1 align=center> Weather Station Clustering using DBSCAN & scikit-learn </h1>\n",
"<hr>\n",
"\n",
"DBSCAN is specially very good for tasks like class identification on a spatial context. The wonderful attribute of DBSCAN algorithm is that it can find out any arbitrary shape cluster without getting affected by noise. For example, this following example cluster the location of weather stations in Canada.\n",
"<Click 1>\n",
"DBSCAN can be used here, for instance, to find the group of stations which show the same weather condition. As you can see, it not only finds different arbitrary shaped clusters, can find the denser part of data-centered samples by ignoring less-dense areas or noises.\n",
"\n",
"let's start playing with the data. We will be working according to the following workflow: </font>\n",
"1. Loading data\n",
"- Overview data\n",
"- Data cleaning\n",
"- Data selection\n",
"- Clusteing"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### About the dataset\n",
"\n",
"\t\t\n",
"<h4 align = \"center\">\n",
"Environment Canada \n",
"Monthly Values for July - 2015\t\n",
"</h4>\n",
"<html>\n",
"<head>\n",
"<style>\n",
"table {\n",
" font-family: arial, sans-serif;\n",
" border-collapse: collapse;\n",
" width: 100%;\n",
"}\n",
"\n",
"td, th {\n",
" border: 1px solid #dddddd;\n",
" text-align: left;\n",
" padding: 8px;\n",
"}\n",
"\n",
"tr:nth-child(even) {\n",
" background-color: #dddddd;\n",
"}\n",
"</style>\n",
"</head>\n",
"<body>\n",
"\n",
"<table>\n",
" <tr>\n",
" <th>Name in the table</th>\n",
" <th>Meaning</th>\n",
" </tr>\n",
" <tr>\n",
" <td><font color = \"green\"><strong>Stn_Name</font></td>\n",
" <td><font color = \"green\"><strong>Station Name</font</td>\n",
" </tr>\n",
" <tr>\n",
" <td><font color = \"green\"><strong>Lat</font></td>\n",
" <td><font color = \"green\"><strong>Latitude (North+, degrees)</font></td>\n",
" </tr>\n",
" <tr>\n",
" <td><font color = \"green\"><strong>Long</font></td>\n",
" <td><font color = \"green\"><strong>Longitude (West - , degrees)</font></td>\n",
" </tr>\n",
" <tr>\n",
" <td>Prov</td>\n",
" <td>Province</td>\n",
" </tr>\n",
" <tr>\n",
" <td>Tm</td>\n",
" <td>Mean Temperature (°C)</td>\n",
" </tr>\n",
" <tr>\n",
" <td>DwTm</td>\n",
" <td>Days without Valid Mean Temperature</td>\n",
" </tr>\n",
" <tr>\n",
" <td>D</td>\n",
" <td>Mean Temperature difference from Normal (1981-2010) (°C)</td>\n",
" </tr>\n",
" <tr>\n",
" <td><font color = \"black\">Tx</font></td>\n",
" <td><font color = \"black\">Highest Monthly Maximum Temperature (°C)</font></td>\n",
" </tr>\n",
" <tr>\n",
" <td>DwTx</td>\n",
" <td>Days without Valid Maximum Temperature</td>\n",
" </tr>\n",
" <tr>\n",
" <td><font color = \"black\">Tn</font></td>\n",
" <td><font color = \"black\">Lowest Monthly Minimum Temperature (°C)</font></td>\n",
" </tr>\n",
" <tr>\n",
" <td>DwTn</td>\n",
" <td>Days without Valid Minimum Temperature</td>\n",
" </tr>\n",
" <tr>\n",
" <td>S</td>\n",
" <td>Snowfall (cm)</td>\n",
" </tr>\n",
" <tr>\n",
" <td>DwS</td>\n",
" <td>Days without Valid Snowfall</td>\n",
" </tr>\n",
" <tr>\n",
" <td>S%N</td>\n",
" <td>Percent of Normal (1981-2010) Snowfall</td>\n",
" </tr>\n",
" <tr>\n",
" <td><font color = \"green\"><strong>P</font></td>\n",
" <td><font color = \"green\"><strong>Total Precipitation (mm)</font></td>\n",
" </tr>\n",
" <tr>\n",
" <td>DwP</td>\n",
" <td>Days without Valid Precipitation</td>\n",
" </tr>\n",
" <tr>\n",
" <td>P%N</td>\n",
" <td>Percent of Normal (1981-2010) Precipitation</td>\n",
" </tr>\n",
" <tr>\n",
" <td>S_G</td>\n",
" <td>Snow on the ground at the end of the month (cm)</td>\n",
" </tr>\n",
" <tr>\n",
" <td>Pd</td>\n",
" <td>Number of days with Precipitation 1.0 mm or more</td>\n",
" </tr>\n",
" <tr>\n",
" <td>BS</td>\n",
" <td>Bright Sunshine (hours)</td>\n",
" </tr>\n",
" <tr>\n",
" <td>DwBS</td>\n",
" <td>Days without Valid Bright Sunshine</td>\n",
" </tr>\n",
" <tr>\n",
" <td>BS%</td>\n",
" <td>Percent of Normal (1981-2010) Bright Sunshine</td>\n",
" </tr>\n",
" <tr>\n",
" <td>HDD</td>\n",
" <td>Degree Days below 18 °C</td>\n",
" </tr>\n",
" <tr>\n",
" <td>CDD</td>\n",
" <td>Degree Days above 18 °C</td>\n",
" </tr>\n",
" <tr>\n",
" <td>Stn_No</td>\n",
" <td>Climate station identifier (first 3 digits indicate drainage basin, last 4 characters are for sorting alphabetically).</td>\n",
" </tr>\n",
" <tr>\n",
" <td>NA</td>\n",
" <td>Not Available</td>\n",
" </tr>\n",
"\n",
"\n",
"</table>\n",
"\n",
"</body>\n",
"</html>\n",
"\n",
" "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 1-Download data\n",
"To download the data, we will use **`!wget`**. To download the data, we will use `!wget` to download it from IBM Object Storage. \n",
"__Did you know?__ When it comes to Machine Learning, you will likely be working with large datasets. As a business, where can you host your data? IBM is offering a unique opportunity for businesses, with 10 Tb of IBM Cloud Object Storage: [Sign up now for free](http://cocl.us/ML0101EN-IBM-Offer-CC)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"!wget -O weather-stations20140101-20141231.csv https://s3-api.us-geo.objectstorage.softlayer.net/cf-courses-data/CognitiveClass/ML0101ENv3/labs/weather-stations20140101-20141231.csv"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2- Load the dataset\n",
"We will import the .csv then we creates the columns for year, month and day."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import csv\n",
"import pandas as pd\n",
"import numpy as np\n",
"\n",
"filename='weather-stations20140101-20141231.csv'\n",
"\n",
"#Read csv\n",
"pdf = pd.read_csv(filename)\n",
"pdf.head(5)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 3-Cleaning\n",
"Lets remove rows that dont have any value in the __Tm__ field."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"pdf = pdf[pd.notnull(pdf[\"Tm\"])]\n",
"pdf = pdf.reset_index(drop=True)\n",
"pdf.head(5)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4-Visualization\n",
"Visualization of stations on map using basemap package. The matplotlib basemap toolkit is a library for plotting 2D data on maps in Python. Basemap does not do any plotting on it’s own, but provides the facilities to transform coordinates to a map projections. \n",
"\n",
"Please notice that the size of each data points represents the average of maximum temperature for each station in a year. "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from mpl_toolkits.basemap import Basemap\n",
"import matplotlib.pyplot as plt\n",
"from pylab import rcParams\n",
"%matplotlib inline\n",
"rcParams['figure.figsize'] = (14,10)\n",
"\n",
"llon=-140\n",
"ulon=-50\n",
"llat=40\n",
"ulat=65\n",
"\n",
"pdf = pdf[(pdf['Long'] > llon) & (pdf['Long'] < ulon) & (pdf['Lat'] > llat) &(pdf['Lat'] < ulat)]\n",
"\n",
"my_map = Basemap(projection='merc',\n",
" resolution = 'l', area_thresh = 1000.0,\n",
" llcrnrlon=llon, llcrnrlat=llat, #min longitude (llcrnrlon) and latitude (llcrnrlat)\n",
" urcrnrlon=ulon, urcrnrlat=ulat) #max longitude (urcrnrlon) and latitude (urcrnrlat)\n",
"\n",
"my_map.drawcoastlines()\n",
"my_map.drawcountries()\n",
"# my_map.drawmapboundary()\n",
"my_map.fillcontinents(color = 'white', alpha = 0.3)\n",
"my_map.shadedrelief()\n",
"\n",
"# To collect data based on stations \n",
"\n",
"xs,ys = my_map(np.asarray(pdf.Long), np.asarray(pdf.Lat))\n",
"pdf['xm']= xs.tolist()\n",
"pdf['ym'] =ys.tolist()\n",
"\n",
"#Visualization1\n",
"for index,row in pdf.iterrows():\n",
"# x,y = my_map(row.Long, row.Lat)\n",
" my_map.plot(row.xm, row.ym,markerfacecolor =([1,0,0]), marker='o', markersize= 5, alpha = 0.75)\n",
"#plt.text(x,y,stn)\n",
"plt.show()\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 5- Clustering of stations based on their location i.e. Lat & Lon\n",
"\n",
"__DBSCAN__ form sklearn library can runs DBSCAN clustering from vector array or distance matrix. In our case, we pass it the Numpy array Clus_dataSet to find core samples of high density and expands clusters from them. "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.cluster import DBSCAN\n",
"import sklearn.utils\n",
"from sklearn.preprocessing import StandardScaler\n",
"sklearn.utils.check_random_state(1000)\n",
"Clus_dataSet = pdf[['xm','ym']]\n",
"Clus_dataSet = np.nan_to_num(Clus_dataSet)\n",
"Clus_dataSet = StandardScaler().fit_transform(Clus_dataSet)\n",
"\n",
"# Compute DBSCAN\n",
"db = DBSCAN(eps=0.15, min_samples=10).fit(Clus_dataSet)\n",
"core_samples_mask = np.zeros_like(db.labels_, dtype=bool)\n",
"core_samples_mask[db.core_sample_indices_] = True\n",
"labels = db.labels_\n",
"pdf[\"Clus_Db\"]=labels\n",
"\n",
"realClusterNum=len(set(labels)) - (1 if -1 in labels else 0)\n",
"clusterNum = len(set(labels)) \n",
"\n",
"\n",
"# A sample of clusters\n",
"pdf[[\"Stn_Name\",\"Tx\",\"Tm\",\"Clus_Db\"]].head(5)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"As you can see for outliers, the cluster label is -1"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"set(labels)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 6- Visualization of clusters based on location\n",
"Now, we can visualize the clusters using basemap:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from mpl_toolkits.basemap import Basemap\n",
"import matplotlib.pyplot as plt\n",
"from pylab import rcParams\n",
"%matplotlib inline\n",
"rcParams['figure.figsize'] = (14,10)\n",
"\n",
"my_map = Basemap(projection='merc',\n",
" resolution = 'l', area_thresh = 1000.0,\n",
" llcrnrlon=llon, llcrnrlat=llat, #min longitude (llcrnrlon) and latitude (llcrnrlat)\n",
" urcrnrlon=ulon, urcrnrlat=ulat) #max longitude (urcrnrlon) and latitude (urcrnrlat)\n",
"\n",
"my_map.drawcoastlines()\n",
"my_map.drawcountries()\n",
"#my_map.drawmapboundary()\n",
"my_map.fillcontinents(color = 'white', alpha = 0.3)\n",
"my_map.shadedrelief()\n",
"\n",
"# To create a color map\n",
"colors = plt.get_cmap('jet')(np.linspace(0.0, 1.0, clusterNum))\n",
"\n",
"\n",
"\n",
"#Visualization1\n",
"for clust_number in set(labels):\n",
" c=(([0.4,0.4,0.4]) if clust_number == -1 else colors[np.int(clust_number)])\n",
" clust_set = pdf[pdf.Clus_Db == clust_number] \n",
" my_map.scatter(clust_set.xm, clust_set.ym, color =c, marker='o', s= 20, alpha = 0.85)\n",
" if clust_number != -1:\n",
" cenx=np.mean(clust_set.xm) \n",
" ceny=np.mean(clust_set.ym) \n",
" plt.text(cenx,ceny,str(clust_number), fontsize=25, color='red',)\n",
" print (\"Cluster \"+str(clust_number)+', Avg Temp: '+ str(np.mean(clust_set.Tm)))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 7- Clustering of stations based on their location, mean, max, and min Temperature\n",
"In this section we re-run DBSCAN, but this time on a 5-dimensional dataset:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"from sklearn.cluster import DBSCAN\n",
"import sklearn.utils\n",
"from sklearn.preprocessing import StandardScaler\n",
"sklearn.utils.check_random_state(1000)\n",
"Clus_dataSet = pdf[['xm','ym','Tx','Tm','Tn']]\n",
"Clus_dataSet = np.nan_to_num(Clus_dataSet)\n",
"Clus_dataSet = StandardScaler().fit_transform(Clus_dataSet)\n",
"\n",
"# Compute DBSCAN\n",
"db = DBSCAN(eps=0.3, min_samples=10).fit(Clus_dataSet)\n",
"core_samples_mask = np.zeros_like(db.labels_, dtype=bool)\n",
"core_samples_mask[db.core_sample_indices_] = True\n",
"labels = db.labels_\n",
"pdf[\"Clus_Db\"]=labels\n",
"\n",
"realClusterNum=len(set(labels)) - (1 if -1 in labels else 0)\n",
"clusterNum = len(set(labels)) \n",
"\n",
"\n",
"# A sample of clusters\n",
"pdf[[\"Stn_Name\",\"Tx\",\"Tm\",\"Clus_Db\"]].head(5)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 8- Visualization of clusters based on location and Temperture\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from mpl_toolkits.basemap import Basemap\n",
"import matplotlib.pyplot as plt\n",
"from pylab import rcParams\n",
"%matplotlib inline\n",
"rcParams['figure.figsize'] = (14,10)\n",
"\n",
"my_map = Basemap(projection='merc',\n",
" resolution = 'l', area_thresh = 1000.0,\n",
" llcrnrlon=llon, llcrnrlat=llat, #min longitude (llcrnrlon) and latitude (llcrnrlat)\n",
" urcrnrlon=ulon, urcrnrlat=ulat) #max longitude (urcrnrlon) and latitude (urcrnrlat)\n",
"\n",
"my_map.drawcoastlines()\n",
"my_map.drawcountries()\n",
"#my_map.drawmapboundary()\n",
"my_map.fillcontinents(color = 'white', alpha = 0.3)\n",
"my_map.shadedrelief()\n",
"\n",
"# To create a color map\n",
"colors = plt.get_cmap('jet')(np.linspace(0.0, 1.0, clusterNum))\n",
"\n",
"\n",
"\n",
"#Visualization1\n",
"for clust_number in set(labels):\n",
" c=(([0.4,0.4,0.4]) if clust_number == -1 else colors[np.int(clust_number)])\n",
" clust_set = pdf[pdf.Clus_Db == clust_number] \n",
" my_map.scatter(clust_set.xm, clust_set.ym, color =c, marker='o', s= 20, alpha = 0.85)\n",
" if clust_number != -1:\n",
" cenx=np.mean(clust_set.xm) \n",
" ceny=np.mean(clust_set.ym) \n",
" plt.text(cenx,ceny,str(clust_number), fontsize=25, color='red',)\n",
" print (\"Cluster \"+str(clust_number)+', Avg Temp: '+ str(np.mean(clust_set.Tm)))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Want to learn more?\n",
"\n",
"IBM SPSS Modeler is a comprehensive analytics platform that has many machine learning algorithms. It has been designed to bring predictive intelligence to decisions made by individuals, by groups, by systems – by your enterprise as a whole. A free trial is available through this course, available here: [SPSS Modeler](http://cocl.us/ML0101EN-SPSSModeler).\n",
"\n",
"Also, you can use Watson Studio to run these notebooks faster with bigger datasets. Watson Studio is IBM's leading cloud solution for data scientists, built by data scientists. With Jupyter notebooks, RStudio, Apache Spark and popular libraries pre-packaged in the cloud, Watson Studio enables data scientists to collaborate on their projects without having to install anything. Join the fast-growing community of Watson Studio users today with a free account at [Watson Studio](https://cocl.us/ML0101EN_DSX)\n",
"\n",
"### Thanks for completing this lesson!\n",
"\n",
"Notebook created by: <a href = \"https://ca.linkedin.com/in/saeedaghabozorgi\">Saeed Aghabozorgi</a>\n",
"\n",
"<hr>\n",
"Copyright &copy; 2018 [Cognitive Class](https://cocl.us/DX0108EN_CC). This notebook and its source code are released under the terms of the [MIT License](https://bigdatauniversity.com/mit-license/).​"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python",
"language": "python",
"name": "conda-env-python-py"
},
"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.6.7"
},
"widgets": {
"state": {},
"version": "1.1.2"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment