Commit 0f259f0c authored by Steve Tjoa's avatar Steve Tjoa

done with kmeans notebook

parent e73376c7
{
"metadata": {
"name": "",
"signature": "sha256:783e03c8dccbe88c733ae4e2e9f5599a0fc64088161f4e1749f2001da438a6ad"
"signature": "sha256:3a9c5c69ab347d4cd1921c96b83afd9e14e05093da21ee1ce00532f92c990b15"
},
"nbformat": 3,
"nbformat_minor": 0,
......@@ -58,13 +58,13 @@
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 2,
"prompt_number": 1,
"text": [
"<IPython.lib.display.Audio at 0x3ebd310>"
"<IPython.lib.display.Audio at 0x4176910>"
]
}
],
"prompt_number": 2
"prompt_number": 1
},
{
"cell_type": "markdown",
......@@ -83,24 +83,40 @@
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 3
"prompt_number": 2
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"Feature Extraction"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Scale the features (using the scale function) from -1 to 1. (See Lab 2 if you need a reminder.)"
"Let's compute the zero crossing rate and spectral centroid for each frame in the audio signal."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from sklearn import preprocessing\n",
"min_max_scaler = preprocessing.MinMaxScaler(feature_range=(-1, 1))\n",
"mfccs_scaled = min_max_scaler.fit_transform(mfccs)\n",
"print mfccs.shape\n",
"print mfccs_scaled.shape"
"from essentia.standard import ZeroCrossingRate, Centroid, Spectrum, Windowing, FrameGenerator, Energy\n",
"hamming_window = Windowing(type='hamming')\n",
"zcr = ZeroCrossingRate()\n",
"centroid = Centroid()\n",
"spectrum = Spectrum()\n",
"energy = Energy()\n",
"\n",
"def compute_features(frame):\n",
" #return array( [zcr(frame), centroid(spectrum(hamming_window(frame)))] ) # Try this too!\n",
" return array( [zcr(frame), energy(frame)] )\n",
"\n",
"features = array([compute_features(frame) for frame in FrameGenerator(simple_loop, frameSize=1024, hopSize=500)])\n",
"print features.shape"
],
"language": "python",
"metadata": {},
......@@ -109,95 +125,37 @@
"output_type": "stream",
"stream": "stdout",
"text": [
"(260, 13)\n",
"(260, 13)\n"
"(266, 2)\n"
]
}
],
"prompt_number": 7
"prompt_number": 13
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"Feature Scaling"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"It's cluster time! We're using NETLAB's implementation of the kmeans algorithm. \n",
"\n",
"Use the kmeans algorithm to create clusters of your feature. kMeans will output 2 things of interest to you: \n",
"(1) The center-points of clusters. You can use the coordinates of the center of the cluster to measure the distance of any point from the center. This not only provides you with a distance metric of how \"good\" a point fits into a given cluster, but this allows you to sort by the points which are closest to the center of a given frame! Quite useful. \n",
"\n",
"(2) Each point will be assigned a label, or cluster #. You can then use this label to produce a transcription, do creative stuff, or further train another downstream classifier.\n",
"\n",
"Attention:\n",
"There are 2 functions called kmeans - one from the CATBox and another from Netlab. You should be using the one from Netlab. Verify that you are by typing which kmeans in your command line to verify...\n",
"\n",
"Here's the help function for kmeans: \n",
"\n",
"> help kmeans\n",
"\n",
" KMEANS\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Trains a k means cluster model.\n",
"\n",
"\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Description\n",
"\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CENTRES = KMEANS(CENTRES, DATA, OPTIONS) uses the batch K-means\n",
"\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0algorithm to set the centres of a cluster model. The matrix DATA\n",
"\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0represents the data which is being clustered, with each row\n",
"\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0corresponding to a vector. The sum of squares error function is used.\n",
"\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0The point at which a local minimum is achieved is returned as\n",
"\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0CENTRES. The error value at that point is returned in OPTIONS(8).\n",
"\n",
"\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0[CENTRES, OPTIONS, POST, ERRLOG] = KMEANS(CENTRES, DATA, OPTIONS)\n",
"\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0also returns the cluster number (in a one-of-N encoding) for each\n",
"\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0data point in POST and a log of the error values after each cycle in\n",
"\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0ERRLOG. The optional parameters have the following\n",
"\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0interpretations.\n",
"\n",
"\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0OPTIONS(1) is set to 1 to display error values; also logs error\n",
"\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0values in the return argument ERRLOG. If OPTIONS(1) is set to 0, then\n",
"\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0only warning messages are displayed. If OPTIONS(1) is -1, then\n",
"\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0nothing is displayed.\n",
"\n",
"\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0OPTIONS(2) is a measure of the absolute precision required for the\n",
"\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0value of CENTRES at the solution. If the absolute difference between\n",
"\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0the values of CENTRES between two successive steps is less than\n",
"\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0OPTIONS(2), then this condition is satisfied.\n",
"\n",
"\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0OPTIONS(3) is a measure of the precision required of the error\n",
"\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0function at the solution. If the absolute difference between the\n",
"\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0error functions between two successive steps is less than OPTIONS(3),\n",
"\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0then this condition is satisfied. Both this and the previous\n",
"\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0condition must be satisfied for termination.\n",
"\n",
"\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0OPTIONS(14) is the maximum number of iterations; default 100.\n",
"\n",
" Now, simply put, here are some examples of how you use it: \n",
"\n",
" % Initialize # of clusters that you want to find and their initial conditions.\n",
" numCenters = 2; % the size of the initial centers; this is passed to k-means to determine the value of k.\n",
" numFeatures = 2; % replace the \"2\" with however many features you have extracted\n",
" centers = zeros(numCenters , numFeatures ); % inits center points to 0\n",
" \u00a0\n",
" % setup vector of options for kmeans trainer\n",
" options(1) = 1; \n",
" options(5) = 1;\n",
" options(14) = 50; % num of steps to wait for convergence\n",
" \u00a0\n",
" % train centers from data\n",
" [centers,options,post] = kmeans(centers , your_feature_data_matrix , options);\n",
" \u00a0\n",
" %Output: \n",
" % Centers contains the center coordinates of the clusters - we can use this to calculate the distance for each point \n",
" in the distance to the cluster center.\n",
" % Post contains the assigned cluster number for each point in your feature matrix. (from 1 to k) "
"Scale the features (using the scale function) from -1 to 1."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from sklearn.cluster import KMeans\n",
"kmeans = KMeans(n_clusters=2)\n",
"labels = kmeans.fit_predict(mfccs_scaled)\n",
"mfccs.shape\n",
"print labels"
"from sklearn import preprocessing\n",
"min_max_scaler = preprocessing.MinMaxScaler(feature_range=(-1, 1))\n",
"features_scaled = min_max_scaler.fit_transform(features)\n",
"print features_scaled.shape\n",
"print features_scaled.min(axis=0)\n",
"print features_scaled.max(axis=0)"
],
"language": "python",
"metadata": {},
......@@ -206,67 +164,134 @@
"output_type": "stream",
"stream": "stdout",
"text": [
"[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n",
" 0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n",
" 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0\n",
" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n",
" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n",
" 0]\n"
"(266, 2)\n",
"[-1. -1.]\n",
"[ 1. 1.]\n"
]
}
],
"prompt_number": 9
"prompt_number": 14
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Write a script to list which audio slices (or audio files) were categorized as Cluster # 1. Do the same or Cluster # 2. Do the clusters make sense? Now, modify the script to play the audio slices that in each cluster - listening to the clusters will help us build intuition of what's in each cluster. \n",
"\n",
"Repeat this clustering (steps 3-7), and listening to the contents of the clusters with CongaGroove-mono.wav. \n",
"\n",
"Repeat this clustering (steps 3-7) using the CongaGroove and 3 clusters. Listen to the results. Try again with 4 clusters. Listen to the results. (etc, etc\u2026)\n",
"\n",
"Once you complete this, try out some of the many, many other audio loops in the audio loops. (Located In audio\\Miscellaneous Loops Samples and SFX)"
"Plot the features."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"scatter(features_scaled[:,0], features_scaled[:,1])\n",
"xlabel('Zero Crossing Rate (scaled)')\n",
"ylabel('Energy (scaled)')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 16,
"text": [
"<matplotlib.text.Text at 0x5b6ac10>"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\nwoS8HajASUMppUpKuUoaxUmThlJK3TydsFAppVSJ06ShlFLKZpo0lFJK2UyThlJKKZtp0lBKKWUz\nTRpKKaVspklDKaWUzTRpKKWUspkmDaWUUjbTpKGUUspmmjSUUkrZTJOGUkopm2nSUEopZTNNGkop\npWymSUMppZTNNGkopZSymSYNpZRSNtOkoZRSymaaNJRSStlMk4ZSSimbadJQSillM00aSimlbKZJ\nQymllM00aSillLKZJg2llFI206ShlFLKZpo0lFJK2UyTRhkXFxdn7xBKTEXuG2j/yruK3r+iskvS\nWLJkCYGBgTg6OrJjx44Cy9WrV4/g4GDCwsIIDw8vxQjLjor8D7ci9w20f+VdRe9fUTnZo9GgoCCW\nL19OdHT0DcsZDAbi4uLw8vIqpciUUkrdiF2SRpMmTWwuKyIlGIlSSqmbYRA77pU7duzIm2++SYsW\nLfJ9v379+nh6euLo6Eh0dDQjR47MU8ZgMJR0mEopVSEVZfdfYkcaUVFRJCYm5ln/6quv0rt3b5vq\n2LhxI7Vq1eLcuXNERUXRpEkTIiIicpXRIxGllCo9JZY01q5de8t11KpVC4AaNWrQr18/tm3blidp\nKKWUKj12v+S2oCOFlJQUrl69CkBycjJr1qwhKCioNENTSin1N3ZJGsuXL8ff358tW7bQs2dPunfv\nDsDp06fp2bMnAImJiURERBAaGkqbNm3o1asXXbt2tUe4Siml/iLlzOLFi6VZs2bi4OAg27dvL7Bc\n3bp1JSgoSEJDQ6V169alGOGtsbV/q1atksaNG0tAQIBMnz69FCO8NRcuXJAuXbpIw4YNJSoqSv78\n8898y5Wn7WfLthg7dqwEBARIcHCw7Nixo5QjvDWF9S82NlY8PDwkNDRUQkNDZcqUKXaIsmiGDRsm\n3t7e0rx58wLLlOdtV1j/irLtyl3S2L9/vxw8eFAiIyNvuFOtV6+eXLhwoRQjKx629C8rK0saNGgg\nx44dk4yMDAkJCZF9+/aVcqRF8/TTT8uMGTNERGT69Ony7LPP5luuvGw/W7bF999/L927dxcRkS1b\ntkibNm3sEWqR2NK/2NhY6d27t50ivDU//fST7Nixo8CdannediKF968o287uYxo3q0mTJjRq1Mim\nslIOr6yypX/btm0jICCAevXq4ezszKBBg/j2229LKcJbExMTw9ChQwEYOnQo33zzTYFly8P2s2Vb\nXN/nNm3acOnSJZKSkuwR7k2z9d9aedhW+YmIiKB69eoFvl+etx0U3j+4+W1X7pKGrQwGA126dKFV\nq1Z8/PHH9g6nWJ06dQp/f3/rsp+fH6dOnbJjRLZLSkrCx8cHAB8fnwL/Bywv28+WbZFfmYSEhFKL\n8VbY0j+DwcCmTZsICQmhR48e7Nu3r7TDLDHledvZoijbzi53hBemtO7xsJdb7V9Zv6GxoP5NmzYt\n17LBYCiwL2V5+13P1m3x919zZX0b/sWWOFu0aEF8fDwmk4lVq1bRt29fDh06VArRlY7yuu1sUZRt\nVyaTRkW/x+NW++fr60t8fLx1OT4+Hj8/v1sNq9jcqH8+Pj4kJiZSs2ZNzpw5g7e3d77lyvL2u54t\n2+LvZRISEvD19S21GG+FLf1zd3e3vu7evTujR4/m4sWLFWLOuPK87WxRlG1Xrk9PFXQurqLc41FQ\n/1q1asXhw4c5fvw4GRkZLFq0iD59+pRydEXTp08f5s2bB8C8efPo27dvnjLlafvZsi369OnD/Pnz\nAdiyZQvVqlWznqIr62zpX1JSkvXf6rZt2xCRCpEwoHxvO1sUadsVdVTeXpYtWyZ+fn7i6uoqPj4+\ncs8994iIyKlTp6RHjx4iInL06FEJCQmRkJAQCQwMlFdffdWeId8UW/onIrJy5Upp1KiRNGjQoFz1\n78KFC9K5c+c8l9yW5+2X37aYPXu2zJ4921rmiSeekAYNGkhwcPANr/oriwrr36xZsyQwMFBCQkKk\nbdu2snnzZnuGe1MGDRoktWrVEmdnZ/Hz85NPPvmkQm27wvpXlG1n1wkLlVJKlS/l+vSUUkqp0qVJ\nQymllM00aSillLKZJg2llFI206Shis3y5csJCwvL9efo6MgPP/xQ7G0lJiYyaNAgAgICaNWqFT17\n9uTw4cPF3g7AyJEj2b9/f7HU5ejoSFhYGMHBwfTv359r167dsPyuXbtYtWrVTbdz9uxZ64zRxeGz\nzz5j7NixN/WZevXqcfHiRdLT02nfvj0Wi6XY4lH2o0lDFZt+/fqxc+dO69/jjz9O+/bt6datm02f\nl+wJNG0q169fPzp16sSRI0f49ddfee211/JMSZKVlVWkfvzdxx9/TNOmTYulLpPJxM6dO9m9ezce\nHh7MmTPnhuV37tzJypUrb7qdWbNm8cgjjxQxyryKchf0X59xcXEhIiLihvOMqfJDk4YqEYcOHWLK\n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\nHDC6AAAAAElFTkSuQmCC\n",
"text": [
"<matplotlib.figure.Figure at 0x565a950>"
]
}
],
"prompt_number": 16
},
{
"cell_type": "heading",
"level": 3,
"level": 2,
"metadata": {},
"source": [
"MFCCs"
"Using K-Means"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's add MFCCs to the mix. Extract the mean of the 12 MFCCs (coefficients 1-12, do not use the \"0th\" coefficient) for each onset using the code that you wrote. Add those to the feature vectors, along with zero crossing and centroid. We should now have 14 features being extracted - this is started to get \"real world\"! With this simple example (and limited collection of audio slices, you probably won't notice a difference - but at least it didn't break, right?) Let's try it with the some other audio to truly appreciate the power of timbral clustering."
"Time to cluster! Let's initialize the algorithm to find three clusters."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from sklearn.cluster import KMeans\n",
"kmeans = KMeans(n_clusters=3)\n",
"labels = kmeans.fit_predict(features_scaled)\n",
"features_scaled.shape\n",
"print labels"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[2 2 2 0 0 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n",
" 0 0 0 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n",
" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 0 0 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2\n",
" 2 2 0 0 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 1 1 1 1 1 1 1 1 1 1 1 1 0\n",
" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n",
" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n",
" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n",
" 0 0 0 0 0 0 0]\n"
]
}
],
"prompt_number": 17
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"BONUS (ONLY IF YOU HAVE EXTRA TIME\u2026)\n",
"Now that we can take ANY LOOP, onset detect, feature extract, and cluster it, let's have some fun. \n",
"Choose any audio file from our collection and use the above techniques break it up into clusters. \n",
"Listen to those clusters.\n",
"\n",
"Some rules of thumb: since you need to pick the number of clusters ahead of time, listen to your audio files first. \n",
"You can break a drum kit or percussion loop into 3 - 6 clusters for it to segment well. More is OK too.\n",
"Musical loops: 3-6 clusters should work nicely. \n",
"Songs - lots of clusters for them to segment well. Try 'em out!\n",
"\n",
"BONUS (ONLY IF YOU REALLY HAVE EXTRA TIME\u2026)\n",
"Review your script that PLAYs all of the audio files that were categorized as Cluster # 1 or Cluster # 2. \n",
"Now, modify your script to play and plot the audio files which are closest to the center of your clusters.\n",
"\n",
"This hopefully provides you with which files are representative of your cluster. "
"Plot the results."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"scatter(features_scaled[labels==1,0], features_scaled[labels==1,1], c='r')\n",
"scatter(features_scaled[labels==2,0], features_scaled[labels==2,1], c='y')\n",
"scatter(features_scaled[labels==0,0], features_scaled[labels==0,1], c='k')\n",
"xlabel('Zero Crossing Rate (scaled)')\n",
"ylabel('Energy (scaled)')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 26,
"text": [
"<matplotlib.text.Text at 0x6bad790>"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\nrkJggg==\n",
"text": [
"<matplotlib.figure.Figure at 0x6bb64d0>"
]
}
],
"prompt_number": 26
}
],
"metadata": {}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment