{ "cells": [ { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [], "source": [ "import numpy as np \n", "from sklearn.cluster import DBSCAN \n", "from sklearn import metrics \n", "from sklearn.datasets.samples_generator import make_blobs \n", "from sklearn.preprocessing import StandardScaler \n", "from sklearn import datasets \n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "import pandas as pd \n", "from sklearn.neighbors import NearestNeighbors\n", "import seaborn as sns\n", "sns.set()" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "-0.6518702875468276\n", "['firebrick', 'orange', 'yellow', 'mediumseagreen']\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "data = pd.read_csv(\"oldAndNewOnlyEnglish_noDuplicatesWithLikesAndComments.csv\", engine='python') \n", "df = pd.DataFrame(data)\n", "hourIdx = df.columns.get_loc('publishedZTimeFloat')\n", "viewIdx = df.columns.get_loc('videoViews')\n", "\n", "X=data.iloc[:,[hourIdx,viewIdx]].values\n", "dbscan = DBSCAN(eps=2, min_samples=3,metric='euclidean', metric_params=None, algorithm='auto', leaf_size=30, p=None, n_jobs=None).fit(X)\n", "model = dbscan.fit(X)\n", "labels = model.labels_ \n", "\n", "samples_scores = np.zeros_like(labels, dtype=bool) \n", "samples_scores[dbscan.core_sample_indices_]=True\n", "\n", "n_clusters = len(set(labels)) - (1 if -1 in labels else 0) \n", "print(metrics.silhouette_score(X, labels))\n", "\n", "unique_labels = set(labels) \n", "# colors = ['g', 'b', 'r', 'y']\n", "colors = ['firebrick', 'orange', 'yellow', 'mediumseagreen']\n", "print(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", " xy = X[class_member_mask & samples_scores] \n", " plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=col, \n", " markeredgecolor='k', \n", " markersize=16) \n", " \n", " xy = X[class_member_mask & ~samples_scores] \n", " plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=col, \n", " markeredgecolor='k', \n", " markersize=16) \n", " \n", "#plt.title('number of clusters: %d' %n_clusters) \n", "plt.title('Popular Hour to Publish') \n", "plt.xlabel(\"Publishing Hour (Military Time GMT)\")\n", "plt.ylabel(\"Video Views\")\n", "plt.show() \n" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "108046.00051236122\n" ] } ], "source": [ "#to find epsilon value\n", "from kneebow.rotor import Rotor\n", "\n", "d = StandardScaler().fit_transform(X)\n", "d = np.nan_to_num(X)\n", "neighbors = NearestNeighbors(n_neighbors=2).fit(d)\n", "distances, indices = nbrs.kneighbors(d)\n", "distances = np.sort(distances, axis=0)\n", "distances = distances[:,1]\n", "plt.plot(distances)\n", "plt.show()\n", "\n", "rotor = Rotor()\n", "rotor.fit_rotate(np.concatenate((indices[:,0].reshape(-1,1),distances.reshape(-1,1)), axis=1))\n", "elbow_index = rotor.get_elbow_index()\n", "eps = distances[elbow_index ]\n", "print(eps)\n", "\n" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Estimated number of clusters: 4\n", "Estimated number of noise points: 25659\n", "Silhouette Coefficient: -0.652\n" ] } ], "source": [ "# Compute DBSCAN\n", "db = DBSCAN(eps=2, min_samples=3).fit(X)\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", "\n", "# Number of clusters in labels, ignoring noise if present.\n", "n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0)\n", "n_noise_ = list(labels).count(-1)\n", "\n", "print('Estimated number of clusters: %d' % n_clusters_)\n", "print('Estimated number of noise points: %d' % n_noise_)\n", "\n", "print(\"Silhouette Coefficient: %0.3f\"\n", " % metrics.silhouette_score(X, labels))" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Black removed and is used for noise instead.\n", "unique_labels = set(labels)\n", "colors = [plt.cm.Spectral(each)\n", " for each in np.linspace(0, 1, len(unique_labels))]\n", "\n", "for k, col in zip(unique_labels, colors):\n", " if k == -1:\n", " # Black used for noise.\n", " col = [0, 0, 0, 1]\n", "\n", " class_member_mask = (labels == k)\n", "\n", " xy = X[class_member_mask & core_samples_mask]\n", " plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=tuple(col),\n", " markeredgecolor='k', markersize=25)\n", "\n", " xy = X[class_member_mask & ~core_samples_mask]\n", " plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=tuple(col),\n", " markeredgecolor='k', markersize=5)\n", "\n", "plt.title('Estimated number of clusters: %d' % n_clusters_)\n", "plt.ylim([-35000000, 300000000])\n", "plt.show()\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "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.5" } }, "nbformat": 4, "nbformat_minor": 4 }