{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":3004,"databundleVersionId":861823,"sourceType":"competition"}],"dockerImageVersionId":30918,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd\nfrom sklearn.svm import SVC\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import accuracy_score\n\n# 定义一个函数来完成手写数字识别\ndef svm_digit_recognition():\n    # 加载训练数据\n    train_data = pd.read_csv('/kaggle/input/digit-recognizer/train.csv')\n    X = train_data.drop('label', axis=1)  # 特征（像素数据）\n    y = train_data['label']  # 标签（数字0-9）\n    \n    # 划分训练集和验证集 (80%训练, 20%验证)\n    X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42)\n    \n    # 定义SVM模型，使用RBF核\n    svm_model = SVC(kernel='rbf', C=1, gamma='scale')\n    \n    # 训练模型\n    svm_model.fit(X_train, y_train)\n    \n    # 在验证集上预测并计算准确率\n    y_pred_val = svm_model.predict(X_val)\n    accuracy = accuracy_score(y_val, y_pred_val)\n    print(f\"验证集准确率: {accuracy:.4f}\")\n    \n    # 加载测试数据\n    test_data = pd.read_csv('/kaggle/input/digit-recognizer/test.csv')\n    \n    # 对测试数据进行预测\n    y_pred_test = svm_model.predict(test_data)\n    \n    # 保存预测结果为CSV文件\n    submission = pd.DataFrame({'ImageId': range(1, len(y_pred_test) + 1), 'Label': y_pred_test})\n    submission.to_csv('submission.csv', index=False)\n    print(\"预测结果已保存到 submission.csv\")\n\n# 调用函数运行程序\nsvm_digit_recognition()","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-03-16T16:00:42.577464Z","iopub.execute_input":"2025-03-16T16:00:42.577721Z","iopub.status.idle":"2025-03-16T16:07:16.088166Z","shell.execute_reply.started":"2025-03-16T16:00:42.577694Z","shell.execute_reply":"2025-03-16T16:07:16.087036Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nfrom sklearn.svm import SVC\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import accuracy_score\nfrom sklearn.preprocessing import StandardScaler\nimport math\n# Setting up Seaborn style\nsns.set(style=\"whitegrid\")\n\ndef plot_images_with_labels(train_data, indices, y_true, y_pred=None, title='Images', num_images=10):\n    ncols = 5\n    nrows = math.ceil(num_images / ncols)\n    fig_height = 3 * nrows\n    # Plot the images\n    plt.figure(figsize=(12, fig_height), dpi=450)\n    for i in range(num_images):\n        idx = indices[i]\n        image = train_data.iloc[idx][1:].values\n        label_str = f\"True: {y_true[i]}\"\n        if y_pred is not None:\n            label_str += f\"\\nPred: {y_pred[i]}\"\n        plt.subplot(nrows, ncols, i + 1)\n        plt.imshow(image.reshape(28, 28), cmap='gray', aspect='auto')\n        plt.title(label_str, fontsize=10)\n        plt.axis('off')\n    plt.suptitle(title, fontsize=14)\n    plt.tight_layout()\n    plt.savefig(f'{title.lower().replace(\" \", \"_\")}.png', dpi=450)\n    plt.show()\n\ndef plot_confusion_matrix(y_true, y_pred):\n    from sklearn.metrics import confusion_matrix\n    cm = confusion_matrix(y_true, y_pred)\n    plt.figure(figsize=(10, 8), dpi=450)\n    sns.heatmap(cm, annot=True, fmt='d', cmap='coolwarm', xticklabels=range(10), yticklabels=range(10))\n    plt.title('Confusion Matrix', fontsize=14)\n    plt.ylabel('True Label', fontsize=12)\n    plt.xlabel('Predicted Label', fontsize=12)\n    plt.savefig('confusion_matrix.png', dpi=450)\n    plt.show()\n\ndef plot_support_vectors_per_class(y_train_values, svm_model):\n    support_indices = svm_model.support_\n    y_support = y_train_values[support_indices]\n    \n    # Count the number of support vectors per class\n    count = pd.value_counts(y_support)\n    \n    # Plot the bar chart\n    plt.figure(figsize=(10, 6), dpi=450)\n    sns.barplot(x=count.index, y=count.values)\n    plt.title('Number of Support Vectors per Class', fontsize=14)\n    plt.ylabel('Number of Support Vectors', fontsize=12)\n    plt.xlabel('Digit Class', fontsize=12)\n    plt.savefig('support_vectors_per_class.png', dpi=450)\n    plt.show()\n\ndef svm_digit_recognition():\n    # Load training data\n    train_data = pd.read_csv('/kaggle/input/digit-recognizer/train.csv')\n    \n    # Separate features and labels\n    X = train_data.drop('label', axis=1)\n    y = train_data['label']\n    \n    # Standardize data\n    scaler = StandardScaler()\n    X_scaled = scaler.fit_transform(X)\n    \n    # Get indices for train and validation sets\n    all_indices = range(len(X_scaled))\n    train_indices, val_indices = train_test_split(all_indices, test_size=0.2, random_state=42)\n    \n    # Split into train and validation sets\n    X_train = X_scaled[train_indices]\n    y_train = y[train_indices]\n    X_val = X_scaled[val_indices]\n    y_val = y[val_indices]\n    \n    # Train SVM model\n    svm_model = SVC(kernel='rbf', C=1, gamma='scale')\n    svm_model.fit(X_train, y_train)\n    \n    # Predict on validation set\n    y_pred_val = svm_model.predict(X_val)\n    \n    # Calculate accuracy\n    accuracy = accuracy_score(y_val, y_pred_val)\n    print(f\"Validation Accuracy: {accuracy:.4f}\")\n    \n    # Plot validation images using original pixel values\n    plot_images_with_labels(train_data, val_indices, y_val.values, y_pred_val, title='Validation Images with Predictions', num_images=10)\n    \n    # Plot extended validation images using original pixel values\n    plot_images_with_labels(train_data, val_indices, y_val.values, y_pred_val, title='Extended Validation Images with Predictions', num_images=20)\n    \n    # Plot support vector images\n    support_indices_in_X_train = svm_model.support_\n    original_support_indices = [train_indices[i] for i in support_indices_in_X_train]\n    plot_images_with_labels(train_data, original_support_indices, y_train.values[support_indices_in_X_train], title='Support Vector Images', num_images=10)\n    \n    # Plot misclassified images\n    misclassified_indices = np.where(y_val != y_pred_val)[0]\n    original_misclassified_indices = [val_indices[i] for i in misclassified_indices]\n    plot_images_with_labels(train_data, original_misclassified_indices, y_val.values[misclassified_indices], y_pred_val[misclassified_indices], title='Misclassified Images', num_images=10)\n    \n    # Plot confusion matrix\n    plot_confusion_matrix(y_val.values, y_pred_val)\n    \n    # Plot support vectors per class distribution\n    plot_support_vectors_per_class(y_train.values, svm_model)\n    \n    # Load test data and predict\n    test_data = pd.read_csv('/kaggle/input/digit-recognizer/test.csv')\n    test_scaled = scaler.transform(test_data)\n    y_pred_test = svm_model.predict(test_scaled)\n    \n    # Save submission\n    submission = pd.DataFrame({'ImageId': range(1, len(y_pred_test) + 1), 'Label': y_pred_test})\n    submission.to_csv('submission.csv', index=False)\n    print(\"Predictions saved to submission.csv\")\n\n# Run the main function\nsvm_digit_recognition()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-03-17T06:07:11.723091Z","iopub.execute_input":"2025-03-17T06:07:11.723496Z","iopub.status.idle":"2025-03-17T06:15:38.514471Z","shell.execute_reply.started":"2025-03-17T06:07:11.723466Z","shell.execute_reply":"2025-03-17T06:15:38.513504Z"}},"outputs":[],"execution_count":null}]}