From 183e3ae94443ec9e4dfa4774ea9b706390744bae Mon Sep 17 00:00:00 2001 From: Kaarina Kangas <kmkang@utu.fi> Date: Wed, 8 Jan 2020 21:52:53 +0200 Subject: [PATCH] Upload New File --- ...Unsupervised_learning_Kaarina_Kangas.ipynb | 1472 +++++++++++++++++ 1 file changed, 1472 insertions(+) create mode 100644 DAKD_Exercise_4._Unsupervised_learning_Kaarina_Kangas.ipynb diff --git a/DAKD_Exercise_4._Unsupervised_learning_Kaarina_Kangas.ipynb b/DAKD_Exercise_4._Unsupervised_learning_Kaarina_Kangas.ipynb new file mode 100644 index 0000000..dfdc8fa --- /dev/null +++ b/DAKD_Exercise_4._Unsupervised_learning_Kaarina_Kangas.ipynb @@ -0,0 +1,1472 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "DATA ANALYSIS AND KNOWLEDGE DISCOVERY\n", + "Exercise 4.\n", + "Kaarina Kangas" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Part 1.\n", + "Download the file data.txt from the Moodle web page (right click and “save link as” or similar). Use\n", + "principal component analysis to map the data to 2 dimensions, visualize the data as scatter plot (you\n", + "can re-use code for exercise 2). How many clusters can you identify from the data just by looking at the\n", + "visualization? Answer is 3.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "#command will bring pandas to use for programming\n", + "import matplotlib.pyplot as plt\n", + "#command will bring matplotlig to use for programming\n", + "import numpy as np\n", + "#command will bring numpy to use for programming\n", + "#https://pandas.pydata.org was used tutorial and https://www.scikit-learn.org\n", + "from sklearn.decomposition import PCA\n", + "from sklearn.preprocessing import StandardScaler\n", + "%matplotlib inline\n", + "#\"The main goal of a PCA analysis is to identify patterns in data; PCA aims to detect the correlation between variables. \n", + "#If a strong correlation between variables exists, the attempt to reduce the dimensionality only makes sense. \n", + "#In a nutshell, this is what PCA is all about: Finding the directions of maximum variance in high-dimensional data\n", + "#and project it onto a smaller dimensional subspace while retaining most of the information.\"\n", + "# -https://plot.ly/ipython-notebooks/principal-component-analysis/" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [], + "source": [ + "df = pd.read_csv('data_demo4.txt',names=['c0','c1','c2','c3','c4','c5','c6','c7','c8','c9'])\n", + "#reading datafile and setting names for columns(c0, c1, ...,c9)" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<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>c0</th>\n", + " <th>c1</th>\n", + " <th>c2</th>\n", + " <th>c3</th>\n", + " <th>c4</th>\n", + " <th>c5</th>\n", + " <th>c6</th>\n", + " <th>c7</th>\n", + " <th>c8</th>\n", + " <th>c9</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>-2.166277</td>\n", + " <td>-4.020569</td>\n", + " <td>-2.224629</td>\n", + " <td>-0.744496</td>\n", + " <td>0.187894</td>\n", + " <td>10.820724</td>\n", + " <td>-1.838109</td>\n", + " <td>4.572097</td>\n", + " <td>5.621567</td>\n", + " <td>-2.193658</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>0.466220</td>\n", + " <td>-0.984241</td>\n", + " <td>8.120305</td>\n", + " <td>1.769738</td>\n", + " <td>5.103642</td>\n", + " <td>-7.579323</td>\n", + " <td>-0.636731</td>\n", + " <td>-11.535472</td>\n", + " <td>-8.444525</td>\n", + " <td>9.213106</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>8.870568</td>\n", + " <td>4.534762</td>\n", + " <td>5.076998</td>\n", + " <td>0.803536</td>\n", + " <td>9.551406</td>\n", + " <td>-4.086241</td>\n", + " <td>6.211424</td>\n", + " <td>3.353619</td>\n", + " <td>3.872890</td>\n", + " <td>-4.729020</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3</th>\n", + " <td>-0.794916</td>\n", + " <td>-0.191408</td>\n", + " <td>8.084670</td>\n", + " <td>0.813292</td>\n", + " <td>2.307681</td>\n", + " <td>-8.321887</td>\n", + " <td>-2.995845</td>\n", + " <td>-7.096448</td>\n", + " <td>-6.975285</td>\n", + " <td>8.582852</td>\n", + " </tr>\n", + " <tr>\n", + " <th>4</th>\n", + " <td>-0.439401</td>\n", + " <td>-0.514456</td>\n", + " <td>-7.736412</td>\n", + " <td>11.649598</td>\n", + " <td>9.093758</td>\n", + " <td>0.288513</td>\n", + " <td>-3.552052</td>\n", + " <td>5.786757</td>\n", + " <td>4.540192</td>\n", + " <td>-2.991714</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " c0 c1 c2 c3 c4 c5 c6 \\\n", + "0 -2.166277 -4.020569 -2.224629 -0.744496 0.187894 10.820724 -1.838109 \n", + "1 0.466220 -0.984241 8.120305 1.769738 5.103642 -7.579323 -0.636731 \n", + "2 8.870568 4.534762 5.076998 0.803536 9.551406 -4.086241 6.211424 \n", + "3 -0.794916 -0.191408 8.084670 0.813292 2.307681 -8.321887 -2.995845 \n", + "4 -0.439401 -0.514456 -7.736412 11.649598 9.093758 0.288513 -3.552052 \n", + "\n", + " c7 c8 c9 \n", + "0 4.572097 5.621567 -2.193658 \n", + "1 -11.535472 -8.444525 9.213106 \n", + "2 3.353619 3.872890 -4.729020 \n", + "3 -7.096448 -6.975285 8.582852 \n", + "4 5.786757 4.540192 -2.991714 " + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.head()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "features = ['c0','c1','c2','c3','c4','c5','c6','c7','c8','c9']\n", + "x = df.loc[:, features].values\n", + "#https://github.com/mGalarnyk/Python_Tutorials/blob/master/Sklearn/PCA/PCA_Data_Visualization_Iris_Dataset_Blog.ipynb\n", + "# I set all data values to x." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "x = StandardScaler().fit_transform(x)\n", + "# In unsupervised learning only x-axis is needed. \n", + "# Since PCA yields a feature subspace that maximizes the variance along the axes, it's good to standardize the data." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<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>c0</th>\n", + " <th>c1</th>\n", + " <th>c2</th>\n", + " <th>c3</th>\n", + " <th>c4</th>\n", + " <th>c5</th>\n", + " <th>c6</th>\n", + " <th>c7</th>\n", + " <th>c8</th>\n", + " <th>c9</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>-0.770309</td>\n", + " <td>-0.780267</td>\n", + " <td>-0.386000</td>\n", + " <td>-0.595266</td>\n", + " <td>-0.893091</td>\n", + " <td>1.591732</td>\n", + " <td>-0.158643</td>\n", + " <td>0.411088</td>\n", + " <td>0.955340</td>\n", + " <td>-0.257732</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>-0.200263</td>\n", + " <td>-0.019122</td>\n", + " <td>1.166711</td>\n", + " <td>-0.066060</td>\n", + " <td>0.145749</td>\n", + " <td>-1.135672</td>\n", + " <td>0.197963</td>\n", + " <td>-2.020840</td>\n", + " <td>-2.084323</td>\n", + " <td>1.761965</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>1.619629</td>\n", + " <td>1.364380</td>\n", + " <td>0.709929</td>\n", + " <td>-0.269430</td>\n", + " <td>1.085690</td>\n", + " <td>-0.617899</td>\n", + " <td>2.230706</td>\n", + " <td>0.227122</td>\n", + " <td>0.577453</td>\n", + " <td>-0.706646</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3</th>\n", + " <td>-0.473352</td>\n", + " <td>0.179625</td>\n", + " <td>1.161362</td>\n", + " <td>-0.267376</td>\n", + " <td>-0.445119</td>\n", + " <td>-1.245740</td>\n", + " <td>-0.502295</td>\n", + " <td>-1.350634</td>\n", + " <td>-1.766822</td>\n", + " <td>1.650372</td>\n", + " </tr>\n", + " <tr>\n", + " <th>4</th>\n", + " <td>-0.396368</td>\n", + " <td>0.098644</td>\n", + " <td>-1.213284</td>\n", + " <td>2.013492</td>\n", + " <td>0.988975</td>\n", + " <td>0.030562</td>\n", + " <td>-0.667394</td>\n", + " <td>0.594478</td>\n", + " <td>0.721656</td>\n", + " <td>-0.399037</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " c0 c1 c2 c3 c4 c5 c6 \\\n", + "0 -0.770309 -0.780267 -0.386000 -0.595266 -0.893091 1.591732 -0.158643 \n", + "1 -0.200263 -0.019122 1.166711 -0.066060 0.145749 -1.135672 0.197963 \n", + "2 1.619629 1.364380 0.709929 -0.269430 1.085690 -0.617899 2.230706 \n", + "3 -0.473352 0.179625 1.161362 -0.267376 -0.445119 -1.245740 -0.502295 \n", + "4 -0.396368 0.098644 -1.213284 2.013492 0.988975 0.030562 -0.667394 \n", + "\n", + " c7 c8 c9 \n", + "0 0.411088 0.955340 -0.257732 \n", + "1 -2.020840 -2.084323 1.761965 \n", + "2 0.227122 0.577453 -0.706646 \n", + "3 -1.350634 -1.766822 1.650372 \n", + "4 0.594478 0.721656 -0.399037 " + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pd.DataFrame(data = x, columns = features).head()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "pca = PCA(n_components=2)\n", + "# Map the data to 2 dimensions." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "principalComponents = pca.fit_transform(x)\n", + "# Map the data named x to 2 dimensions. In this case all 10 columns are now fit to 2." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "principalDf = pd.DataFrame(data = principalComponents\n", + " , columns = ['principal component 1', 'principal component 2'])\n", + "#New 2 dimensions dataframe and titles named principalDf." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<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>principal component 1</th>\n", + " <th>principal component 2</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>-1.955429</td>\n", + " <td>-0.386874</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>3.300656</td>\n", + " <td>-1.394092</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>0.991221</td>\n", + " <td>3.252883</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3</th>\n", + " <td>2.828029</td>\n", + " <td>-1.697000</td>\n", + " </tr>\n", + " <tr>\n", + " <th>4</th>\n", + " <td>-1.373290</td>\n", + " <td>-0.449426</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " principal component 1 principal component 2\n", + "0 -1.955429 -0.386874\n", + "1 3.300656 -1.394092\n", + "2 0.991221 3.252883\n", + "3 2.828029 -1.697000\n", + "4 -1.373290 -0.449426" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "principalDf.head(5)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0.5,1,'2 Component PCA')" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + }, + { + "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": [ + "ax = principalDf.plot.scatter (x='principal component 1', y='principal component 2',c='DarkBlue')\n", + "ax.set_title('2 Component PCA', fontsize = 14)\n", + "#Visualize the entire data set according to 2 principal components." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "There are 3 data clusters." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Part 2.\n", + "Run K-means clustering on the data for different values of K (use the original 10-dimensional data as\n", + "input to K-means, not the PCA projection). Select the number K for which the clustering has the\n", + "maximal Silhouette Score. Color the scatter plot of the PCA projection so that members of each cluster\n", + "are colored differently.\n", + "\n", + "Silhouette Score is maximal with 4 number for K.\n", + "For n_clusters = 4 The average silhouette_score is : 0.7454287961149871" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "from copy import deepcopy\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "#https://mubaris.com/posts/kmeans-clustering/\n", + "\n", + "import sklearn\n", + "from sklearn.cluster import KMeans\n", + "from sklearn.preprocessing import scale\n", + "\n", + "import sklearn.metrics as sm\n", + "from sklearn import datasets\n", + "from sklearn.metrics import confusion_matrix,classification_report\n", + "#https://www.youtube.com/watch?v=ikt0sny_ImY \n" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "KMeans(algorithm='auto', copy_x=True, init='k-means++', max_iter=300,\n", + " n_clusters=4, n_init=10, n_jobs=1, precompute_distances='auto',\n", + " random_state=None, tol=0.0001, verbose=0)" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X = np.array(df).astype(float)\n", + "#kmeans = KMeans(n_clusters=3, random_state=0).fit(X)\n", + "clf = KMeans(n_clusters=4, init='k-means++')\n", + "# \"One method to help adress the centroid is the k-means++ initialication scheme, which has been iplemented in scikit-learn\n", + "# (use the init='k-means++' parameter). This initialices the centroids to be (generally) distant from each other, leading to \n", + "# provably better results than random initilization, 'k-means++': selects initial cluster centers for k-means clustering\n", + "# in a smart way to speed up convergence.\" -https://learn.sherlockml.com/tutorials/k-means\n", + "clf.fit(X)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "DescribeResult(nobs=500, minmax=(array([ -6.64466089, -9.38502581, -10.59554631, -6.50329228,\n", + " -6.93525397, -12.96727799, -7.81362367, -12.55737397,\n", + " -10.07657143, -9.89563763]), array([11.42989799, 7.5932331 , 12.19192828, 14.51311316, 13.02223292,\n", + " 13.39413654, 8.52773564, 11.86979348, 9.53914175, 11.61122323])), mean=array([ 1.3910457 , -0.90796239, 0.34709419, 2.08358541, 4.4139649 ,\n", + " 0.08232785, -1.30365226, 1.84930647, 1.20071427, -0.73805181]), variance=array([21.36909903, 15.94525539, 44.47788549, 22.61681574, 22.43633195,\n", + " 45.60459558, 11.3723819 , 43.95697464, 21.45683121, 31.96111678]), skewness=array([ 0.72422813, 0.15478847, 0.08079632, 0.77378562, -0.43566756,\n", + " 0.14527352, 0.68830417, -0.83076553, -0.78401701, 0.83411633]), kurtosis=array([-0.69234515, -0.97070849, -1.58293152, -0.66766531, -0.98177623,\n", + " -0.97641568, -0.42009753, -0.73900141, -0.6229205 , -0.73421884]))" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from scipy import stats\n", + "stats.describe(X)\n", + "#finding out the amount of samples" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Automatically created module for IPython interactive environment\n", + "For n_clusters = 2 The average silhouette_score is : 0.49884221944224205\n", + "For n_clusters = 3 The average silhouette_score is : 0.5820529527515115\n", + "For n_clusters = 4 The average silhouette_score is : 0.6808147330751131\n", + "For n_clusters = 5 The average silhouette_score is : 0.5259576601736291\n" + ] + } + ], + "source": [ + "#https://scikit-learn.org/stable/auto_examples/cluster/plot_kmeans_silhouette_analysis.html\n", + "from __future__ import print_function\n", + "\n", + "from sklearn.datasets import make_blobs\n", + "from sklearn.cluster import KMeans\n", + "from sklearn.metrics import silhouette_samples, silhouette_score\n", + "\n", + "import matplotlib.pyplot as plt\n", + "import matplotlib.cm as cm\n", + "import numpy as np\n", + "\n", + "print(__doc__)\n", + "\n", + "\n", + "range_n_clusters = [2, 3, 4, 5]\n", + "\n", + "for n_clusters in range_n_clusters:\n", + " # Create a subplot with 1 row and 2 columns\n", + " \n", + " #TÄSTÄ ALKAA ITSE ASIA::::\n", + " # Initialize the clusterer with n_clusters value and a random generator\n", + " # seed of 10 for reproducibility.\n", + " clusterer = KMeans(n_clusters=n_clusters, random_state=10)\n", + " cluster_labels = clusterer.fit_predict(X)\n", + "\n", + " # The silhouette_score gives the average value for all the samples.\n", + " # This gives a perspective into the density and separation of the formed\n", + " # clusters\n", + " silhouette_avg = silhouette_score(X, cluster_labels)\n", + " print(\"For n_clusters =\", n_clusters,\n", + " \"The average silhouette_score is :\", silhouette_avg)\n", + "\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([3, 2, 0, 2, 1, 0, 2, 0, 0, 0, 2, 2, 3, 3, 0, 2, 0, 1, 2, 3, 0, 3,\n", + " 1, 3, 1, 3, 3, 2, 3, 3, 0, 2, 0, 2, 2, 2, 0, 0, 0, 3, 0, 0, 3, 1,\n", + " 3, 1, 3, 2, 1, 2, 2, 0, 2, 2, 2, 2, 0, 0, 1, 3, 0, 3, 3, 3, 2, 1,\n", + " 2, 3, 3, 0, 1, 3, 3, 0, 0, 0, 2, 1, 0, 2, 0, 1, 3, 3, 1, 2, 0, 2,\n", + " 2, 1, 1, 0, 1, 2, 1, 1, 0, 3, 2, 1, 0, 0, 3, 3, 3, 3, 3, 0, 3, 1,\n", + " 3, 1, 1, 2, 0, 1, 1, 3, 2, 2, 2, 1, 2, 1, 3, 1, 0, 3, 1, 2, 3, 3,\n", + " 0, 2, 3, 0, 0, 1, 2, 2, 3, 0, 3, 1, 0, 2, 2, 3, 2, 3, 1, 1, 2, 3,\n", + " 1, 2, 0, 2, 1, 0, 0, 0, 1, 1, 1, 3, 3, 2, 0, 3, 0, 1, 0, 2, 0, 3,\n", + " 0, 3, 0, 1, 1, 0, 3, 1, 0, 2, 1, 3, 2, 2, 0, 3, 2, 2, 0, 1, 1, 0,\n", + " 3, 3, 1, 2, 2, 3, 1, 1, 1, 1, 2, 3, 2, 1, 2, 2, 0, 2, 1, 0, 2, 3,\n", + " 1, 0, 1, 1, 2, 0, 2, 2, 3, 0, 1, 1, 3, 0, 2, 0, 3, 1, 0, 2, 1, 2,\n", + " 3, 0, 1, 2, 3, 1, 2, 1, 2, 1, 2, 3, 1, 0, 0, 2, 2, 3, 0, 3, 2, 1,\n", + " 0, 0, 1, 3, 2, 0, 2, 1, 3, 3, 0, 1, 0, 2, 0, 3, 2, 1, 2, 3, 0, 3,\n", + " 3, 0, 2, 1, 3, 2, 0, 2, 3, 1, 0, 2, 2, 3, 1, 3, 0, 2, 1, 1, 3, 1,\n", + " 2, 2, 2, 2, 0, 2, 3, 2, 3, 2, 1, 3, 3, 2, 1, 1, 0, 1, 1, 1, 1, 0,\n", + " 2, 3, 3, 0, 1, 3, 0, 1, 2, 1, 3, 1, 0, 2, 0, 3, 3, 3, 2, 1, 3, 3,\n", + " 3, 1, 3, 3, 2, 1, 1, 2, 3, 0, 2, 2, 1, 1, 0, 1, 1, 1, 3, 2, 0, 0,\n", + " 0, 1, 1, 1, 1, 0, 1, 3, 2, 2, 0, 3, 2, 0, 0, 1, 0, 0, 0, 2, 2, 3,\n", + " 3, 1, 3, 3, 0, 2, 2, 3, 0, 2, 0, 1, 2, 0, 1, 2, 1, 1, 3, 0, 2, 0,\n", + " 0, 1, 0, 3, 2, 0, 1, 1, 2, 0, 2, 1, 1, 3, 3, 0, 3, 0, 2, 0, 1, 3,\n", + " 0, 1, 2, 3, 3, 3, 2, 0, 1, 3, 0, 2, 1, 0, 0, 0, 2, 3, 0, 3, 0, 0,\n", + " 3, 2, 1, 3, 0, 0, 1, 1, 0, 0, 0, 3, 0, 3, 1, 3, 2, 1, 3, 2, 2, 3,\n", + " 2, 1, 1, 0, 1, 0, 3, 2, 1, 3, 2, 1, 1, 3, 3, 3])" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "clusterer = KMeans(n_clusters=4, random_state=10)\n", + "cluster_labels = clusterer.fit_predict(X)\n", + "cluster_labels" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0.5,1,'2 Component PCA')" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + }, + { + "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": [ + "color_dict = {0:\"r\", 1:\"g\", 2:\"b\", 3:\"y\"}\n", + "colors = [color_dict[x] for x in cluster_labels]\n", + "ax11 = principalDf.plot.scatter (x='principal component 1', y='principal component 2', color = colors)\n", + "\n", + "#ax11 = principalDf.plot.scatter (x='principal component 1', y='principal component 2', color = ['r', 'g', 'b', 'y'])\n", + "ax11.set_title('2 Component PCA', fontsize = 14)\n", + "#Visualize the entire data set according to 2 principal components" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The second part of Exercise 2: \"Did you end up with the same clustering of the data as you did based on visual inspection of the PCA plot? If no, do you known which clustering captures the true structure of the data better?\"\n", + "Answer: No I didn't. PCA visualized 3 clusters, but K-Means 4 clusters. I think that in this case these methods will measure different features with different weights. PCA shows that there are 3 different species (iris) and K-means show the main features (petal length and -width, sepal length and -width). " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Part 3.\n", + "Load the Iris data set used in Exercise 2. Visualize the data with scatter plot of 2-dimensional PCA\n", + "projection, color each species separately (same picture as in Exercise 2). Remove the true species\n", + "column, and pretend from now on that you do not know it.\n", + "\n", + "Part 1: Assume that you are told in advance, that there are three different species you should try to find\n", + "from the data. Cluster the original 4-dimensional Iris data into 3 clusters with K-means method. Create\n", + "another PCA scatter plot, where you visualize these three clusters. How well does the clustering found\n", + "by K-means agree with the true class labels?\n", + "\n", + "\"Tarkoitus olisi luoda PCA:n pohjalta\n", + "2-ulotteinen scatter plot visualisointia varten datasta, siis tismalleen sama\n", + "kuvaaja kuin kurssilla aiemmin tehdyn harjoituksen 2 lopussa (ks. esim.\n", + "tehtävän 2 malliratkaisu Moodlessa). Tähän kuvaan on sitten tarkoitus\n", + "kuvata nuo klusteroinnin tulokset.\"\n", + "\n", + "Answer: K-means did make the line which shows different species based on differend colors, but all the clusters are not separated.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "#https://towardsdatascience.com/PCA using Python (scikit-learn)/Michael Galarnyk \n", + "#is main source to this part of task 6.\n", + "import pandas as pd\n", + "url=\"https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data\"\n", + "#load dataset into Pandas DataFrame. Data is clean, because there is not my own check digits.\n", + "df = pd.read_csv(url, names=['sepal length','sepal width','petal length','petal width','target'])\n", + "#shows the values of original irisdata " + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.preprocessing import StandardScaler\n", + "features = ['sepal length','sepal width','petal length','petal width']\n", + "#Separating out the features\n", + "x = df.loc[:,features].values\n", + "#Separating out the target\n", + "y = df.loc[:,['target']].values\n", + "#Standardizing the features\n", + "x = StandardScaler().fit_transform(x)\n", + "standardDf = pd.DataFrame(data = x, columns = ['SL', 'SW','PL','PW'])\n", + "#Presents irisdata-values after standardizing. Data is centered and for that data has done matrix M. This matrix\n", + "#will be then multiple its own transpose. " + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.decomposition import PCA\n", + "pca = PCA(n_components=2)\n", + "principalComponents = pca.fit_transform(x)\n", + "principalDf = pd.DataFrame(data = principalComponents, columns = ['Principal 1', 'Principal 2'])\n", + "#Creates Principal component analysis for two principal." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "finalprincipalDf = pd.concat([principalDf,df[['target']]],axis = 1)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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MRKh+rDDEI9V2bS6mob33ku7SHP//ffnk08+4bXXXmPSpEm8/vrrDBgwoN2++++/n+bmZq6//npaWlpoamrqkJm+7rrrGD16NLW1tezYsYOWlhbWr1/PrbfeysyZMyktLeXqq69m9OjRnH322W3XBnjzzTf5j//4D/70pz+hqhx33HE88sgjfPDBByxYsID7778fgC1btrDXXnuxefNmevToAcCFF17ImWeeySmnnJLW/9+PdevWsWXLlnbbxo0bt1RVRyU7N2tTchFZAPTx2HWLqj4bPeYWYBcwM9F1VPVh4GGAUaNG6dixY9v2LVq0iNjP+Uh3tvHGl25k6pqpCfdP+eaUwEvSFsLPERw7KyoqgpXE1NVBggGLqFIzf36nJIxqamqorKzkyCOPbBtdxu4bM2YM3//+9ykqKuI73/kOw4YN63CNY489lrvuuov6+nrOOOMMBg4cyOzZs1mxYgXHHXccANu2baNfv35t/2f3/c033+TMM8+kTx/HDUycOJFly5Zx8sknc+utt3LnnXdy6qmncvTRRwPw4osvMnXqVJqamqivr2f48OFZKX+qqKhg+PDhaZ2bNYepqr6RZRE5DzgVGK9hD3ONrFCIpUY5ZW1uVmurSqD6ccwxx/Dqq68yb948zjnnHK6//npqamq44447AJgxYwZnn302X/va15g3bx4nnXQSM2bMQFU577zzuPtu/y+7RH/Whx56KEuXLmX+/PncdNNNnHjiidxwww1ccsklLFmyhP79+3PTTTclLPwPk7Cy5CfjJHlOU9WO/WlGl8BKjZIQsoTRhx9+yH777cdFF13EBRdcwLJlyzj99NNZvnw5y5cvZ9SoUfzjH//g4IMP5oorruC0007jrbfeYvz48cyZM4fPPvsMgM2bN/Phhx8CUFpays6dOwHHIT/zzDM0NTXR2NjI3LlzOfroo9m4cSOVlZX8+7//O9dddx3Lli1rc469evWioaGBZ599Nqv/93QJK0v+AFAOvBSti3pdVX8Yki1GlkjUy52pFsSCp7YWrrnGe18OJIwWLVrEL37xC0pLS6murubxxx/vcExdXR1PPPEEpaWl9OnThx//+Mf06NGDO++8kxNPPJHW1lZKS0t58MEH+dKXvsTFF1/MkCFDGDFiBDNnzuT888/nyCOPBJy45PDhw3nhhRe4/vrrKSoqorS0lIceeoi9996biy66iCOOOIIBAwYwYsSIrP7f00ZVC+Y1cuRIjWXhwoWa75iNqpHtEZ2xdIZOeWmKzlg6QyPbIylfoxB+jqqOnatXrw5+wmuvqdbUqFZVqYLzXlPjbM8SW7duzdq1M0U2bfT6/QBLNIAPstZII+tkqwWxS2ASRgWFOUzDCJvqalvQp0CwXnLDMIyAmMM0DMMIiDlMwzCMgFgMM5fkSGTBMIzsYCPMXJFlkQXDiCUsebegTJgwgS+++CLl826//XbuvffeLFgUDBth5oJIBCZMcN5d3Ja4CROcshIrI+m2RLZHqFtVx9r6tQzsOZDaQbXUlBemvFssu3btoqTE28XMnz8/dBvSwUaYuaCuDlq9FwijtdXZb3RLsr00cWfl3b72ta+xatWqts9jx45l6dKlNDY28v3vf5/Ro0czfPjwtlbGRx99lEmTJvHtb3+bE088MeE9BgwYwKZNmwB4/PHHGTJkCEOHDuWcc84BYP369YwfP54hQ4Ywfvx41q9f38G25cuX8/Wvf50hQ4Zw+umn869//avNxptvvpljjz2W6dOnZ+Tn6GIOMxfkSGTBKCxilybOpl7oG2+8wV133cXq1avbbX/yySc56aSTWL58OStWrPBUK/rud7/L7NmzAcfBbty4kZEjR3LXXXdx3HHH8be//Y2FCxdy/fXX0xh9xv/3f/+Xxx57jJdffjnpPVatWsVdd93Fyy+/zIoVK9oc3HXXXce5557LW2+9xeTJk7niiis62Hbuuefy85//nLfeeosjjjiiTTQE4IsvvuCVV17h2muv7dwPLw5zmLkgZJEFIz8JsjRxJjjyyCM9V0kcPXo0v/3tb7n99tt5++23PaXUzjrrLH7/+98DMHv2bCZNmgQ4Umz33HMPw4YNY+zYsTQ3N7eNAk844YQ2Xctk93j55ZeZOHEivXo5uqjueW+88QZnn302AOeccw6L42L9W7Zs4YsvvuDYY48F4LzzzuPVV19t21+bpT58c5i5oLbWEVPwIgciC0Z+kquliZPJu/Xt25dzzjmHxx9/nLlz5zJs2DCGDRvGkiVL6Nu3Lz179uStt96irq6O7373u4CjQfHUU0+1KRutX7+er371qx3u53WPWFQ10MJkqS5eluj/3FnMYeaCmhqYP995d3+RVVW7t1vCp1vi6oV6kQu90CDybuBMy6dOncqWLVva4qAnnXQS999/f5vm5Ztvvhn4HrGMHz+e2bNnU19fDzhSceDETt3VFWbOnMmYMe3Xf9prr73YZ5992mKiv/vd79pGm9nEsuS5wkQWjDhqB9VyzQve8m650AsNIu8GjlL6lVdeya233tq27dZbb+Wqq65iyJAhqCoDBgzgD3/4Q8r3GDRoELfccgvHHnssxcXFDB8+nEcffZSpU6dyxRVX8Itf/IJ9992X3/72tx2u/dhjj/HDH/6QpqYmDj74YM9jMk3oa/qkwqhRo3TJkiVtnwth2QKzMTMUgo3g2Nm7d++26WkyFq9fnFAvNFurakYikaws/ZBJsmnjO++80+H3IyLhruljGEZyvJYmrh1ca+LKeYo5TMMIGdMLLRws6WMYhhEQc5iGYRgBMYdpGIYREIthGnlDrkQoDCNdbIRp5AXZFqHobmRb3u25557jnnvuSfm8o446KukxF154Ie+++246ZmUdG2EaoRMrQuHitgxOmDmBjdduDMu0nJArXelMyruddtppnHbaaR22J5NT+8tf/pL02jNmzCASK4WYR9gI0widXIlQ5CPZ1pXOlrzbo48+ymWXXQbA+eefzzXXXMO4ceO48cYb+fzzzznhhBMYMWIEP/jBD/jSl77UJuXmjnzdRoSJEyfyla98hcmTJ7e1WY4dO7athfL5559nxIgRDB06lPHjxwOOMMdRRx3F8OHDOeqoo1izZk1mflgBsBGmETpBRCi+XPLlHFuVfXKlK/3GG2+wcuXKDopFrvTaLbfcQktLC01NTR3OdeXd7rjjjnbybm+//Xa749577z0WLFhAcXExl112Gccddxw33XQTzz//PA8//LCnXW+++SarVq3igAMO4Jvf/CZ//vOf2/WMf/7551x00UW8+uqrHHTQQW195l/5yld49dVXKSkpYcGCBdx888089dRTnf0xBcJGmEbohC1CERa50pXOhrxbPJMmTaK4uBiAxYsXt6kanXzyyeyzzz4J7erXrx9FRUUMGzaMDz74oN3+119/nWOOOabNdlf6bcuWLUyaNInBgwdz9dVXtxsBZxtzmEbo1A6qpUi8H8VciFCERa50pbMh7+Z3j6D6FOXl5W3/Li4uZteuXe32J5J+u/XWWxk3bhwrV67kf/7nf2hubg50v0xgDtMInZryGuZPnk9NWU3bSLOqtIqaMmd7V+2rDltXujPybn6M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\n", + "text/plain": [ + "<Figure size 360x360 with 1 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig = plt.figure(figsize = (5,5))\n", + "ax = fig.add_subplot(1,1,1) \n", + "ax.set_xlabel('Principal 1 ', fontsize = 10)\n", + "ax.set_ylabel('Principal 2', fontsize = 10)\n", + "ax.set_title('2 component PCA', fontsize = 15)\n", + "\n", + "targets = ['Iris-setosa', 'Iris-versicolor', 'Iris-virginica']\n", + "colors = ['r', 'g', 'b']\n", + "for target, color in zip(targets,colors):\n", + " indicesToKeep = finalprincipalDf['target'] == target\n", + " ax.scatter(finalprincipalDf.loc[indicesToKeep, 'Principal 1']\n", + " , finalprincipalDf.loc[indicesToKeep, 'Principal 2']\n", + " , c = color\n", + " , s = 50)\n", + "ax.legend(targets)\n", + "ax.grid()" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "#irisdata2 = np.loadtxt((\"tokairis_data.txt\"), dtype = np.float)\n", + "# tämä tuo datan, jos ei voikaan tehdä pandasilla, niin numpy muodossa\n", + "irisdata = df" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<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>sepal length</th>\n", + " <th>sepal width</th>\n", + " <th>petal length</th>\n", + " <th>petal width</th>\n", + " <th>target</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>5.1</td>\n", + " <td>3.5</td>\n", + " <td>1.4</td>\n", + " <td>0.2</td>\n", + " <td>Iris-setosa</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>4.9</td>\n", + " <td>3.0</td>\n", + " <td>1.4</td>\n", + " <td>0.2</td>\n", + " <td>Iris-setosa</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>4.7</td>\n", + " <td>3.2</td>\n", + " <td>1.3</td>\n", + " <td>0.2</td>\n", + " <td>Iris-setosa</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3</th>\n", + " <td>4.6</td>\n", + " <td>3.1</td>\n", + " <td>1.5</td>\n", + " <td>0.2</td>\n", + " <td>Iris-setosa</td>\n", + " </tr>\n", + " <tr>\n", + " <th>4</th>\n", + " <td>5.0</td>\n", + " <td>3.6</td>\n", + " <td>1.4</td>\n", + " <td>0.2</td>\n", + " <td>Iris-setosa</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " sepal length sepal width petal length petal width target\n", + "0 5.1 3.5 1.4 0.2 Iris-setosa\n", + "1 4.9 3.0 1.4 0.2 Iris-setosa\n", + "2 4.7 3.2 1.3 0.2 Iris-setosa\n", + "3 4.6 3.1 1.5 0.2 Iris-setosa\n", + "4 5.0 3.6 1.4 0.2 Iris-setosa" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "irisdata.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "del irisdata['target']\n", + "#removing target column" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<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>sepal length</th>\n", + " <th>sepal width</th>\n", + " <th>petal length</th>\n", + " <th>petal width</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>5.1</td>\n", + " <td>3.5</td>\n", + " <td>1.4</td>\n", + " <td>0.2</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>4.9</td>\n", + " <td>3.0</td>\n", + " <td>1.4</td>\n", + " <td>0.2</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>4.7</td>\n", + " <td>3.2</td>\n", + " <td>1.3</td>\n", + " <td>0.2</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3</th>\n", + " <td>4.6</td>\n", + " <td>3.1</td>\n", + " <td>1.5</td>\n", + " <td>0.2</td>\n", + " </tr>\n", + " <tr>\n", + " <th>4</th>\n", + " <td>5.0</td>\n", + " <td>3.6</td>\n", + " <td>1.4</td>\n", + " <td>0.2</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " sepal length sepal width petal length petal width\n", + "0 5.1 3.5 1.4 0.2\n", + "1 4.9 3.0 1.4 0.2\n", + "2 4.7 3.2 1.3 0.2\n", + "3 4.6 3.1 1.5 0.2\n", + "4 5.0 3.6 1.4 0.2" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "irisdata.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "KMeans(algorithm='auto', copy_x=True, init='k-means++', max_iter=300,\n", + " n_clusters=3, n_init=10, n_jobs=1, precompute_distances='auto',\n", + " random_state=None, tol=0.0001, verbose=0)" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "P = np.array(irisdata).astype(float)\n", + "clf = KMeans(n_clusters=3, init='k-means++')\n", + "clf.fit(P)\n", + "#sets the irisdata to 3 clusters" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "<matplotlib.collections.PathCollection at 0x123457786d8>" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + }, + { + "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": [ + "from sklearn import preprocessing\n", + "from sklearn.decomposition import PCA\n", + "color_dict = {0:\"r\", 1:\"g\", 2:\"b\", 3:\"y\"}\n", + "colors = [color_dict[x] for x in cluster_labels]\n", + "\n", + "#scaler = preprocessing.StandardScaler().fit(s)\n", + "#s_transformed = scaler.transform(s)\n", + "pcak = PCA(n_components=2).fit(P)\n", + "#pca2 = PCA(n_components=2).fit(s_transformed)\n", + "P_pcak = pcak.transform(P)\n", + "#s_pca2 = pca2.transform(s_transformed)\n", + "#plt.scatter(s_pca2[:,0], s_pca2[:,1], color= ['r'])\n", + "plt.scatter(P_pcak[:,0], P_pcak[:,1], color=colors)\n", + "#punainen väri näyttää PCA:n tulokset ja sininen näyttää K-means klusteroinnin.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Different species will be find well also using clustering method." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "TÄSTÄ ETEENPÄIN ON KOLMOSEN LOPPU!!! JA OK VAIN KUVA PITÄÄ VIELÄ SAADA!!!" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Automatically created module for IPython interactive environment\n", + "For n_clusters = 2 The average silhouette_score is : 0.6808136202936816\n", + "For n_clusters = 3 The average silhouette_score is : 0.5525919445499757\n", + "For n_clusters = 4 The average silhouette_score is : 0.4978256901095472\n", + "For n_clusters = 5 The average silhouette_score is : 0.4885175508886279\n" + ] + } + ], + "source": [ + "#https://scikit-learn.org/stable/auto_examples/cluster/plot_kmeans_silhouette_analysis.html\n", + "from __future__ import print_function\n", + "\n", + "from sklearn.datasets import make_blobs\n", + "from sklearn.cluster import KMeans\n", + "from sklearn.metrics import silhouette_samples, silhouette_score\n", + "\n", + "import matplotlib.pyplot as plt\n", + "import matplotlib.cm as cm\n", + "import numpy as np\n", + "\n", + "print(__doc__)\n", + "\n", + "\n", + "range_n_clusters = [2, 3, 4, 5]\n", + "\n", + "for n_clusters in range_n_clusters:\n", + " # Create a subplot with 1 row and 2 columns\n", + " \n", + " #TÄSTÄ ALKAA ITSE ASIA::::\n", + " # Initialize the clusterer with n_clusters value and a random generator\n", + " # seed of 10 for reproducibility.\n", + " clusterer = KMeans(n_clusters=n_clusters, random_state=10)\n", + " cluster_labels = clusterer.fit_predict(P)\n", + "\n", + " # The silhouette_score gives the average value for all the samples.\n", + " # This gives a perspective into the density and separation of the formed\n", + " # clusters\n", + " silhouette_avg = silhouette_score(P, cluster_labels)\n", + " print(\"For n_clusters =\", n_clusters,\n", + " \"The average silhouette_score is :\", silhouette_avg)\n", + "\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", + " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", + " 1, 1, 1, 1, 1, 1, 2, 2, 2, 4, 2, 2, 2, 4, 2, 4, 4, 2, 4, 2, 4, 2,\n", + " 2, 4, 2, 4, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 4, 4, 4, 2, 4, 2, 2, 2,\n", + " 4, 4, 4, 2, 4, 4, 4, 4, 4, 2, 4, 4, 0, 2, 3, 0, 0, 3, 4, 3, 0, 3,\n", + " 0, 0, 0, 2, 0, 0, 0, 3, 3, 2, 0, 2, 3, 2, 0, 3, 2, 2, 0, 3, 3, 3,\n", + " 0, 2, 2, 3, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 2])" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "clusterer2 = KMeans(n_clusters=2, random_state=10)\n", + "cluster_labels = clusterer.fit_predict(P)\n", + "cluster_labels" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "KMeans(algorithm='auto', copy_x=True, init='k-means++', max_iter=300,\n", + " n_clusters=2, n_init=10, n_jobs=1, precompute_distances='auto',\n", + " random_state=None, tol=0.0001, verbose=0)" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "R = np.array(irisdata).astype(float)\n", + "clf = KMeans(n_clusters=2, init='k-means++')\n", + "clf.fit(R)\n", + "#sets the irisdata to 3 clusters" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "ename": "KeyError", + "evalue": "4", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mKeyError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m<ipython-input-32-fc2640df1f30>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[0msklearn\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdecomposition\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mPCA\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[0mcolor_dict\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m{\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;34m\"r\"\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;34m\"g\"\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m2\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;34m\"b\"\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m3\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;34m\"y\"\u001b[0m\u001b[1;33m}\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 4\u001b[1;33m \u001b[0mcolors\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m[\u001b[0m\u001b[0mcolor_dict\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mx\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mcluster_labels\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 5\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 6\u001b[0m \u001b[1;31m#scaler = preprocessing.StandardScaler().fit(s)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m<ipython-input-32-fc2640df1f30>\u001b[0m in \u001b[0;36m<listcomp>\u001b[1;34m(.0)\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[0msklearn\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdecomposition\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mPCA\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[0mcolor_dict\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m{\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;34m\"r\"\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;34m\"g\"\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m2\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;34m\"b\"\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m3\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;34m\"y\"\u001b[0m\u001b[1;33m}\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 4\u001b[1;33m \u001b[0mcolors\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m[\u001b[0m\u001b[0mcolor_dict\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mx\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mcluster_labels\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 5\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 6\u001b[0m \u001b[1;31m#scaler = preprocessing.StandardScaler().fit(s)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;31mKeyError\u001b[0m: 4" + ] + } + ], + "source": [ + "from sklearn import preprocessing\n", + "from sklearn.decomposition import PCA\n", + "color_dict = {0:\"r\", 1:\"g\", 2:\"b\", 3:\"y\"}\n", + "colors = [color_dict[x] for x in cluster_labels]\n", + "\n", + "#scaler = preprocessing.StandardScaler().fit(s)\n", + "#s_transformed = scaler.transform(s)\n", + "pcak = PCA(n_components=2).fit(R)\n", + "#pca2 = PCA(n_components=2).fit(s_transformed)\n", + "R_pcak = pcak.transform(R)\n", + "#s_pca2 = pca2.transform(s_transformed)\n", + "#plt.scatter(s_pca2[:,0], s_pca2[:,1], color= ['r'])\n", + "plt.scatter(R_pcak[:,0], R_pcak[:,1], color=colors)\n", + "#punainen väri näyttää PCA:n tulokset ja sininen näyttää K-means klusteroinnin." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "How well does the clustering found\n", + "by K-means agree with the true class labels?\n", + "\n", + "Blue color represent K-means values and red represent PCA values. They have same shape, but clustering shows clusters more compact." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Part 2: Assume that you have no prior information about the number of clusters in the data. Select the\n", + "number K for which the clustering of Iris has the maximal Silhouette Score. Visualize the K-means\n", + "clustering for this value of K. How well does the clustering found by K-means agree with the true class\n", + "labels?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Answer: On my mind K-means find according to visualization rather 4 than 3 (true class labels) clusters in this case." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#https://scikit-learn.org/stable/auto_examples/cluster/plot_kmeans_silhouette_analysis.html\n", + "from __future__ import print_function\n", + "\n", + "from sklearn.datasets import make_blobs\n", + "from sklearn.cluster import KMeans\n", + "from sklearn.metrics import silhouette_samples, silhouette_score\n", + "\n", + "import matplotlib.pyplot as plt\n", + "import matplotlib.cm as cm\n", + "import numpy as np\n", + "\n", + "print(__doc__)\n", + "\n", + "# Generating the sample data from make_blobs\n", + "# This particular setting has one distinct cluster and 3 clusters placed close\n", + "# together.\n", + "X, y = make_blobs(n_samples=150,\n", + " n_features=4,\n", + " centers=4,\n", + " cluster_std=1,\n", + " center_box=(-10.0, 10.0),\n", + " shuffle=True,\n", + " random_state=1) # For reproducibility\n", + "\n", + "range_n_clusters = [2, 3, 4, 5, 6, 7, 8, 9, 10]\n", + "\n", + "for n_clusters in range_n_clusters:\n", + " # Create a subplot with 1 row and 2 columns\n", + " fig, (ax1, ax2) = plt.subplots(1, 2)\n", + " fig.set_size_inches(18, 7)\n", + "\n", + " # The 1st subplot is the silhouette plot\n", + " # The silhouette coefficient can range from -1, 1 but in this example all\n", + " # lie within [-0.1, 1]\n", + " ax1.set_xlim([-0.1, 1])\n", + " # The (n_clusters+1)*10 is for inserting blank space between silhouette\n", + " # plots of individual clusters, to demarcate them clearly.\n", + " ax1.set_ylim([0, len(X) + (n_clusters + 1) * 10])\n", + "\n", + " # Initialize the clusterer with n_clusters value and a random generator\n", + " # seed of 10 for reproducibility.\n", + " clusterer = KMeans(n_clusters=n_clusters, random_state=10)\n", + " cluster_labels = clusterer.fit_predict(X)\n", + "\n", + " # The silhouette_score gives the average value for all the samples.\n", + " # This gives a perspective into the density and separation of the formed\n", + " # clusters\n", + " silhouette_avg = silhouette_score(X, cluster_labels)\n", + " print(\"For n_clusters =\", n_clusters,\n", + " \"The average silhouette_score is :\", silhouette_avg)\n", + "\n", + " # Compute the silhouette scores for each sample\n", + " sample_silhouette_values = silhouette_samples(X, cluster_labels)\n", + "\n", + " y_lower = 10\n", + " for i in range(n_clusters):\n", + " # Aggregate the silhouette scores for samples belonging to\n", + " # cluster i, and sort them\n", + " ith_cluster_silhouette_values = \\\n", + " sample_silhouette_values[cluster_labels == i]\n", + "\n", + " ith_cluster_silhouette_values.sort()\n", + "\n", + " size_cluster_i = ith_cluster_silhouette_values.shape[0]\n", + " y_upper = y_lower + size_cluster_i\n", + "\n", + " color = cm.nipy_spectral(float(i) / n_clusters)\n", + " ax1.fill_betweenx(np.arange(y_lower, y_upper),\n", + " 0, ith_cluster_silhouette_values,\n", + " facecolor=color, edgecolor=color, alpha=0.7)\n", + "\n", + " # Label the silhouette plots with their cluster numbers at the middle\n", + " ax1.text(-0.05, y_lower + 0.5 * size_cluster_i, str(i))\n", + "\n", + " # Compute the new y_lower for next plot\n", + " y_lower = y_upper + 10 # 10 for the 0 samples\n", + "\n", + " ax1.set_title(\"The silhouette plot for the various clusters.\")\n", + " ax1.set_xlabel(\"The silhouette coefficient values\")\n", + " ax1.set_ylabel(\"Cluster label\")\n", + "\n", + " # The vertical line for average silhouette score of all the values\n", + " ax1.axvline(x=silhouette_avg, color=\"red\", linestyle=\"--\")\n", + "\n", + " ax1.set_yticks([]) # Clear the yaxis labels / ticks\n", + " ax1.set_xticks([-0.1, 0, 0.2, 0.4, 0.6, 0.8, 1])\n", + "\n", + " # 2nd Plot showing the actual clusters formed\n", + " colors = cm.nipy_spectral(cluster_labels.astype(float) / n_clusters)\n", + " ax2.scatter(X[:, 0], X[:, 1], marker='.', s=30, lw=0, alpha=0.7,\n", + " c=colors, edgecolor='k')\n", + "\n", + " # Labeling the clusters\n", + " centers = clusterer.cluster_centers_\n", + " # Draw white circles at cluster centers\n", + " ax2.scatter(centers[:, 0], centers[:, 1], marker='o',\n", + " c=\"white\", alpha=1, s=200, edgecolor='k')\n", + "\n", + " for i, c in enumerate(centers):\n", + " ax2.scatter(c[0], c[1], marker='$%d$' % i, alpha=1,\n", + " s=50, edgecolor='k')\n", + "\n", + " ax2.set_title(\"The visualization of the clustered data.\")\n", + " ax2.set_xlabel(\"Feature space for the 1st feature\")\n", + " ax2.set_ylabel(\"Feature space for the 2nd feature\")\n", + "\n", + " plt.suptitle((\"Silhouette analysis for KMeans clustering on sample data \"\n", + " \"with n_clusters = %d\" % n_clusters),\n", + " fontsize=14, fontweight='bold')\n", + "\n", + "plt.show()" + ] + }, + { + "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.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} -- GitLab