Skip to content

Instantly share code, notes, and snippets.

@szdr
Created February 23, 2017 14:28
Show Gist options
  • Save szdr/53b3bc39e9bca91224c1c842f9a0b492 to your computer and use it in GitHub Desktop.
Save szdr/53b3bc39e9bca91224c1c842f9a0b492 to your computer and use it in GitHub Desktop.
正定値性を満たすように変換して精度が変わるかの確認
Display the source blob
Display the rendered blob
Raw
{
"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