Created
February 23, 2017 14:28
-
-
Save szdr/53b3bc39e9bca91224c1c842f9a0b492 to your computer and use it in GitHub Desktop.
正定値性を満たすように変換して精度が変わるかの確認
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"import numpy as np\n", | |
"from sklearn import datasets, metrics, model_selection, svm" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"np.random.seed(0)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"def convert_add_lmd(mat, eps=0.0001):\n", | |
" \"\"\"\n", | |
" K' = K + \\lmd I\n", | |
" \\lmd is decided as all eigen values are larger than 0\n", | |
" \"\"\"\n", | |
" mat_positive_definite = np.copy(mat)\n", | |
" eigen_values = np.linalg.eigvals(mat)\n", | |
" min_eigen_values = np.min(eigen_values)\n", | |
" if min_eigen_values < 0:\n", | |
" lmd = -min_eigen_values + eps # new eigen values are larger than 0\n", | |
" mat_positive_definite += lmd * np.eye(mat.shape[0])\n", | |
" return mat_positive_definite" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"def convert_with_decomposition(mat, eps=0.0001):\n", | |
" \"\"\"\n", | |
" K' = P D' P^T\n", | |
" P: eigen vectors matrix\n", | |
" D: diag eigen values matrix\n", | |
" D': negative eigen values of D are \\epsilon\n", | |
" \"\"\"\n", | |
" eigen_values, eigen_vectors_mat = np.linalg.eig(mat)\n", | |
" eigen_values[eigen_values <= 0] = eps\n", | |
" # K' = P D' P^T\n", | |
" mat_positive_definite = eigen_vectors_mat.dot(np.diag(eigen_values)).dot(eigen_vectors_mat.T)\n", | |
" return mat_positive_definite" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"X, ys = datasets.make_classification(n_samples=1000)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"kf = model_selection.StratifiedKFold(n_splits=5, shuffle=True)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"# sigmoid kernel is not positive definite\n", | |
"K = metrics.pairwise.sigmoid_kernel(X, gamma=0.1)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"def acc_evaluation(K):\n", | |
" acc_scores = []\n", | |
" for train_index, test_index in kf.split(K, ys):\n", | |
" K_train, K_test = K[train_index][:, train_index], K[test_index][:, train_index]\n", | |
" ys_train, ys_test = ys[train_index], ys[test_index]\n", | |
" clf = svm.SVC(kernel=\"precomputed\")\n", | |
" clf.fit(K_train, ys_train)\n", | |
" acc_score = metrics.accuracy_score(ys_test, clf.predict(K_test))\n", | |
" acc_scores.append(acc_score)\n", | |
" return np.mean(acc_scores)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 9, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"0.830021625541\n" | |
] | |
} | |
], | |
"source": [ | |
"# without convert to positive definite\n", | |
"print(acc_evaluation(K))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 10, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"0.930993624841\n" | |
] | |
} | |
], | |
"source": [ | |
"# with adding lmd * I\n", | |
"K_added_lmd = convert_add_lmd(K)\n", | |
"print(acc_evaluation(K_added_lmd))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 11, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"0.951983974599\n" | |
] | |
} | |
], | |
"source": [ | |
"# with decomposition\n", | |
"K_with_decomposition = convert_with_decomposition(K)\n", | |
"print(acc_evaluation(K_with_decomposition))" | |
] | |
} | |
], | |
"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.6.0" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 0 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment