Commit 8c4ba788 authored by Steve Tjoa's avatar Steve Tjoa

knn

parent 087f19cd
This source diff could not be displayed because it is too large. You can view the blob instead.
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import numpy, scipy, matplotlib.pyplot as plt, sklearn, librosa, urllib, IPython.display, stanford_mir\n",
"plt.rcParams['figure.figsize'] = (14,5)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[← Back to Index](index.html)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# K-Nearest Neighbor"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can appreciate why we need additional intelligence in our systems -- heuristics don't go very far in the world of complex audio signals. We'll be using scikit-learn's implementation of the k-NN algorithm for our work here. It proves be a straightforward and easy-to-use implementation. The steps and skills of working with one classifier will scale nicely to working with other, more complex classifiers."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Training Data"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's begin by loading some training data. We will use the following shortcut:"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"training_features, training_labels, scaler = stanford_mir.get_features(collection=\"drum_samples_train\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Show the training labels. `0` is a kick drum, and `1` is a snare drum."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 1. 1. 1. 1. 1. 1. 1.\n",
" 1. 1.]\n"
]
}
],
"source": [
"print training_labels"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Plot the training data:"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.text.Text at 0x10c5e4950>"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x10c5dc750>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.scatter(training_features[:10,0], training_features[:10,1])\n",
"plt.scatter(training_features[10:,0], training_features[10:,1], color='r')\n",
"plt.xlabel('Zero Crossing Rate')\n",
"plt.ylabel('Spectral Centroid')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Test Data"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Compute features from a test data set of 30 kick drum samples and 30 snare drum samples. We will re-use the `MinMaxScaler` used during training."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Directory drum_samples_test already exists.\n"
]
}
],
"source": [
"test_features, test_labels, _ = stanford_mir.get_features(collection=\"drum_samples_test\", scaler=scaler)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Show the test labels:"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 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. 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.\n",
" 1. 1. 1. 1. 1. 1.]\n"
]
}
],
"source": [
"print test_labels"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Plot the test feature vectors. Note that this uses the same scaling function used during training. Therefore, some test feature vectors may exceed the range [-1, 1]."
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.text.Text at 0x1072c8210>"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nAHWLc4wAAH5lZmbqzTfflMvlqtNDKb/77jslJibqqaeeUt++fSVJL774onbs2KHXX3+9zu5THzp2\n7KhPP/3U97i4uFh33XWXnnzyScXGxlb7c3FxcVqzZo2uv/56I8oEANQQI0YAgEv68MMPtWLFCmVn\nZys8PFwlJSWaO3euPv/8c3k8Hj3wwAMaPHiwNmzYoJycHP3www+Ki4tTamqqpk+frhMnTqhRo0aa\nOHGievfuXem9165dq169evlCkSQ98MADat26tSoqKrR8+XLt3btX3377re655x716NFDs2bNUmFh\noZo2barp06frlltuUW5url5++WWFhIToJz/5iRYvXqy///3veuyxx1RaWqqQkBDNmDFDXbt29QWT\n3bt3609/+pP++c9/6tixY7rttts0e/ZsSdIzzzyjzZs3KyoqStHR0YqLi1NCQsIl/5z+8Y9/qLS0\nVM2bN5ckLVmyRLt27dIPP/ygqKgoLV26VBs2bNDf/vY3Pfjgg3rttdf01VdfKSMjQ263W1FRUXry\nySf1k5/8pG4bCACoEYIRAKBaJ0+e1KRJkzR//ny1bt1akvTCCy+oc+fOevrpp1VcXKyUlBR16dJF\nkvS3v/1Nf/jDHxQSEqIJEyYoJiZGaWlpOnbsmEaMGKGNGzeqZcuWvvf/9NNPK4UiSQoJCdGdd97p\ne1xeXq5NmzZJkhITEzVmzBj1799f+/bt04QJE/TOO+/oueee0+9//3u1aNFCv/3tb/XXv/5V7733\nnm6//Xalp6frz3/+s/bs2aOuXbtKkmw2myRp79692rRpk0JCQjRo0CClpKTo+PHj2rNnjzZt2qRT\np04pISFB/fr1q/LPJz4+XmfOnNHJkyd14403aubMmerSpYuOHj2qI0eOKCsrS5L0xBNPKDc3V6NH\nj5bL5dLKlSvVtGlTzZgxQytXrtS//Mu/6E9/+pNmzpypVatW1UHnAACXi2AEAKiSx+PRpEmT9B//\n8R+VgsEHH3yg06dPa/369ZKk0tJSffHFF7LZbOrUqZNvfc3u3bs1f/58SVLr1q3VtWtX7du3T3Fx\ncb73stls8ng81dZgs9l8YaakpETHjh1T//79JUldu3ZVs2bNdOTIEd1+++1KSUlRv3799Ktf/Uod\nO3bUqVOnNG7cOB08eFB9+/bVyJEjfe97fhb5z372MzVt2tRXY2FhoT744APdeeedatSoka666ir1\n799f1c0637hxo6SzUw3Xr1+vPn36SJLatm2rJ554QllZWTpy5Ij27t2rNm3aVPrZL7/8UseOHdOY\nMWN8z5WUlFT7ZwEAqF/sSgcAqNLSpUtVUVGhSZMmVXre6/Vq8eLF2rhxozZu3OibDidJdru90ut+\nzOPxXBSCOnfurP3791/0ukceeUQnT56UJDVu3Nj3fhe+p9frlcfj0fTp0/X888+refPmevzxx/Xm\nm2+qW7du2rRpk3r37q233367UgA57/x7//j9QkNDVVFRUe3voyppaWlq1aqVFi5cKEnav3+/7r//\nfknSoEGDqgxXHo9HrVu39v05btiwQa+99prfewEA6gfBCABwkZ07d2rdunV69tlnL9phrUePHnrj\njTcknZ06l5CQoG+//faiD/7du3fXunXrJEnHjh3TX/7yF/30pz+t9Jrk5GRt375d27dvl3Q2hCxf\nvlw//PCDWrZsWek9IyMj1bp1a23ZskXS2Wlw33//vW688Ub96le/UlRUlEaPHq27775bn3zyiZ55\n5hn993//t+Lj4zVz5kwdPHiwRr/3nj17avPmzSovL1dxcbG2b9/um3p3KVOnTtWGDRt06NAhffjh\nh+revbuSk5N14403aufOnb5Q2KhRI505c0bt2rVTYWGhPvzwQ0nS+vXr9dhjj9WoRgBA3WMqHQDg\nIitXrvRtrPBjKSkpeuSRR/Tkk0/qrrvuUkVFhR577DG1bt3a9wH/vBkzZmjWrFlav369bDab5s+f\nr6uvvrrSa66++mq99NJLWrhwoRYvXiyPx6N///d/17JlyyTpokCyaNEizZ49W88//7waN26spUuX\nKjw8XOPHj9d9990nu92uZs2aKSMjwzcVMCcnRyEhIZozZ47vPc//dyGbzaY+ffroL3/5ixISEtSs\nWTO1atWq0kjYj1/7YzfddJMSEhK0cOFC/ed//qfGjRun+Ph4RUVFKTY2VsePH5ck9e3bVw888IBe\neeUVPffcc5o/f75Onz4th8OhjIyMGnQHAFAf2K4bAIAf2bt3r7788kvFx8ervLxcTqdTCxYsUPv2\n7QNdGgCgHhGMAAD4kcLCQk2aNEkFBQXyeDwaOnSo7rvvvkCXBQCoZwQjAAAAAJbH5gsAAAAALI9g\nBAAAAMDyCEYAAAAALI9gBAAAAMDyCEYAAAAALO//AKCpI4eMN7XcAAAAAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x10d007d50>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.scatter(test_features[test_labels==0,0], test_features[test_labels==0,1])\n",
"plt.scatter(test_features[test_labels==1,0], test_features[test_labels==1,1], color='r')\n",
"plt.xlabel('Zero Crossing Rate')\n",
"plt.ylabel('Spectral Centroid')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Building the K-NN Model"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Build a k-NN model for the snare drums using scikit.learn's [KNeighborsClassifier](http://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html) class."
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"model = sklearn.neighbors.KNeighborsClassifier(n_neighbors=1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To train a scikit-learn classifier, use the classifier object's `fit` method:"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',\n",
" metric_params=None, n_neighbors=1, p=2, weights='uniform')"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"model.fit(training_features, training_labels)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To test the classifier on a set of (test) feature vectors, use the `predict` method:"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([ 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.,\n",
" 0., 0., 0., 0., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n",
" 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n",
" 1., 1., 1., 1., 1., 1., 1., 1.])"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"model.predict(test_features)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Evaluate the model accuracy on the test data."
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"1.0"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"model.score(test_features, test_labels)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[&larr; Back to Index](index.html)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.6"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
import errno
import librosa
import numpy
import os
import os.path
import sklearn
import urllib
def download_drum_samples(path='drum_samples'):
def extract_features(signal, features):
fvs = list()
for feature_name in features:
if feature_name == 'zero_crossing_rate':
fvs.append( librosa.feature.zero_crossing_rate(signal)[0, 0] )
elif feature_name == 'spectral_centroid':
fvs.append( librosa.feature.spectral_centroid(signal)[0, 0] )
return fvs
def get_features(collection='drum_samples_train',
features=('zero_crossing_rate', 'spectral_centroid'),
scaler=None):
if collection == 'drum_samples_train':
kick_filepaths, snare_filepaths = download_samples('drum_samples_train')
kick_signals = [
librosa.load(p)[0] for p in kick_filepaths
]
snare_signals = [
librosa.load(p)[0] for p in snare_filepaths
]
kick_features = numpy.array([extract_features(x, features) for x in kick_signals])
snare_features = numpy.array([extract_features(x, features) for x in snare_signals])
feature_table = numpy.vstack((kick_features, snare_features))
if scaler is None:
scaler = sklearn.preprocessing.MinMaxScaler(feature_range=(-1, 1))
scaler.fit(feature_table)
training_features = scaler.transform(feature_table)
kick_labels = numpy.zeros(10)
snare_labels = numpy.ones(10)
training_labels = numpy.concatenate((kick_labels, snare_labels))
return training_features, training_labels, scaler
elif collection == 'drum_samples_test':
kick_filepaths, snare_filepaths = download_samples('drum_samples_test')
kick_signals = [
librosa.load(p)[0] for p in kick_filepaths
]
snare_signals = [
librosa.load(p)[0] for p in snare_filepaths
]
kick_features = numpy.array([extract_features(x, features) for x in kick_signals])
snare_features = numpy.array([extract_features(x, features) for x in snare_signals])
feature_table = numpy.vstack((kick_features, snare_features))
if scaler is None:
scaler = sklearn.preprocessing.MinMaxScaler(feature_range=(-1, 1))
scaler.fit(feature_table)
test_features = scaler.transform(feature_table)
kick_labels = numpy.zeros(30)
snare_labels = numpy.ones(30)
labels = numpy.concatenate((kick_labels, snare_labels))
return test_features, labels, scaler
def download_samples(collection='drum_samples_train'):
"""Download ten kick drum samples and ten snare drum samples.
`path`: output directory containing the twenty drum samples
`collection`: output directory containing the twenty drum samples
Returns:
......@@ -15,17 +76,27 @@ def download_drum_samples(path='drum_samples'):
`snare_filepaths`: list of snare drum filepaths
"""
try:
os.makedirs(path)
os.makedirs(collection)
except OSError as exception:
if exception.errno != errno.EEXIST:
raise
else:
print "Directory %s already exists." % path
for drum_type in ['kick', 'snare']:
for i in range(1, 11):
filename = '%s_%02d.wav' % (drum_type, i)
urllib.urlretrieve('http://audio.musicinformationretrieval.com/drum_samples/%s' % filename,
filename=os.path.join(path, filename))
kick_filepaths = [os.path.join(path, 'kick_%02d.wav' % i) for i in range(1, 11)]
snare_filepaths = [os.path.join(path, 'snare_%02d.wav' % i) for i in range(1, 11)]
return kick_filepaths, snare_filepaths
print "Directory %s already exists." % collection
if collection == 'drum_samples_train':
for drum_type in ['kick', 'snare']:
for i in range(1, 11):
filename = '%s_%02d.wav' % (drum_type, i)
urllib.urlretrieve('http://audio.musicinformationretrieval.com/drum_samples/%s' % filename,
filename=os.path.join(collection, filename))
kick_filepaths = [os.path.join(collection, 'kick_%02d.wav' % i) for i in range(1, 11)]
snare_filepaths = [os.path.join(collection, 'snare_%02d.wav' % i) for i in range(1, 11)]
return kick_filepaths, snare_filepaths
elif collection == 'drum_samples_test':
for drum_type in ['kick', 'snare']:
for i in range(30):
filename = '%s_%02d.wav' % (drum_type, i)
urllib.urlretrieve('http://audio.musicinformationretrieval.com/drum_samples/test/%s' % filename,
filename=os.path.join(collection, filename))
kick_filepaths = [os.path.join(collection, 'kick_%02d.wav' % i) for i in range(30)]
snare_filepaths = [os.path.join(collection, 'snare_%02d.wav' % i) for i in range(30)]
return kick_filepaths, snare_filepaths
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