├── 2022国赛C题论文155代码复现 ├── C题.pdf ├── Regression equations available to gaojia.xlsx ├── Regression equations available to qianba.xlsx ├── c12.xlsx ├── gaojia_chemical_means.xlsx ├── qianba_chemical_means.xlsx ├── transformed_gaojia_weathered_state.xlsx ├── transformed_qianba_weathered_state.xlsx ├── weathering_summary_gaojia.xlsx ├── weathering_summary_qianba.xlsx ├── 一二表单合并对数中心化转换数据.xlsx ├── 一二表单合并数据.xlsx ├── 一二表单合并数据统计性分析.xlsx ├── 全国大学生数学建模大赛C题(C155).pdf ├── 解析方案 │ ├── 第一题 │ │ ├── 1.1 │ │ │ ├── Pearson卡方 _(类型)_(表面风化) (1).docx │ │ │ ├── Yates卡方 _(纹饰)_(表面风化) (1).docx │ │ │ ├── Yates卡方 _(颜色)_(表面风化).docx │ │ │ └── 数学建模2022C题1.1最终版.ipynb │ │ ├── 1.2 │ │ │ └── 数学建模2022国赛C代码BreakDown1.2.ipynb │ │ └── 1.3 │ │ │ └── 数学建模2022C题1.3-Copy3.ipynb │ ├── 第三题 │ │ └── 数学建模2022C题3.ipynb │ ├── 第二题 │ │ └── 数学建模2022C题2.ipynb │ └── 第四题 │ │ └── 数学建模2022C题4.ipynb └── 附件.xlsx ├── 2023年MathorCup高校数学建模挑战赛赛题 ├── 2023年MathorCup高校数学建模挑战赛承诺书(手写或者电子签名后上传).docx ├── 2023年MathorCup高校数学建模挑战赛提交步骤.pdf ├── 2023年MathorCup高校数学建模挑战赛论文模板.doc ├── D题 │ ├── 2023年MathorCup高校数学建模挑战赛D题.pdf │ ├── 数据处理过程备份 2 │ │ ├── onedata3的生成过程.html │ │ ├── onedata3的生成过程.ipynb │ │ ├── onedata6的生成过程.html │ │ ├── onedata6的生成过程.ipynb │ │ ├── 特征重要性分析.html │ │ └── 特征重要性分析.ipynb │ ├── 第三题思路及其代码 │ │ ├── TwoData1.html │ │ ├── TwoData1.ipynb │ │ ├── TwoData2.html │ │ ├── TwoData2.ipynb │ │ └── 第三题思路说明.txt │ ├── 第二题数据处理 │ │ ├── Joystick_Position_Trend_Analysis.mlx │ │ ├── 操纵杆位置趋势分析代码.txt │ │ └── 问题2.docx │ ├── 第五题 │ │ ├── Third.html │ │ └── Third.ipynb │ ├── 论文.pdf │ └── 附件 │ │ ├── 附件1-2关键参数航段数据的字段说明.xlsx │ │ ├── 附件2:超限数据.xlsx │ │ └── 附件3 飞行参数测量数据 │ │ ├── 附件3:飞行参数测量数据.xlsx │ │ └── 飞行参数测量数据的字段说明.xls └── 第十三届MathorCup高校数学建模挑战赛论文格式及提交规范.pdf ├── README.md └── 数学建模国赛算法库 ├── 供给地与需求地的最优资源分配问题.ipynb ├── 分支定界算法求解整数规划.ipynb ├── 匈牙利算法求解整数规划.ipynb ├── 回归算法.ipynb ├── 层次分析法.ipynb ├── 拟牛顿法.ipynb ├── 插值法.ipynb ├── 灰色预测模型.ipynb ├── 粒子群算法.ipynb ├── 蚁群算法.ipynb ├── 遗传算法.ipynb └── 非线性规划函数.ipynb /2022国赛C题论文155代码复现/C题.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindowBird/MathModel-with-python/0ac0a57f5dffd4e43a7229442c6d50a1eda80148/2022国赛C题论文155代码复现/C题.pdf -------------------------------------------------------------------------------- /2022国赛C题论文155代码复现/Regression equations available to gaojia.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindowBird/MathModel-with-python/0ac0a57f5dffd4e43a7229442c6d50a1eda80148/2022国赛C题论文155代码复现/Regression equations available to gaojia.xlsx -------------------------------------------------------------------------------- /2022国赛C题论文155代码复现/Regression equations available to qianba.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindowBird/MathModel-with-python/0ac0a57f5dffd4e43a7229442c6d50a1eda80148/2022国赛C题论文155代码复现/Regression equations available to qianba.xlsx -------------------------------------------------------------------------------- /2022国赛C题论文155代码复现/c12.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindowBird/MathModel-with-python/0ac0a57f5dffd4e43a7229442c6d50a1eda80148/2022国赛C题论文155代码复现/c12.xlsx -------------------------------------------------------------------------------- /2022国赛C题论文155代码复现/gaojia_chemical_means.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindowBird/MathModel-with-python/0ac0a57f5dffd4e43a7229442c6d50a1eda80148/2022国赛C题论文155代码复现/gaojia_chemical_means.xlsx -------------------------------------------------------------------------------- /2022国赛C题论文155代码复现/qianba_chemical_means.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindowBird/MathModel-with-python/0ac0a57f5dffd4e43a7229442c6d50a1eda80148/2022国赛C题论文155代码复现/qianba_chemical_means.xlsx -------------------------------------------------------------------------------- /2022国赛C题论文155代码复现/transformed_gaojia_weathered_state.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindowBird/MathModel-with-python/0ac0a57f5dffd4e43a7229442c6d50a1eda80148/2022国赛C题论文155代码复现/transformed_gaojia_weathered_state.xlsx -------------------------------------------------------------------------------- /2022国赛C题论文155代码复现/transformed_qianba_weathered_state.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindowBird/MathModel-with-python/0ac0a57f5dffd4e43a7229442c6d50a1eda80148/2022国赛C题论文155代码复现/transformed_qianba_weathered_state.xlsx -------------------------------------------------------------------------------- /2022国赛C题论文155代码复现/weathering_summary_gaojia.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindowBird/MathModel-with-python/0ac0a57f5dffd4e43a7229442c6d50a1eda80148/2022国赛C题论文155代码复现/weathering_summary_gaojia.xlsx -------------------------------------------------------------------------------- /2022国赛C题论文155代码复现/weathering_summary_qianba.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindowBird/MathModel-with-python/0ac0a57f5dffd4e43a7229442c6d50a1eda80148/2022国赛C题论文155代码复现/weathering_summary_qianba.xlsx -------------------------------------------------------------------------------- /2022国赛C题论文155代码复现/一二表单合并对数中心化转换数据.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindowBird/MathModel-with-python/0ac0a57f5dffd4e43a7229442c6d50a1eda80148/2022国赛C题论文155代码复现/一二表单合并对数中心化转换数据.xlsx -------------------------------------------------------------------------------- /2022国赛C题论文155代码复现/一二表单合并数据.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindowBird/MathModel-with-python/0ac0a57f5dffd4e43a7229442c6d50a1eda80148/2022国赛C题论文155代码复现/一二表单合并数据.xlsx -------------------------------------------------------------------------------- /2022国赛C题论文155代码复现/一二表单合并数据统计性分析.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindowBird/MathModel-with-python/0ac0a57f5dffd4e43a7229442c6d50a1eda80148/2022国赛C题论文155代码复现/一二表单合并数据统计性分析.xlsx -------------------------------------------------------------------------------- /2022国赛C题论文155代码复现/全国大学生数学建模大赛C题(C155).pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindowBird/MathModel-with-python/0ac0a57f5dffd4e43a7229442c6d50a1eda80148/2022国赛C题论文155代码复现/全国大学生数学建模大赛C题(C155).pdf -------------------------------------------------------------------------------- /2022国赛C题论文155代码复现/解析方案/第一题/1.1/Pearson卡方 _(类型)_(表面风化) (1).docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindowBird/MathModel-with-python/0ac0a57f5dffd4e43a7229442c6d50a1eda80148/2022国赛C题论文155代码复现/解析方案/第一题/1.1/Pearson卡方 _(类型)_(表面风化) (1).docx -------------------------------------------------------------------------------- /2022国赛C题论文155代码复现/解析方案/第一题/1.1/Yates卡方 _(纹饰)_(表面风化) (1).docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindowBird/MathModel-with-python/0ac0a57f5dffd4e43a7229442c6d50a1eda80148/2022国赛C题论文155代码复现/解析方案/第一题/1.1/Yates卡方 _(纹饰)_(表面风化) (1).docx -------------------------------------------------------------------------------- /2022国赛C题论文155代码复现/解析方案/第一题/1.1/Yates卡方 _(颜色)_(表面风化).docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindowBird/MathModel-with-python/0ac0a57f5dffd4e43a7229442c6d50a1eda80148/2022国赛C题论文155代码复现/解析方案/第一题/1.1/Yates卡方 _(颜色)_(表面风化).docx -------------------------------------------------------------------------------- /2022国赛C题论文155代码复现/解析方案/第一题/1.1/数学建模2022C题1.1最终版.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "id": "117b0820", 7 | "metadata": {}, 8 | "outputs": [ 9 | { 10 | "data": { 11 | "text/html": [ 12 | "
\n", 13 | "\n", 26 | "\n", 27 | " \n", 28 | " \n", 29 | " \n", 30 | " \n", 31 | " \n", 32 | " \n", 33 | " \n", 34 | " \n", 35 | " \n", 36 | " \n", 37 | " \n", 38 | " \n", 39 | " \n", 40 | " \n", 41 | " \n", 42 | " \n", 43 | " \n", 44 | " \n", 45 | " \n", 46 | " \n", 47 | " \n", 48 | " \n", 49 | " \n", 50 | " \n", 51 | " \n", 52 | " \n", 53 | " \n", 54 | " \n", 55 | " \n", 56 | " \n", 57 | " \n", 58 | " \n", 59 | "
特征期望计数小于5的单元格数最小期望计数期望计数小于5的单元格数的比例
0类型07.4482760.000000
1纹饰22.4827590.333333
2颜色120.4444440.750000
\n", 60 | "
" 61 | ], 62 | "text/plain": [ 63 | " 特征 期望计数小于5的单元格数 最小期望计数 期望计数小于5的单元格数的比例\n", 64 | "0 类型 0 7.448276 0.000000\n", 65 | "1 纹饰 2 2.482759 0.333333\n", 66 | "2 颜色 12 0.444444 0.750000" 67 | ] 68 | }, 69 | "execution_count": 1, 70 | "metadata": {}, 71 | "output_type": "execute_result" 72 | } 73 | ], 74 | "source": [ 75 | "import pandas as pd\n", 76 | "import numpy as np\n", 77 | "\n", 78 | "# Load data\n", 79 | "xls = pd.ExcelFile(\"E:\\\\数学建模国赛\\\\2022数学建模赛题\\\\C题\\\\附件.xlsx\")\n", 80 | "\n", 81 | "\n", 82 | "# Load all sheets in the Excel file\n", 83 | "sheets = xls.sheet_names\n", 84 | "dfs = {}\n", 85 | "for sheet in sheets:\n", 86 | " dfs[sheet] = pd.read_excel(xls, sheet)\n", 87 | "df1=dfs['表单1'].drop(columns=[\"文物编号\"])\n", 88 | "\n", 89 | "# 创建一个DataFrame来保存每个特征的计数信息\n", 90 | "count_info = pd.DataFrame(columns=['特征', '期望计数小于5的单元格数', \n", 91 | " '最小期望计数', '期望计数小于5的单元格数的比例'])\n", 92 | "\n", 93 | "# 对每个特征进行卡方检验\n", 94 | "for column in ['类型', '纹饰', '颜色']:\n", 95 | " # 删除含有空值的行\n", 96 | " df_dropped_na = df1[['表面风化', column]].dropna()\n", 97 | " \n", 98 | " # 创建列联表\n", 99 | " contingency_table = pd.crosstab(df_dropped_na['表面风化'], df_dropped_na[column])\n", 100 | " \n", 101 | " # 计算期望计数\n", 102 | " row_totals = contingency_table.sum(axis=1)\n", 103 | " col_totals = contingency_table.sum(axis=0)\n", 104 | " total = contingency_table.sum().sum()\n", 105 | " expected = np.outer(row_totals, col_totals) / total\n", 106 | " \n", 107 | " # 计算期望计数小于5的单元格数\n", 108 | " cells_with_expected_count_less_than_5 = (expected < 5).sum()\n", 109 | " \n", 110 | " # 获取最小期望计数\n", 111 | " min_expected_count = expected.min()\n", 112 | " \n", 113 | " # 计算期望计数小于5的单元格数的比例\n", 114 | " ratio_cells_with_expected_count_less_than_5 = cells_with_expected_count_less_than_5 / (contingency_table.shape[0] * contingency_table.shape[1])\n", 115 | " \n", 116 | " # 将结果保存到DataFrame\n", 117 | " count_info_to_append = pd.DataFrame({\n", 118 | " '特征': [column],\n", 119 | " '期望计数小于5的单元格数': [cells_with_expected_count_less_than_5],\n", 120 | " '最小期望计数': [min_expected_count],\n", 121 | " '期望计数小于5的单元格数的比例': [ratio_cells_with_expected_count_less_than_5]\n", 122 | " })\n", 123 | " \n", 124 | " count_info = pd.concat([count_info, count_info_to_append], ignore_index=True)\n", 125 | "\n", 126 | "# 显示计数信息\n", 127 | "count_info\n" 128 | ] 129 | }, 130 | { 131 | "cell_type": "code", 132 | "execution_count": 2, 133 | "id": "72c20404", 134 | "metadata": {}, 135 | "outputs": [ 136 | { 137 | "data": { 138 | "image/png": "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y3x8fJSZmVlqiD2/zbn60nh7exfbRlBQ0OV3GpUiICCAHyjAJeK8AS4P507VFBgYWKY6t9zYFRISolOnThVZlpGRIS8vrzK3uVg9AAAArl5uCbGRkZHauHGjaz4pKUkOh0MhISFlbhMfH6969Up+QD4AAACubm4JsR06dJDdbtfMmTMlSbGxserSpYusVqvS0tKUn1/8ruUHHnhA8+fP186dO3XmzBlNmjRJ3bp1q+yuo4J4e3trzJgxxYaAACgd5w1weTh3rg4Wp7MszzAof1999ZX69esnX19feXh4aPXq1WrevLksFovi4+PVqlWrYm1GjBihd955Rz4+PmrSpInWrVsnX1/fyu88AAAA3MptIVaSUlJStG3bNkVFRalGjRplapOYmKijR4/q7rvvZkwsAADANcqtIRYAAAC4HG4ZEwsAAABcCUIs3KakG/jO53Q6lZOTUwm9AaqOLVu2KC4urth3f8qUKUpOTi6xzc6dO5Wbm1tkWUJCQoX1EaiK5syZo0WLFrnmc3Jyiry+tLTfKb/88otWrlypvDxe62sSQiwqTH5+vvr3769169ZJkt544w0NGjRIUuEj0ho3bqzDhw+76ocNG6awsDBZrVY1bNhQNWrUkL+/v6Kjo5WXl6e0tDRJ0qOPPqpp06ZV+v4AlWXWrFlauHChPD09iyxfsWKF3nvvvWL1TqdT3bp106pVq1zL9uzZozZt2ujAgQMV3l+gqkhPT9eKFStc8/fcc4+uu+46+fn5KTQ0VNddd50eeuihYu1Gjx6tTz75pDK7inLgljd24dpgtVo1cuRI/eUvf9G///1veXt7y9PTUydPnlS/fv00d+5cXXfdda76KVOm6I033lCzZs108OBBTZs2TT/88INmzZqlTZs2afDgwYqPj5evry+PRcFV6+zZs1qwYIHWrl0ri8WivLw8OZ1OeXp6auTIkfLwKLz2UFBQoLy8PHl5eem7775TQUGBLBaLVqxYoaioKM2ePVt9+/bV9ddf71q30+lUVlaWqlWr5q7dAyrE3//+d23YsEG5ubmy2+1as2aN/vSnP7kuonTs2FEffvihWrRoUazt0qVL9a9//UuhoaFq3Lixa3njxo21bNkybiKvwgixqBDR0dFau3atgoKCVFBQoK5duyo1NVWenp5aunSp8vLy9PDDDysrK0s33nijVq9eLUnKzc0tdvVJKvoaYQ8PD1kslsrcHaDSvPfee+rVq5duvPFG9e3bVzabTXPnzlX16tVd50BGRoZsNpvatWunVatW6d1331WbNm00d+5cff311/r55581ffp0+fn5qW7dukpNTVVoaKicTqf8/PyUmJjo5r0Eytenn36qkSNH6plnntGRI0e0atUq/fOf/3R9vm/fviIB9Zz4+Hg99dRT2rJli2677TZJhedXgwYNNGLECAJsFUeIRYVYuHCh6xdudna27rrrLgUGBuqee+5R8+bNdezYMb322muuq0o7d+7UF198oZycHNntdo0dO1Zbt27VkSNH9Morr+iee+5x5+4AlWLNmjV644039PHHH+vdd9/VmjVrtHv3bmVkZKhXr1564oknJEk1a9bUf//7X916661au3atfvrpJ+3fv19ffvmlvL299e6776pVq1ZatWqVfvjhB7388suuvygCVys/Pz/98MMPWr16tSIiIiRJvXv31saNG5Wfn6+IiAhlZmbqrbfe0pNPPqnPP/9cTz/9tD766CNXgJWkUaNG6d5771WnTp3ctSsoI0IsKsS5AJuamqrevXsrPDxcUVFROnTokCIjI9W7d29t2rRJ//rXvxQSEqKcnBylpqbq2LFjql69utLS0pSVleVanpubK54Gh6tdTk6O2rdvr59++knTp0/X7NmzFRQUpIiICNfY1rS0NP32229q0qSJpMLhB++884527dql9u3bq2vXrvryyy/Vv39/d+4KUKmGDBmiZcuWyWKx6PTp06pevbry8vJksVi0dOlSNW/eXJ6enho+fLhsNpuOHDmiMWPGqGPHjnrqqac0cuRISYW/sywWi4KCgtSwYUOlpKRo1qxZ6tu3r5v3ECXhxi5UiLy8PM2fP1833XST6tatq/nz5ys3N1e5ubmKjIzU1q1blZqaqrZt22r37t1q06aNpk6dKh8fHw0cOFDvv/++HnzwQd12222aOnWq/P395XA4JBUO3LdarW7eQ6D8de3aVatWrVJgYKDuu+8+PfDAA5Kkli1b6qeffpIkbdu2Tc2aNZO/v78kqUePHurXr5+io6OVn5+v0NBQ/fWvf1WvXr3UsGFD9e7dWz/88IMaNmyohg0b6qmnnnLX7gEVxuFw6J133tHevXtdr6l/9tlnXf/a9/TTT2v8+PGSJIvFovr162vv3r26//771blzZx08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\n", 139 | "text/plain": [ 140 | "
" 141 | ] 142 | }, 143 | "metadata": {}, 144 | "output_type": "display_data" 145 | } 146 | ], 147 | "source": [ 148 | "import seaborn as sns\n", 149 | "import matplotlib.pyplot as plt\n", 150 | "plt.rcParams['font.sans-serif'] = ['SimHei']\n", 151 | "p_values = [0.009,0.084,0.507]\n", 152 | "p_values_df = pd.DataFrame({\n", 153 | " 'Feature': ['类型', '纹饰', '颜色'],\n", 154 | " 'p_value': p_values\n", 155 | "})\n", 156 | "# 创建图形\n", 157 | "plt.figure(figsize=(8, 6))\n", 158 | "bar_plot = sns.barplot(x='Feature', y='p_value', data=p_values_df)\n", 159 | "\n", 160 | "# 在条形顶部添加 p 值\n", 161 | "for i in range(p_values_df.shape[0]):\n", 162 | " bar_plot.text(i, p_values_df.p_value[i], round(p_values_df.p_value[i], 3), ha='center')\n", 163 | "\n", 164 | "# 添加 p=0.05 的参考线\n", 165 | "plt.axhline(y=0.05, color='r', linestyle='--')\n", 166 | "\n", 167 | "# 设置标题和标签\n", 168 | "plt.title('卡方检验 p值')\n", 169 | "plt.ylabel('p值')\n", 170 | "\n", 171 | "# 显示图形\n", 172 | "plt.show()\n" 173 | ] 174 | }, 175 | { 176 | "cell_type": "code", 177 | "execution_count": null, 178 | "id": "58845ae0", 179 | "metadata": {}, 180 | "outputs": [], 181 | "source": [] 182 | } 183 | ], 184 | "metadata": { 185 | "kernelspec": { 186 | "display_name": "Python 3 (ipykernel)", 187 | "language": "python", 188 | "name": "python3" 189 | }, 190 | "language_info": { 191 | "codemirror_mode": { 192 | "name": "ipython", 193 | "version": 3 194 | }, 195 | "file_extension": ".py", 196 | "mimetype": "text/x-python", 197 | "name": "python", 198 | "nbconvert_exporter": "python", 199 | "pygments_lexer": "ipython3", 200 | "version": "3.10.8" 201 | } 202 | }, 203 | "nbformat": 4, 204 | "nbformat_minor": 5 205 | } 206 | -------------------------------------------------------------------------------- /2022国赛C题论文155代码复现/解析方案/第三题/数学建模2022C题3.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "id": "8b41fd4a", 7 | "metadata": {}, 8 | "outputs": [ 9 | { 10 | "name": "stderr", 11 | "output_type": "stream", 12 | "text": [ 13 | "D:\\py1.1\\envs\\pytorch\\lib\\site-packages\\sklearn\\base.py:439: UserWarning: X does not have valid feature names, but DecisionTreeClassifier was fitted with feature names\n", 14 | " warnings.warn(\n", 15 | "D:\\py1.1\\envs\\pytorch\\lib\\site-packages\\sklearn\\base.py:439: UserWarning: X does not have valid feature names, but DecisionTreeClassifier was fitted with feature names\n", 16 | " warnings.warn(\n", 17 | "D:\\py1.1\\envs\\pytorch\\lib\\site-packages\\sklearn\\base.py:439: UserWarning: X does not have valid feature names, but DecisionTreeClassifier was fitted with feature names\n", 18 | " warnings.warn(\n", 19 | "D:\\py1.1\\envs\\pytorch\\lib\\site-packages\\sklearn\\base.py:439: UserWarning: X does not have valid feature names, but DecisionTreeClassifier was fitted with feature names\n", 20 | " warnings.warn(\n", 21 | "D:\\py1.1\\envs\\pytorch\\lib\\site-packages\\sklearn\\base.py:439: UserWarning: X does not have valid feature names, but DecisionTreeClassifier was fitted with feature names\n", 22 | " warnings.warn(\n", 23 | "D:\\py1.1\\envs\\pytorch\\lib\\site-packages\\sklearn\\base.py:439: UserWarning: X does not have valid feature names, but DecisionTreeClassifier was fitted with feature names\n", 24 | " warnings.warn(\n", 25 | "D:\\py1.1\\envs\\pytorch\\lib\\site-packages\\sklearn\\base.py:439: UserWarning: X does not have valid feature names, but DecisionTreeClassifier was fitted with feature names\n", 26 | " warnings.warn(\n", 27 | "D:\\py1.1\\envs\\pytorch\\lib\\site-packages\\sklearn\\base.py:439: UserWarning: X does not have valid feature names, but DecisionTreeClassifier was fitted with feature names\n", 28 | " warnings.warn(\n" 29 | ] 30 | }, 31 | { 32 | "data": { 33 | "text/html": [ 34 | "
\n", 35 | "\n", 48 | "\n", 49 | " \n", 50 | " \n", 51 | " \n", 52 | " \n", 53 | " \n", 54 | " \n", 55 | " \n", 56 | " \n", 57 | " \n", 58 | " \n", 59 | " \n", 60 | " \n", 61 | " \n", 62 | " \n", 63 | " \n", 64 | " \n", 65 | " \n", 66 | " \n", 67 | " \n", 68 | " \n", 69 | " \n", 70 | " \n", 71 | " \n", 72 | " \n", 73 | " \n", 74 | " \n", 75 | " \n", 76 | " \n", 77 | " \n", 78 | " \n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | " \n", 83 | " \n", 84 | " \n", 85 | " \n", 86 | " \n", 87 | " \n", 88 | " \n", 89 | " \n", 90 | " \n", 91 | " \n", 92 | " \n", 93 | " \n", 94 | " \n", 95 | " \n", 96 | " \n", 97 | " \n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | " \n", 106 | " \n", 107 | "
文物编号表面风化预测类型
0A1无风化高钾
1A2风化铅钡
2A3无风化铅钡
3A4无风化铅钡
4A5风化铅钡
5A6风化高钾
6A7风化高钾
7A8无风化铅钡
\n", 108 | "
" 109 | ], 110 | "text/plain": [ 111 | " 文物编号 表面风化 预测类型\n", 112 | "0 A1 无风化 高钾\n", 113 | "1 A2 风化 铅钡\n", 114 | "2 A3 无风化 铅钡\n", 115 | "3 A4 无风化 铅钡\n", 116 | "4 A5 风化 铅钡\n", 117 | "5 A6 风化 高钾\n", 118 | "6 A7 风化 高钾\n", 119 | "7 A8 无风化 铅钡" 120 | ] 121 | }, 122 | "execution_count": 1, 123 | "metadata": {}, 124 | "output_type": "execute_result" 125 | } 126 | ], 127 | "source": [ 128 | "import pandas as pd\n", 129 | "from sklearn.model_selection import train_test_split\n", 130 | "from sklearn.tree import DecisionTreeClassifier\n", 131 | "from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score\n", 132 | "import matplotlib.pyplot as plt\n", 133 | "from sklearn.tree import plot_tree\n", 134 | "\n", 135 | "# 读取合并的数据\n", 136 | "data = pd.read_excel('E:\\\\数学建模国赛\\\\2022数学建模赛题\\\\C题\\\\一二表单合并数据.xlsx')\n", 137 | "\n", 138 | "# 删除无用列\n", 139 | "data.drop(columns=['Unnamed: 0'], inplace=True)\n", 140 | "\n", 141 | "# 定义函数以处理风化或未风化组的数据\n", 142 | "def process_group(data, group_condition):\n", 143 | " group_data = data[data['表面风化'] == group_condition]\n", 144 | " X = group_data.drop(columns=['类型', '表面风化', '文物采样点'])\n", 145 | " y = group_data['类型']\n", 146 | " return train_test_split(X, y, test_size=0.3, random_state=42)\n", 147 | "\n", 148 | "# 训练决策树模型\n", 149 | "def train_decision_tree(X_train, y_train):\n", 150 | " clf = DecisionTreeClassifier(random_state=42)\n", 151 | " clf.fit(X_train, y_train)\n", 152 | " return clf\n", 153 | "\n", 154 | "# 分离风化和未风化组\n", 155 | "X_train_weathered, X_test_weathered, y_train_weathered, y_test_weathered = process_group(data, '风化')\n", 156 | "X_train_unweathered, X_test_unweathered, y_train_unweathered, y_test_unweathered = process_group(data, '无风化')\n", 157 | "\n", 158 | "# 训练风化和未风化决策树模型\n", 159 | "clf_weathered = train_decision_tree(X_train_weathered, y_train_weathered)\n", 160 | "clf_unweathered = train_decision_tree(X_train_unweathered, y_train_unweathered)\n", 161 | "\n", 162 | "# 读取表单三数据\n", 163 | "uploaded_excel_path = 'E:\\\\数学建模国赛\\\\2022数学建模赛题\\\\C题\\\\附件.xlsx'\n", 164 | "new_data = pd.read_excel(uploaded_excel_path, sheet_name='表单3')\n", 165 | "new_data = new_data .fillna(0)\n", 166 | "# 分类新数据\n", 167 | "def classify_new_data(row):\n", 168 | " features = row.drop(labels=['文物编号', '表面风化'])\n", 169 | " if row['表面风化'] == '风化':\n", 170 | " return clf_weathered.predict([features])[0]\n", 171 | " else:\n", 172 | " return clf_unweathered.predict([features])[0]\n", 173 | "\n", 174 | "new_data['预测类型'] = new_data.apply(classify_new_data, axis=1)\n", 175 | "\n", 176 | "# 显示预测结果\n", 177 | "new_data[['文物编号', '表面风化', '预测类型']]\n" 178 | ] 179 | }, 180 | { 181 | "cell_type": "code", 182 | "execution_count": 2, 183 | "id": "bb0c8247", 184 | "metadata": {}, 185 | "outputs": [ 186 | { 187 | "name": "stderr", 188 | "output_type": "stream", 189 | "text": [ 190 | "D:\\py1.1\\envs\\pytorch\\lib\\site-packages\\sklearn\\cluster\\_kmeans.py:870: FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning\n", 191 | " warnings.warn(\n", 192 | "D:\\py1.1\\envs\\pytorch\\lib\\site-packages\\sklearn\\cluster\\_kmeans.py:1382: UserWarning: KMeans is known to have a memory leak on Windows with MKL, when there are less chunks than available threads. You can avoid it by setting the environment variable OMP_NUM_THREADS=1.\n", 193 | " warnings.warn(\n" 194 | ] 195 | }, 196 | { 197 | "data": { 198 | "text/html": [ 199 | "
\n", 200 | "\n", 213 | "\n", 214 | " \n", 215 | " \n", 216 | " \n", 217 | " \n", 218 | " \n", 219 | " \n", 220 | " \n", 221 | " \n", 222 | " \n", 223 | " \n", 224 | " \n", 225 | " \n", 226 | " \n", 227 | " \n", 228 | " \n", 229 | " \n", 230 | " \n", 231 | " \n", 232 | " \n", 233 | " \n", 234 | " \n", 235 | " \n", 236 | " \n", 237 | " \n", 238 | " \n", 239 | " \n", 240 | " \n", 241 | " \n", 242 | " \n", 243 | " \n", 244 | " \n", 245 | " \n", 246 | " \n", 247 | " \n", 248 | " \n", 249 | " \n", 250 | " \n", 251 | " \n", 252 | " \n", 253 | " \n", 254 | " \n", 255 | " \n", 256 | " \n", 257 | " \n", 258 | " \n", 259 | " \n", 260 | " \n", 261 | " \n", 262 | " \n", 263 | " \n", 264 | " \n", 265 | " \n", 266 | " \n", 267 | " \n", 268 | " \n", 269 | " \n", 270 | " \n", 271 | " \n", 272 | " \n", 273 | " \n", 274 | " \n", 275 | " \n", 276 | " \n", 277 | " \n", 278 | " \n", 279 | " \n", 280 | " \n", 281 | " \n", 282 | " \n", 283 | " \n", 284 | " \n", 285 | " \n", 286 | " \n", 287 | " \n", 288 | " \n", 289 | " \n", 290 | " \n", 291 | " \n", 292 | " \n", 293 | " \n", 294 | " \n", 295 | " \n", 296 | " \n", 297 | " \n", 298 | " \n", 299 | " \n", 300 | " \n", 301 | " \n", 302 | " \n", 303 | " \n", 304 | " \n", 305 | " \n", 306 | " \n", 307 | " \n", 308 | " \n", 309 | " \n", 310 | " \n", 311 | " \n", 312 | " \n", 313 | " \n", 314 | " \n", 315 | " \n", 316 | " \n", 317 | " \n", 318 | " \n", 319 | " \n", 320 | " \n", 321 | " \n", 322 | " \n", 323 | " \n", 324 | " \n", 325 | " \n", 326 | " \n", 327 | " \n", 328 | " \n", 329 | " \n", 330 | " \n", 331 | " \n", 332 | " \n", 333 | " \n", 334 | " \n", 335 | " \n", 336 | " \n", 337 | " \n", 338 | " \n", 339 | " \n", 340 | " \n", 341 | " \n", 342 | " \n", 343 | " \n", 344 | " \n", 345 | " \n", 346 | " \n", 347 | " \n", 348 | " \n", 349 | " \n", 350 | " \n", 351 | " \n", 352 | " \n", 353 | " \n", 354 | " \n", 355 | " \n", 356 | " \n", 357 | " \n", 358 | " \n", 359 | " \n", 360 | " \n", 361 | " \n", 362 | " \n", 363 | " \n", 364 | " \n", 365 | " \n", 366 | " \n", 367 | " \n", 368 | " \n", 369 | " \n", 370 | " \n", 371 | " \n", 372 | " \n", 373 | " \n", 374 | " \n", 375 | " \n", 376 | " \n", 377 | " \n", 378 | " \n", 379 | " \n", 380 | " \n", 381 | " \n", 382 | " \n", 383 | " \n", 384 | " \n", 385 | " \n", 386 | " \n", 387 | " \n", 388 | " \n", 389 | " \n", 390 | " \n", 391 | " \n", 392 | " \n", 393 | " \n", 394 | " \n", 395 | " \n", 396 | " \n", 397 | " \n", 398 | " \n", 399 | " \n", 400 | " \n", 401 | " \n", 402 | " \n", 403 | " \n", 404 | " \n", 405 | " \n", 406 | " \n", 407 | "
文物编号表面风化二氧化硅(SiO2)氧化钠(Na2O)氧化钾(K2O)氧化钙(CaO)氧化镁(MgO)氧化铝(Al2O3)氧化铁(Fe2O3)氧化铜(CuO)氧化铅(PbO)氧化钡(BaO)五氧化二磷(P2O5)氧化锶(SrO)氧化锡(SnO2)二氧化硫(SO2)预测类型Cluster
0A1无风化78.450.00.006.081.867.232.152.110.000.001.060.030.000.51高钾0
1A2风化37.750.00.007.630.002.330.000.0034.300.0014.270.000.000.00铅钡1
2A3无风化31.950.01.367.190.812.937.060.2139.584.692.680.520.000.00铅钡1
3A4无风化35.470.00.792.891.057.076.450.9624.288.318.450.280.000.00铅钡1
4A5风化64.291.20.371.642.3412.750.810.9412.232.160.190.210.490.00铅钡0
5A6风化93.170.01.350.640.211.520.271.730.000.000.210.000.000.00高钾0
6A7风化90.830.00.981.120.005.060.241.170.000.000.130.000.000.11高钾0
7A8无风化51.120.00.230.890.002.120.009.0121.2411.341.460.310.002.26铅钡1
\n", 408 | "
" 409 | ], 410 | "text/plain": [ 411 | " 文物编号 表面风化 二氧化硅(SiO2) 氧化钠(Na2O) 氧化钾(K2O) 氧化钙(CaO) 氧化镁(MgO) 氧化铝(Al2O3) \\\n", 412 | "0 A1 无风化 78.45 0.0 0.00 6.08 1.86 7.23 \n", 413 | "1 A2 风化 37.75 0.0 0.00 7.63 0.00 2.33 \n", 414 | "2 A3 无风化 31.95 0.0 1.36 7.19 0.81 2.93 \n", 415 | "3 A4 无风化 35.47 0.0 0.79 2.89 1.05 7.07 \n", 416 | "4 A5 风化 64.29 1.2 0.37 1.64 2.34 12.75 \n", 417 | "5 A6 风化 93.17 0.0 1.35 0.64 0.21 1.52 \n", 418 | "6 A7 风化 90.83 0.0 0.98 1.12 0.00 5.06 \n", 419 | "7 A8 无风化 51.12 0.0 0.23 0.89 0.00 2.12 \n", 420 | "\n", 421 | " 氧化铁(Fe2O3) 氧化铜(CuO) 氧化铅(PbO) 氧化钡(BaO) 五氧化二磷(P2O5) 氧化锶(SrO) 氧化锡(SnO2) \\\n", 422 | "0 2.15 2.11 0.00 0.00 1.06 0.03 0.00 \n", 423 | "1 0.00 0.00 34.30 0.00 14.27 0.00 0.00 \n", 424 | "2 7.06 0.21 39.58 4.69 2.68 0.52 0.00 \n", 425 | "3 6.45 0.96 24.28 8.31 8.45 0.28 0.00 \n", 426 | "4 0.81 0.94 12.23 2.16 0.19 0.21 0.49 \n", 427 | "5 0.27 1.73 0.00 0.00 0.21 0.00 0.00 \n", 428 | "6 0.24 1.17 0.00 0.00 0.13 0.00 0.00 \n", 429 | "7 0.00 9.01 21.24 11.34 1.46 0.31 0.00 \n", 430 | "\n", 431 | " 二氧化硫(SO2) 预测类型 Cluster \n", 432 | "0 0.51 高钾 0 \n", 433 | "1 0.00 铅钡 1 \n", 434 | "2 0.00 铅钡 1 \n", 435 | "3 0.00 铅钡 1 \n", 436 | "4 0.00 铅钡 0 \n", 437 | "5 0.00 高钾 0 \n", 438 | "6 0.11 高钾 0 \n", 439 | "7 2.26 铅钡 1 " 440 | ] 441 | }, 442 | "execution_count": 2, 443 | "metadata": {}, 444 | "output_type": "execute_result" 445 | } 446 | ], 447 | "source": [ 448 | "from sklearn.cluster import KMeans\n", 449 | "from sklearn.preprocessing import StandardScaler\n", 450 | "\n", 451 | "# 提取数值特征\n", 452 | "numeric_features = new_data.select_dtypes(include=['number'])\n", 453 | "\n", 454 | "# 标准化数据\n", 455 | "scaler = StandardScaler()\n", 456 | "standardized_data = scaler.fit_transform(numeric_features)\n", 457 | "\n", 458 | "# 执行K均值聚类\n", 459 | "kmeans = KMeans(n_clusters=2, random_state=42)\n", 460 | "clusters = kmeans.fit_predict(standardized_data)\n", 461 | "\n", 462 | "# 将聚类结果添加到新数据表中\n", 463 | "new_data['Cluster'] = clusters\n", 464 | "\n", 465 | "# 显示带有聚类结果的前几行数据\n", 466 | "new_data" 467 | ] 468 | }, 469 | { 470 | "cell_type": "code", 471 | "execution_count": null, 472 | "id": "648662d4", 473 | "metadata": {}, 474 | "outputs": [], 475 | "source": [] 476 | } 477 | ], 478 | "metadata": { 479 | "kernelspec": { 480 | "display_name": "Python 3 (ipykernel)", 481 | "language": "python", 482 | "name": "python3" 483 | }, 484 | "language_info": { 485 | "codemirror_mode": { 486 | "name": "ipython", 487 | "version": 3 488 | }, 489 | "file_extension": ".py", 490 | "mimetype": "text/x-python", 491 | "name": "python", 492 | "nbconvert_exporter": "python", 493 | "pygments_lexer": "ipython3", 494 | "version": "3.10.8" 495 | } 496 | }, 497 | "nbformat": 4, 498 | "nbformat_minor": 5 499 | } 500 | -------------------------------------------------------------------------------- /2022国赛C题论文155代码复现/附件.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindowBird/MathModel-with-python/0ac0a57f5dffd4e43a7229442c6d50a1eda80148/2022国赛C题论文155代码复现/附件.xlsx -------------------------------------------------------------------------------- /2023年MathorCup高校数学建模挑战赛赛题/2023年MathorCup高校数学建模挑战赛承诺书(手写或者电子签名后上传).docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindowBird/MathModel-with-python/0ac0a57f5dffd4e43a7229442c6d50a1eda80148/2023年MathorCup高校数学建模挑战赛赛题/2023年MathorCup高校数学建模挑战赛承诺书(手写或者电子签名后上传).docx -------------------------------------------------------------------------------- /2023年MathorCup高校数学建模挑战赛赛题/2023年MathorCup高校数学建模挑战赛提交步骤.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindowBird/MathModel-with-python/0ac0a57f5dffd4e43a7229442c6d50a1eda80148/2023年MathorCup高校数学建模挑战赛赛题/2023年MathorCup高校数学建模挑战赛提交步骤.pdf -------------------------------------------------------------------------------- /2023年MathorCup高校数学建模挑战赛赛题/2023年MathorCup高校数学建模挑战赛论文模板.doc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindowBird/MathModel-with-python/0ac0a57f5dffd4e43a7229442c6d50a1eda80148/2023年MathorCup高校数学建模挑战赛赛题/2023年MathorCup高校数学建模挑战赛论文模板.doc -------------------------------------------------------------------------------- /2023年MathorCup高校数学建模挑战赛赛题/D题/2023年MathorCup高校数学建模挑战赛D题.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindowBird/MathModel-with-python/0ac0a57f5dffd4e43a7229442c6d50a1eda80148/2023年MathorCup高校数学建模挑战赛赛题/D题/2023年MathorCup高校数学建模挑战赛D题.pdf -------------------------------------------------------------------------------- /2023年MathorCup高校数学建模挑战赛赛题/D题/数据处理过程备份 2/特征重要性分析.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "id": "f5b2770d", 7 | "metadata": {}, 8 | "outputs": [ 9 | { 10 | "data": { 11 | "text/html": [ 12 | "
\n", 13 | "\n", 26 | "\n", 27 | " \n", 28 | " \n", 29 | " \n", 30 | " \n", 31 | " \n", 32 | " \n", 33 | " \n", 34 | " \n", 35 | " \n", 36 | " \n", 37 | " \n", 38 | " \n", 39 | " \n", 40 | " \n", 41 | " \n", 42 | " \n", 43 | " \n", 44 | " \n", 45 | " \n", 46 | " \n", 47 | " \n", 48 | " \n", 49 | " \n", 50 | " \n", 51 | " \n", 52 | " \n", 53 | " \n", 54 | " \n", 55 | " \n", 56 | " \n", 57 | " \n", 58 | " \n", 59 | " \n", 60 | " \n", 61 | " \n", 62 | " \n", 63 | " \n", 64 | " \n", 65 | " \n", 66 | " \n", 67 | " \n", 68 | " \n", 69 | " \n", 70 | " \n", 71 | " \n", 72 | " \n", 73 | " \n", 74 | " \n", 75 | " \n", 76 | " \n", 77 | " \n", 78 | " \n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | " \n", 83 | " \n", 84 | " \n", 85 | " \n", 86 | " \n", 87 | " \n", 88 | " \n", 89 | " \n", 90 | " \n", 91 | " \n", 92 | " \n", 93 | " \n", 94 | " \n", 95 | " \n", 96 | " \n", 97 | " \n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | " \n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " \n", 128 | " \n", 129 | " \n", 130 | " \n", 131 | " \n", 132 | " \n", 133 | " \n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " \n", 138 | " \n", 139 | " \n", 140 | " \n", 141 | " \n", 142 | " \n", 143 | " \n", 144 | " \n", 145 | " \n", 146 | " \n", 147 | " \n", 148 | " \n", 149 | " \n", 150 | " \n", 151 | " \n", 152 | " \n", 153 | " \n", 154 | " \n", 155 | " \n", 156 | " \n", 157 | " \n", 158 | " \n", 159 | " \n", 160 | " \n", 161 | " \n", 162 | " \n", 163 | " \n", 164 | " \n", 165 | " \n", 166 | " \n", 167 | " \n", 168 | " \n", 169 | " \n", 170 | " \n", 171 | " \n", 172 | " \n", 173 | " \n", 174 | " \n", 175 | "
ALTITUDE (1013)Inertial Vertical SpeedRADIO ALTCOMPUTED AIR SPDGROUNDSPEEDGEAR SELECT DOWNROLL ATTROLL ATT.1N1 SELTED-LN1 SELTED-R...DEPARTURE_AIRPORT_5DEPARTURE_AIRPORT_68DEPARTURE_AIRPORT_73DEPARTURE_AIRPORT_117DEPARTURE_AIRPORT_118DESTINATION_AIRPORTT_5DESTINATION_AIRPORTT_68DESTINATION_AIRPORTT_73DESTINATION_AIRPORTT_117DESTINATION_AIRPORTT_118
0135-5-830.08.0000.08790.087921.421.4...0100000010
1136-9-830.08.2500.08790.087921.421.5...0100000010
2136-12-830.08.2500.08790.087921.421.5...0100000010
3135-4-830.08.2500.08790.087921.421.5...0100000010
4136-3-830.08.5000.08790.087921.421.5...0100000010
\n", 176 | "

5 rows × 49 columns

\n", 177 | "
" 178 | ], 179 | "text/plain": [ 180 | " ALTITUDE (1013) Inertial Vertical Speed RADIO ALT COMPUTED AIR SPD \\\n", 181 | "0 135 -5 -8 30.0 \n", 182 | "1 136 -9 -8 30.0 \n", 183 | "2 136 -12 -8 30.0 \n", 184 | "3 135 -4 -8 30.0 \n", 185 | "4 136 -3 -8 30.0 \n", 186 | "\n", 187 | " GROUNDSPEED GEAR SELECT DOWN ROLL ATT ROLL ATT.1 N1 SELTED-L \\\n", 188 | "0 8.00 0 0.0879 0.0879 21.4 \n", 189 | "1 8.25 0 0.0879 0.0879 21.4 \n", 190 | "2 8.25 0 0.0879 0.0879 21.4 \n", 191 | "3 8.25 0 0.0879 0.0879 21.4 \n", 192 | "4 8.50 0 0.0879 0.0879 21.4 \n", 193 | "\n", 194 | " N1 SELTED-R ... DEPARTURE_AIRPORT_5 DEPARTURE_AIRPORT_68 \\\n", 195 | "0 21.4 ... 0 1 \n", 196 | "1 21.5 ... 0 1 \n", 197 | "2 21.5 ... 0 1 \n", 198 | "3 21.5 ... 0 1 \n", 199 | "4 21.5 ... 0 1 \n", 200 | "\n", 201 | " DEPARTURE_AIRPORT_73 DEPARTURE_AIRPORT_117 DEPARTURE_AIRPORT_118 \\\n", 202 | "0 0 0 0 \n", 203 | "1 0 0 0 \n", 204 | "2 0 0 0 \n", 205 | "3 0 0 0 \n", 206 | "4 0 0 0 \n", 207 | "\n", 208 | " DESTINATION_AIRPORTT_5 DESTINATION_AIRPORTT_68 DESTINATION_AIRPORTT_73 \\\n", 209 | "0 0 0 0 \n", 210 | "1 0 0 0 \n", 211 | "2 0 0 0 \n", 212 | "3 0 0 0 \n", 213 | "4 0 0 0 \n", 214 | "\n", 215 | " DESTINATION_AIRPORTT_117 DESTINATION_AIRPORTT_118 \n", 216 | "0 1 0 \n", 217 | "1 1 0 \n", 218 | "2 1 0 \n", 219 | "3 1 0 \n", 220 | "4 1 0 \n", 221 | "\n", 222 | "[5 rows x 49 columns]" 223 | ] 224 | }, 225 | "execution_count": 1, 226 | "metadata": {}, 227 | "output_type": "execute_result" 228 | } 229 | ], 230 | "source": [ 231 | "from sklearn.cluster import KMeans\n", 232 | "from sklearn.datasets import make_blobs\n", 233 | "from sklearn.feature_selection import mutual_info_classif\n", 234 | "from sklearn.feature_selection import chi2\n", 235 | "import numpy as np\n", 236 | "import pandas as pd\n", 237 | "\n", 238 | "# 读取 Excel 文件\n", 239 | "df6 = pd.read_excel('D:\\mathercup\\OneData6.xlsx')\n", 240 | "\n", 241 | "# 显示前几行数据+-\n", 242 | "df6.head()" 243 | ] 244 | }, 245 | { 246 | "cell_type": "code", 247 | "execution_count": 2, 248 | "id": "9e1c1fa1", 249 | "metadata": { 250 | "scrolled": true 251 | }, 252 | "outputs": [ 253 | { 254 | "name": "stderr", 255 | "output_type": "stream", 256 | "text": [ 257 | "D:\\py1.1\\envs\\pytorch\\lib\\site-packages\\sklearn\\cluster\\_kmeans.py:870: FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning\n", 258 | " warnings.warn(\n" 259 | ] 260 | }, 261 | { 262 | "data": { 263 | "text/html": [ 264 | "
KMeans(n_clusters=3, random_state=42)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" 265 | ], 266 | "text/plain": [ 267 | "KMeans(n_clusters=3, random_state=42)" 268 | ] 269 | }, 270 | "execution_count": 2, 271 | "metadata": {}, 272 | "output_type": "execute_result" 273 | } 274 | ], 275 | "source": [ 276 | "kmeans = KMeans(n_clusters=3, random_state=42)\n", 277 | "kmeans.fit(df6)" 278 | ] 279 | }, 280 | { 281 | "cell_type": "code", 282 | "execution_count": 3, 283 | "id": "6225ac76", 284 | "metadata": {}, 285 | "outputs": [ 286 | { 287 | "data": { 288 | "text/plain": [ 289 | "array([1, 1, 1, ..., 0, 0, 0])" 290 | ] 291 | }, 292 | "execution_count": 3, 293 | "metadata": {}, 294 | "output_type": "execute_result" 295 | } 296 | ], 297 | "source": [ 298 | "labels = kmeans.labels_\n", 299 | "labels" 300 | ] 301 | }, 302 | { 303 | "cell_type": "code", 304 | "execution_count": 8, 305 | "id": "5947b80e", 306 | "metadata": {}, 307 | "outputs": [], 308 | "source": [ 309 | "mutual_info_scores = mutual_info_classif(df6, labels)" 310 | ] 311 | }, 312 | { 313 | "cell_type": "code", 314 | "execution_count": 16, 315 | "id": "83d8009a", 316 | "metadata": {}, 317 | "outputs": [ 318 | { 319 | "name": "stdout", 320 | "output_type": "stream", 321 | "text": [ 322 | "Feature 0 Mutual Information: 0.6162\n", 323 | "Feature 1 Mutual Information: 0.0917\n", 324 | "Feature 2 Mutual Information: 0.1129\n", 325 | "Feature 3 Mutual Information: 0.3990\n", 326 | "Feature 4 Mutual Information: 0.2289\n", 327 | "Feature 5 Mutual Information: 0.0479\n", 328 | "Feature 6 Mutual Information: 0.0536\n", 329 | "Feature 7 Mutual Information: 0.0581\n", 330 | "Feature 8 Mutual Information: 0.3063\n", 331 | "Feature 9 Mutual Information: 0.3056\n", 332 | "Feature 10 Mutual Information: 0.7034\n", 333 | "Feature 11 Mutual Information: 0.1503\n", 334 | "Feature 12 Mutual Information: 0.0957\n", 335 | "Feature 13 Mutual Information: 0.0423\n", 336 | "Feature 14 Mutual Information: 0.0530\n", 337 | "Feature 15 Mutual Information: 0.4664\n", 338 | "Feature 16 Mutual Information: 0.4658\n", 339 | "Feature 17 Mutual Information: 0.4695\n", 340 | "Feature 18 Mutual Information: 0.4703\n", 341 | "Feature 19 Mutual Information: 0.0338\n", 342 | "Feature 20 Mutual Information: 0.0153\n", 343 | "Feature 21 Mutual Information: 0.0172\n", 344 | "Feature 22 Mutual Information: 1.0772\n", 345 | "Feature 23 Mutual Information: 0.0011\n", 346 | "Feature 24 Mutual Information: 0.0431\n", 347 | "Feature 25 Mutual Information: 0.0382\n", 348 | "Feature 26 Mutual Information: 0.0448\n", 349 | "Feature 27 Mutual Information: 0.1615\n", 350 | "Feature 28 Mutual Information: 0.1609\n", 351 | "Feature 29 Mutual Information: 0.0251\n", 352 | "Feature 30 Mutual Information: 0.3589\n", 353 | "Feature 31 Mutual Information: 0.0243\n", 354 | "Feature 32 Mutual Information: 0.0425\n", 355 | "Feature 33 Mutual Information: 0.0310\n", 356 | "Feature 34 Mutual Information: 0.0538\n", 357 | "Feature 35 Mutual Information: 0.0416\n", 358 | "Feature 36 Mutual Information: 0.1099\n", 359 | "Feature 37 Mutual Information: 0.1582\n", 360 | "Feature 38 Mutual Information: 0.0905\n", 361 | "Feature 39 Mutual Information: 0.0516\n", 362 | "Feature 40 Mutual Information: 0.0154\n", 363 | "Feature 41 Mutual Information: 0.0371\n", 364 | "Feature 42 Mutual Information: 0.0203\n", 365 | "Feature 43 Mutual Information: 0.0160\n", 366 | "Feature 44 Mutual Information: 0.0483\n", 367 | "Feature 45 Mutual Information: 0.0158\n", 368 | "Feature 46 Mutual Information: 0.0324\n", 369 | "Feature 47 Mutual Information: 0.0090\n", 370 | "Feature 48 Mutual Information: 0.0459\n" 371 | ] 372 | } 373 | ], 374 | "source": [ 375 | "for i in range(df6.shape[1]):\n", 376 | " print(\"Feature {} Mutual Information: {:.4f}\".format(i, mutual_info_scores[i]))" 377 | ] 378 | }, 379 | { 380 | "cell_type": "code", 381 | "execution_count": 12, 382 | "id": "e443783a", 383 | "metadata": {}, 384 | "outputs": [ 385 | { 386 | "name": "stdout", 387 | "output_type": "stream", 388 | "text": [ 389 | "Selected Features Indices: [22, 10, 0, 18, 17, 15, 16, 3, 30, 8]\n" 390 | ] 391 | } 392 | ], 393 | "source": [ 394 | "# 排序并选择前10个互信息值最大的特征\n", 395 | "selected_features_indices = sorted(range(df6.shape[1]), key=lambda i: mutual_info_scores[i], reverse=True)[:10]\n", 396 | "\n", 397 | "# 输出选择的特征索引\n", 398 | "print(\"Selected Features Indices: \", selected_features_indices)" 399 | ] 400 | }, 401 | { 402 | "cell_type": "code", 403 | "execution_count": 15, 404 | "id": "2dbac333", 405 | "metadata": {}, 406 | "outputs": [ 407 | { 408 | "name": "stdout", 409 | "output_type": "stream", 410 | "text": [ 411 | "Feature names from file: ['ALTITUDE (1013)', 'Inertial Vertical Speed', 'RADIO ALT', 'COMPUTED AIR SPD', 'GROUNDSPEED', ' GEAR SELECT DOWN', 'ROLL ATT', 'ROLL ATT.1', 'N1 SELTED-L', 'N1 SELTED-R', 'MAGNETIC HEADING', 'WIND DIR(ADIRU)', 'WIND SPD(ADIRU)', 'A/T ENGAGED', 'ANY A/P ENGAGED', 'TRA-L', 'TRA-L.1', 'TRA-R', 'TRA-R.1', 'RUDD POSN', 'PITCH ATT RATE', 'PITCH ATT RATE.1', 'FMF GROSS WEIGHT', 'WOW INDICATE INAIR_STD', 'WOW INDICATE INAIR_MEAN', 'COG NORM ACCEL_STD', 'COG NORM ACCEL_MEAN', 'RMS_LOCALIZER', 'RMS_GLIDESLOPE', 'PITCH ATTL_STD', 'PITCH ATT_MEAN', 'CAP CLM 1 POSN_STD', 'CAP CLM 1 POSN_MEAN', 'CAP WHL 1 POSN_STD', 'CAP WHL 1 POSN_MEAN', 'DATE: DAY_7', 'DATE: DAY_8', 'DATE: DAY_9', 'DATE: DAY_10', 'DEPARTURE_AIRPORT_5', 'DEPARTURE_AIRPORT_68', 'DEPARTURE_AIRPORT_73', 'DEPARTURE_AIRPORT_117', 'DEPARTURE_AIRPORT_118', 'DESTINATION_AIRPORTT_5', 'DESTINATION_AIRPORTT_68', 'DESTINATION_AIRPORTT_73', 'DESTINATION_AIRPORTT_117', 'DESTINATION_AIRPORTT_118']\n" 412 | ] 413 | } 414 | ], 415 | "source": [ 416 | "\n", 417 | "# 获取特征名称列表\n", 418 | "feature_names = df6.columns.tolist()\n", 419 | "print(\"Feature names from file: \", feature_names)\n" 420 | ] 421 | }, 422 | { 423 | "cell_type": "code", 424 | "execution_count": 18, 425 | "id": "b156dddf", 426 | "metadata": {}, 427 | "outputs": [ 428 | { 429 | "data": { 430 | "text/plain": [ 431 | "{'FMF GROSS WEIGHT': 1.0772040072225644,\n", 432 | " 'MAGNETIC HEADING': 0.7033938576718883,\n", 433 | " 'ALTITUDE (1013)': 0.6161810329581932,\n", 434 | " 'TRA-R.1': 0.4702851787321869,\n", 435 | " 'TRA-R': 0.46954438749493677,\n", 436 | " 'TRA-L': 0.4664298446926787,\n", 437 | " 'TRA-L.1': 0.4658418133645956,\n", 438 | " 'COMPUTED AIR SPD': 0.398997384815331,\n", 439 | " 'PITCH ATT_MEAN': 0.3588688236763906,\n", 440 | " 'N1 SELTED-L': 0.30631984567708614}" 441 | ] 442 | }, 443 | "execution_count": 18, 444 | "metadata": {}, 445 | "output_type": "execute_result" 446 | } 447 | ], 448 | "source": [ 449 | "mutual_info_dict = {feature_names[i]: mutual_info_scores[i] for i in selected_features_indices}\n", 450 | "mutual_info_dict" 451 | ] 452 | }, 453 | { 454 | "cell_type": "code", 455 | "execution_count": null, 456 | "id": "9d72e2df", 457 | "metadata": {}, 458 | "outputs": [], 459 | "source": [] 460 | } 461 | ], 462 | "metadata": { 463 | "kernelspec": { 464 | "display_name": "Python 3 (ipykernel)", 465 | "language": "python", 466 | "name": "python3" 467 | }, 468 | "language_info": { 469 | "codemirror_mode": { 470 | "name": "ipython", 471 | "version": 3 472 | }, 473 | "file_extension": ".py", 474 | "mimetype": "text/x-python", 475 | "name": "python", 476 | "nbconvert_exporter": "python", 477 | "pygments_lexer": "ipython3", 478 | "version": "3.10.8" 479 | } 480 | }, 481 | "nbformat": 4, 482 | "nbformat_minor": 5 483 | } 484 | -------------------------------------------------------------------------------- /2023年MathorCup高校数学建模挑战赛赛题/D题/第三题思路及其代码/TwoData2.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "id": "0319a55f", 7 | "metadata": { 8 | "scrolled": false 9 | }, 10 | "outputs": [ 11 | { 12 | "data": { 13 | "text/html": [ 14 | "
\n", 15 | "\n", 28 | "\n", 29 | " \n", 30 | " \n", 31 | " \n", 32 | " \n", 33 | " \n", 34 | " \n", 35 | " \n", 36 | " \n", 37 | " \n", 38 | " \n", 39 | " \n", 40 | " \n", 41 | " \n", 42 | " \n", 43 | " \n", 44 | " \n", 45 | " \n", 46 | " \n", 47 | " \n", 48 | " \n", 49 | " \n", 50 | " \n", 51 | " \n", 52 | " \n", 53 | " \n", 54 | " \n", 55 | " \n", 56 | " \n", 57 | " \n", 58 | " \n", 59 | " \n", 60 | " \n", 61 | " \n", 62 | " \n", 63 | " \n", 64 | " \n", 65 | " \n", 66 | " \n", 67 | " \n", 68 | " \n", 69 | " \n", 70 | " \n", 71 | " \n", 72 | " \n", 73 | " \n", 74 | " \n", 75 | " \n", 76 | " \n", 77 | " \n", 78 | " \n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | " \n", 83 | " \n", 84 | " \n", 85 | " \n", 86 | " \n", 87 | " \n", 88 | " \n", 89 | " \n", 90 | " \n", 91 | " \n", 92 | " \n", 93 | " \n", 94 | " \n", 95 | " \n", 96 | " \n", 97 | " \n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | " \n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " \n", 128 | " \n", 129 | " \n", 130 | " \n", 131 | " \n", 132 | " \n", 133 | " \n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " \n", 138 | " \n", 139 | " \n", 140 | " \n", 141 | " \n", 142 | " \n", 143 | " \n", 144 | " \n", 145 | " \n", 146 | " \n", 147 | " \n", 148 | " \n", 149 | " \n", 150 | " \n", 151 | " \n", 152 | " \n", 153 | " \n", 154 | " \n", 155 | " \n", 156 | " \n", 157 | " \n", 158 | " \n", 159 | " \n", 160 | " \n", 161 | " \n", 162 | " \n", 163 | " \n", 164 | " \n", 165 | " \n", 166 | " \n", 167 | " \n", 168 | " \n", 169 | " \n", 170 | " \n", 171 | " \n", 172 | " \n", 173 | " \n", 174 | " \n", 175 | " \n", 176 | " \n", 177 | "
EVENT_NAME(超限名称)ARN(机号)_100号机ARN(机号)_101号机ARN(机号)_102号机ARN(机号)_103号机ARN(机号)_104号机ARN(机号)_105号机ARN(机号)_106号机ARN(机号)_107号机ARN(机号)_108号机...DEP(起飞机场)_109DEP(起飞机场)_110DEP(起飞机场)_111DEP(起飞机场)_112DEP(起飞机场)_113DEP(起飞机场)_114DEP(起飞机场)_115DEP(起飞机场)_116ALERT(警告级别)_2ALERT(警告级别)_3
050英尺至接地距离远000000000...0000000010
150英尺至接地距离远000000000...0000000010
2GPWS警告(sink rate)000000000...0000000001
3下降率大400-50ft000000000...0000000010
450英尺至接地距离远000000000...0000000001
\n", 178 | "

5 rows × 380 columns

\n", 179 | "
" 180 | ], 181 | "text/plain": [ 182 | " EVENT_NAME(超限名称) ARN(机号)_100号机 ARN(机号)_101号机 ARN(机号)_102号机 \\\n", 183 | "0 50英尺至接地距离远 0 0 0 \n", 184 | "1 50英尺至接地距离远 0 0 0 \n", 185 | "2 GPWS警告(sink rate) 0 0 0 \n", 186 | "3 下降率大400-50ft 0 0 0 \n", 187 | "4 50英尺至接地距离远 0 0 0 \n", 188 | "\n", 189 | " ARN(机号)_103号机 ARN(机号)_104号机 ARN(机号)_105号机 ARN(机号)_106号机 ARN(机号)_107号机 \\\n", 190 | "0 0 0 0 0 0 \n", 191 | "1 0 0 0 0 0 \n", 192 | "2 0 0 0 0 0 \n", 193 | "3 0 0 0 0 0 \n", 194 | "4 0 0 0 0 0 \n", 195 | "\n", 196 | " ARN(机号)_108号机 ... DEP(起飞机场)_109 DEP(起飞机场)_110 DEP(起飞机场)_111 \\\n", 197 | "0 0 ... 0 0 0 \n", 198 | "1 0 ... 0 0 0 \n", 199 | "2 0 ... 0 0 0 \n", 200 | "3 0 ... 0 0 0 \n", 201 | "4 0 ... 0 0 0 \n", 202 | "\n", 203 | " DEP(起飞机场)_112 DEP(起飞机场)_113 DEP(起飞机场)_114 DEP(起飞机场)_115 DEP(起飞机场)_116 \\\n", 204 | "0 0 0 0 0 0 \n", 205 | "1 0 0 0 0 0 \n", 206 | "2 0 0 0 0 0 \n", 207 | "3 0 0 0 0 0 \n", 208 | "4 0 0 0 0 0 \n", 209 | "\n", 210 | " ALERT(警告级别)_2 ALERT(警告级别)_3 \n", 211 | "0 1 0 \n", 212 | "1 1 0 \n", 213 | "2 0 1 \n", 214 | "3 1 0 \n", 215 | "4 0 1 \n", 216 | "\n", 217 | "[5 rows x 380 columns]" 218 | ] 219 | }, 220 | "execution_count": 1, 221 | "metadata": {}, 222 | "output_type": "execute_result" 223 | } 224 | ], 225 | "source": [ 226 | "import pandas as pd\n", 227 | "\n", 228 | "# 读取 Excel 文件\n", 229 | "df = pd.read_excel('D:\\mathercup\\TwoData2.xlsx')\n", 230 | "\n", 231 | "# 显示前几行数据+-\n", 232 | "df.head()" 233 | ] 234 | }, 235 | { 236 | "cell_type": "code", 237 | "execution_count": 2, 238 | "id": "479505c2", 239 | "metadata": {}, 240 | "outputs": [], 241 | "source": [ 242 | "data=df" 243 | ] 244 | }, 245 | { 246 | "cell_type": "code", 247 | "execution_count": 10, 248 | "id": "4e3f0444", 249 | "metadata": {}, 250 | "outputs": [ 251 | { 252 | "data": { 253 | "text/html": [ 254 | "
\n", 255 | "\n", 268 | "\n", 269 | " \n", 270 | " \n", 271 | " \n", 272 | " \n", 273 | " \n", 274 | " \n", 275 | " \n", 276 | " \n", 277 | " \n", 278 | " \n", 279 | " \n", 280 | " \n", 281 | " \n", 282 | " \n", 283 | " \n", 284 | " \n", 285 | " \n", 286 | " \n", 287 | " \n", 288 | " \n", 289 | " \n", 290 | " \n", 291 | " \n", 292 | " \n", 293 | " \n", 294 | " \n", 295 | " \n", 296 | " \n", 297 | " \n", 298 | " \n", 299 | " \n", 300 | " \n", 301 | " \n", 302 | " \n", 303 | " \n", 304 | " \n", 305 | " \n", 306 | " \n", 307 | " \n", 308 | " \n", 309 | " \n", 310 | " \n", 311 | " \n", 312 | " \n", 313 | " \n", 314 | " \n", 315 | " \n", 316 | " \n", 317 | " \n", 318 | " \n", 319 | " \n", 320 | " \n", 321 | " \n", 322 | " \n", 323 | " \n", 324 | " \n", 325 | " \n", 326 | " \n", 327 | " \n", 328 | " \n", 329 | " \n", 330 | " \n", 331 | " \n", 332 | " \n", 333 | " \n", 334 | " \n", 335 | " \n", 336 | " \n", 337 | " \n", 338 | " \n", 339 | " \n", 340 | " \n", 341 | " \n", 342 | " \n", 343 | " \n", 344 | " \n", 345 | " \n", 346 | " \n", 347 | " \n", 348 | " \n", 349 | " \n", 350 | " \n", 351 | " \n", 352 | " \n", 353 | " \n", 354 | " \n", 355 | " \n", 356 | " \n", 357 | " \n", 358 | " \n", 359 | " \n", 360 | " \n", 361 | " \n", 362 | " \n", 363 | " \n", 364 | " \n", 365 | " \n", 366 | " \n", 367 | " \n", 368 | " \n", 369 | " \n", 370 | " \n", 371 | " \n", 372 | " \n", 373 | " \n", 374 | " \n", 375 | " \n", 376 | " \n", 377 | " \n", 378 | " \n", 379 | " \n", 380 | " \n", 381 | " \n", 382 | " \n", 383 | " \n", 384 | " \n", 385 | " \n", 386 | " \n", 387 | " \n", 388 | " \n", 389 | " \n", 390 | " \n", 391 | " \n", 392 | " \n", 393 | " \n", 394 | " \n", 395 | " \n", 396 | " \n", 397 | " \n", 398 | " \n", 399 | " \n", 400 | " \n", 401 | " \n", 402 | " \n", 403 | " \n", 404 | " \n", 405 | " \n", 406 | " \n", 407 | " \n", 408 | " \n", 409 | " \n", 410 | " \n", 411 | " \n", 412 | " \n", 413 | " \n", 414 | " \n", 415 | " \n", 416 | " \n", 417 | " \n", 418 | " \n", 419 | " \n", 420 | " \n", 421 | " \n", 422 | " \n", 423 | " \n", 424 | " \n", 425 | " \n", 426 | " \n", 427 | " \n", 428 | " \n", 429 | " \n", 430 | " \n", 431 | " \n", 432 | " \n", 433 | " \n", 434 | " \n", 435 | " \n", 436 | " \n", 437 | " \n", 438 | " \n", 439 | " \n", 440 | " \n", 441 | " \n", 442 | " \n", 443 | " \n", 444 | " \n", 445 | " \n", 446 | " \n", 447 | " \n", 448 | " \n", 449 | " \n", 450 | " \n", 451 | " \n", 452 | " \n", 453 | " \n", 454 | " \n", 455 | " \n", 456 | " \n", 457 | " \n", 458 | " \n", 459 | " \n", 460 | " \n", 461 | " \n", 462 | " \n", 463 | " \n", 464 | " \n", 465 | " \n", 466 | " \n", 467 | " \n", 468 | " \n", 469 | " \n", 470 | " \n", 471 | " \n", 472 | " \n", 473 | " \n", 474 | " \n", 475 | " \n", 476 | " \n", 477 | " \n", 478 | " \n", 479 | " \n", 480 | " \n", 481 | " \n", 482 | " \n", 483 | " \n", 484 | " \n", 485 | " \n", 486 | " \n", 487 | " \n", 488 | " \n", 489 | " \n", 490 | " \n", 491 | " \n", 492 | " \n", 493 | " \n", 494 | " \n", 495 | " \n", 496 | " \n", 497 | " \n", 498 | " \n", 499 | " \n", 500 | " \n", 501 | " \n", 502 | " \n", 503 | " \n", 504 | " \n", 505 | " \n", 506 | " \n", 507 | " \n", 508 | " \n", 509 | " \n", 510 | " \n", 511 | " \n", 512 | " \n", 513 | " \n", 514 | " \n", 515 | " \n", 516 | " \n", 517 | " \n", 518 | " \n", 519 | " \n", 520 | " \n", 521 | " \n", 522 | " \n", 523 | " \n", 524 | " \n", 525 | " \n", 526 | " \n", 527 | " \n", 528 | " \n", 529 | " \n", 530 | " \n", 531 | " \n", 532 | " \n", 533 | " \n", 534 | " \n", 535 | " \n", 536 | " \n", 537 | " \n", 538 | " \n", 539 | " \n", 540 | " \n", 541 | " \n", 542 | " \n", 543 | " \n", 544 | " \n", 545 | " \n", 546 | " \n", 547 | " \n", 548 | " \n", 549 | " \n", 550 | " \n", 551 | " \n", 552 | " \n", 553 | " \n", 554 | " \n", 555 | " \n", 556 | " \n", 557 | " \n", 558 | " \n", 559 | " \n", 560 | " \n", 561 | "
EVENT_NAME(超限名称)ARN(机号)_100号机ARN(机号)_101号机ARN(机号)_102号机ARN(机号)_103号机ARN(机号)_104号机ARN(机号)_105号机ARN(机号)_106号机ARN(机号)_107号机ARN(机号)_108号机...DEP(起飞机场)_107DEP(起飞机场)_108DEP(起飞机场)_109DEP(起飞机场)_110DEP(起飞机场)_111DEP(起飞机场)_112DEP(起飞机场)_113DEP(起飞机场)_114DEP(起飞机场)_115DEP(起飞机场)_116
050英尺至接地距离远000000000...0000000000
150英尺至接地距离远000000000...0000000000
2GPWS警告(sink rate)000000000...0000000000
3下降率大400-50ft000000000...0000000000
450英尺至接地距离远000000000...0000000000
..................................................................
44098爬升速度大35-1000ft000000000...0000000010
44099爬升速度大35-1000ft000000000...0000000010
44100爬升速度大35-1000ft000000000...0000000010
4410150英尺至接地距离远000000000...0000000001
44102接地速度小000000000...0000000001
\n", 562 | "

44103 rows × 378 columns

\n", 563 | "
" 564 | ], 565 | "text/plain": [ 566 | " EVENT_NAME(超限名称) ARN(机号)_100号机 ARN(机号)_101号机 ARN(机号)_102号机 \\\n", 567 | "0 50英尺至接地距离远 0 0 0 \n", 568 | "1 50英尺至接地距离远 0 0 0 \n", 569 | "2 GPWS警告(sink rate) 0 0 0 \n", 570 | "3 下降率大400-50ft 0 0 0 \n", 571 | "4 50英尺至接地距离远 0 0 0 \n", 572 | "... ... ... ... ... \n", 573 | "44098 爬升速度大35-1000ft 0 0 0 \n", 574 | "44099 爬升速度大35-1000ft 0 0 0 \n", 575 | "44100 爬升速度大35-1000ft 0 0 0 \n", 576 | "44101 50英尺至接地距离远 0 0 0 \n", 577 | "44102 接地速度小 0 0 0 \n", 578 | "\n", 579 | " ARN(机号)_103号机 ARN(机号)_104号机 ARN(机号)_105号机 ARN(机号)_106号机 \\\n", 580 | "0 0 0 0 0 \n", 581 | "1 0 0 0 0 \n", 582 | "2 0 0 0 0 \n", 583 | "3 0 0 0 0 \n", 584 | "4 0 0 0 0 \n", 585 | "... ... ... ... ... \n", 586 | "44098 0 0 0 0 \n", 587 | "44099 0 0 0 0 \n", 588 | "44100 0 0 0 0 \n", 589 | "44101 0 0 0 0 \n", 590 | "44102 0 0 0 0 \n", 591 | "\n", 592 | " ARN(机号)_107号机 ARN(机号)_108号机 ... DEP(起飞机场)_107 DEP(起飞机场)_108 \\\n", 593 | "0 0 0 ... 0 0 \n", 594 | "1 0 0 ... 0 0 \n", 595 | "2 0 0 ... 0 0 \n", 596 | "3 0 0 ... 0 0 \n", 597 | "4 0 0 ... 0 0 \n", 598 | "... ... ... ... ... ... \n", 599 | "44098 0 0 ... 0 0 \n", 600 | "44099 0 0 ... 0 0 \n", 601 | "44100 0 0 ... 0 0 \n", 602 | "44101 0 0 ... 0 0 \n", 603 | "44102 0 0 ... 0 0 \n", 604 | "\n", 605 | " DEP(起飞机场)_109 DEP(起飞机场)_110 DEP(起飞机场)_111 DEP(起飞机场)_112 \\\n", 606 | "0 0 0 0 0 \n", 607 | "1 0 0 0 0 \n", 608 | "2 0 0 0 0 \n", 609 | "3 0 0 0 0 \n", 610 | "4 0 0 0 0 \n", 611 | "... ... ... ... ... \n", 612 | "44098 0 0 0 0 \n", 613 | "44099 0 0 0 0 \n", 614 | "44100 0 0 0 0 \n", 615 | "44101 0 0 0 0 \n", 616 | "44102 0 0 0 0 \n", 617 | "\n", 618 | " DEP(起飞机场)_113 DEP(起飞机场)_114 DEP(起飞机场)_115 DEP(起飞机场)_116 \n", 619 | "0 0 0 0 0 \n", 620 | "1 0 0 0 0 \n", 621 | "2 0 0 0 0 \n", 622 | "3 0 0 0 0 \n", 623 | "4 0 0 0 0 \n", 624 | "... ... ... ... ... \n", 625 | "44098 0 0 1 0 \n", 626 | "44099 0 0 1 0 \n", 627 | "44100 0 0 1 0 \n", 628 | "44101 0 0 0 1 \n", 629 | "44102 0 0 0 1 \n", 630 | "\n", 631 | "[44103 rows x 378 columns]" 632 | ] 633 | }, 634 | "execution_count": 10, 635 | "metadata": {}, 636 | "output_type": "execute_result" 637 | } 638 | ], 639 | "source": [ 640 | "data=data.drop(columns=['ALERT(警告级别)_2', 'ALERT(警告级别)_3'])\n", 641 | "data" 642 | ] 643 | }, 644 | { 645 | "cell_type": "code", 646 | "execution_count": 20, 647 | "id": "298792d7", 648 | "metadata": {}, 649 | "outputs": [ 650 | { 651 | "name": "stdout", 652 | "output_type": "stream", 653 | "text": [ 654 | "标签\t\t前三列名称\n", 655 | "50英尺至接地距离近\t\tDEP(起飞机场)_46, ARR(目的机场)_76, ARR(目的机场)_24\n", 656 | "50英尺至接地距离远\t\tARR(目的机场)_107, ARR(目的机场)_53, ARR(目的机场)_13\n", 657 | "GPWS警告(sink rate)\t\tDEP(起飞机场)_1, ARR(目的机场)_76, ARR(目的机场)_24\n", 658 | "GPWS警告(windshear)\t\tDEP(起飞机场)_22, ARR(目的机场)_24, ARR(目的机场)_76\n", 659 | "High normal accel with flap (in flight)\t\tARN(机号)_48号机, ARN(机号)_6号机, DEP(起飞机场)_113\n", 660 | "Left of centreline below 1000ft\t\t月份_201506, 月份_201507, 月份_201606\n", 661 | "TCAS RA 警告\t\tDEP(起飞机场)_93, ARR(目的机场)_76, ARR(目的机场)_24\n", 662 | "下滑道警告\t\tARN(机号)_68号机, ARN(机号)_91号机, DEP(起飞机场)_113\n", 663 | "下降率大1000-400(含)ft\t\tARR(目的机场)_65, ARR(目的机场)_36, DEP(起飞机场)_113\n", 664 | "下降率大2000-1000(含)ft\t\tDEP(起飞机场)_23, ARR(目的机场)_76, ARR(目的机场)_24\n", 665 | "下降率大400-50ft\t\tDEP(起飞机场)_60, ARR(目的机场)_76, ARR(目的机场)_24\n", 666 | "低于下滑道\t\tARN(机号)_32号机, ARN(机号)_47号机, ARN(机号)_98号机\n", 667 | "低空大速度2500ft以下\t\t月份_201505, 月份_201502, 月份_201602\n", 668 | "坡度大400/1500ft以上\t\tARR(目的机场)_95, ARR(目的机场)_49, DEP(起飞机场)_113\n", 669 | "复飞\t\t月份_201609, 月份_201608, 月份_201611\n", 670 | "抬前轮速度大\t\tDEP(起飞机场)_83, ARR(目的机场)_76, ARR(目的机场)_24\n", 671 | "抬前轮速度小\t\t月份_201507, 月份_201604, 月份_201508\n", 672 | "抬头速率大\t\t月份_201607, 月份_201602, DEP(起飞机场)_113\n", 673 | "抬头速率小\t\tDEP(起飞机场)_114, ARR(目的机场)_24, ARR(目的机场)_76\n", 674 | "接地速度小\t\t月份_201507, 月份_201501, 月份_201505\n", 675 | "收反推晚\t\tARR(目的机场)_107, ARR(目的机场)_65, DEP(起飞机场)_113\n", 676 | "放起落架晚\t\tDEP(起飞机场)_6, ARR(目的机场)_24, ARR(目的机场)_76\n", 677 | "未知\t\tARR(目的机场)_20, ARR(目的机场)_76, ARR(目的机场)_24\n", 678 | "爬升坡度大35-400(含)ft\t\t月份_201609, 月份_201608, 月份_201507\n", 679 | "爬升速度大35-1000ft\t\tARN(机号)_65号机, ARN(机号)_64号机, DEP(起飞机场)_113\n", 680 | "爬升速度小35-1000ft\t\tARR(目的机场)_98, ARR(目的机场)_91, DEP(起飞机场)_113\n", 681 | "直线滑行速度大\t\tARR(目的机场)_17, ARR(目的机场)_76, ARR(目的机场)_24\n", 682 | "着陆俯仰角大\t\tARR(目的机场)_103, ARR(目的机场)_88, DEP(起飞机场)_113\n", 683 | "着陆俯仰角小\t\tPHASE(飞行阶段)_6, PHASE(飞行阶段)_5, PHASE(飞行阶段)_0\n", 684 | "着陆垂直载荷大\t\tDEP(起飞机场)_49, ARR(目的机场)_76, ARR(目的机场)_24\n", 685 | "着陆襟翼到位晚\t\tDEP(起飞机场)_91, ARR(目的机场)_24, ARR(目的机场)_76\n", 686 | "着陆重、跳着陆\t\tDEP(起飞机场)_45, ARR(目的机场)_24, ARR(目的机场)_76\n", 687 | "离地仰角大\t\tPHASE(飞行阶段)_2, PHASE(飞行阶段)_4, PHASE(飞行阶段)_3\n", 688 | "离地速度大\t\tARR(目的机场)_63, ARR(目的机场)_101, DEP(起飞机场)_113\n", 689 | "离地速度小\t\tDEP(起飞机场)_105, ARR(目的机场)_24, ARR(目的机场)_76\n", 690 | "空中过载\t\tARR(目的机场)_30, ARR(目的机场)_9, DEP(起飞机场)_113\n", 691 | "起飞EGT超限\t\tDEP(起飞机场)_50, ARR(目的机场)_24, ARR(目的机场)_76\n", 692 | "起飞坡度大0-35(含)ft\t\tDEP(起飞机场)_91, ARR(目的机场)_24, ARR(目的机场)_76\n", 693 | "起飞收起落架晚\t\tPHASE(飞行阶段)_7, PHASE(飞行阶段)_3, PHASE(飞行阶段)_0\n", 694 | "起飞滑跑方向不稳定\t\tARR(目的机场)_108, ARR(目的机场)_36, ARR(目的机场)_13\n", 695 | "超襟翼限制速度Vfe\t\tDEP(起飞机场)_51, ARR(目的机场)_24, ARR(目的机场)_76\n", 696 | "转弯滑行速度大\t\tARN(机号)_80号机, ARN(机号)_111号机, ARN(机号)_31号机\n", 697 | "进近坡度大1500-500(含)ft\t\tDEP(起飞机场)_63, ARR(目的机场)_76, ARR(目的机场)_24\n", 698 | "进近坡度大200-50(含)ft\t\tDEP(起飞机场)_101, ARR(目的机场)_76, ARR(目的机场)_24\n", 699 | "进近坡度大500-200(含)ft\t\tARR(目的机场)_56, ARR(目的机场)_76, ARR(目的机场)_24\n", 700 | "进近坡度大50ft以下\t\tDEP(起飞机场)_48, ARR(目的机场)_76, ARR(目的机场)_24\n", 701 | "进近速度大50 ft以下\t\tARN(机号)_63号机, ARN(机号)_83号机, DEP(起飞机场)_113\n", 702 | "进近速度大500-50(含)ft\t\tARR(目的机场)_21, ARR(目的机场)_17, ARR(目的机场)_109\n", 703 | "进近速度小500 ft以下\t\t月份_201509, 月份_201505, DEP(起飞机场)_113\n", 704 | "高于下滑道\t\tDEP(起飞机场)_31, ARR(目的机场)_24, ARR(目的机场)_76\n" 705 | ] 706 | } 707 | ], 708 | "source": [ 709 | "import pandas as pd\n", 710 | "from sklearn.linear_model import LinearRegression\n", 711 | "\n", 712 | "\n", 713 | "# 对标签列进行独热编码\n", 714 | "labels = data.iloc[:, 0]\n", 715 | "labels_encoded = pd.get_dummies(labels)\n", 716 | "\n", 717 | "# 提取其他 n 列数据作为特征\n", 718 | "n = data.shape[1] - 1 # 计算特征列数\n", 719 | "features = data.iloc[:, 1:] # 提取特征数据\n", 720 | "\n", 721 | "# 执行多元线性回归\n", 722 | "mdl = LinearRegression()\n", 723 | "mdl.fit(features, labels_encoded) # 使用 LinearRegression 进行多元线性回归\n", 724 | "\n", 725 | "# 提取回归模型的回归系数\n", 726 | "coefs = mdl.coef_\n", 727 | "\n", 728 | "# 初始化存储结果的字典\n", 729 | "top5_cols = {}\n", 730 | "\n", 731 | "# 遍历每个标签,找出对应的前三列影响最大的因子\n", 732 | "for i, label in enumerate(labels_encoded.columns):\n", 733 | " idx = coefs[i].argsort()[-3:] # 找出最大的三个系数的索引\n", 734 | "''' \n", 735 | " 这段代码使用了 NumPy 库中的 argpartition 函数来找出一个一维数组中绝对值最大的五个数值对应的索引。\n", 736 | "具体解析如下:\n", 737 | "\n", 738 | "coefs[i]:表示一维数组 coefs 中的第 i 个元素,其中 coefs 可能是一个二维数组,i 表示其中的某一行。\n", 739 | "np.abs(coefs[i]):表示取 coefs[i] 中各元素的绝对值,得到一个与 coefs[i] 相同大小的新数组。\n", 740 | "np.argpartition(np.abs(coefs[i]), -5):表示对绝对值数组进行分区操作,将绝对值最大的五个数值的索引放在数组的末尾,这里使用了 -5 表示倒数第五个位置。\n", 741 | "[-5:]:表示取分区后数组末尾的五个索引,即绝对值最大的五个系数的索引。\n", 742 | "最终,idx 变量将保存绝对值最大的五个系数在 coefs[i] 中对应的索引,用于后续的处理。\n", 743 | "'''\n", 744 | " top5_cols[label] = features.columns[idx] # 存储对应的列名称\n", 745 | "\n", 746 | "# 输出结果\n", 747 | "print('标签\\t\\t前三列名称')\n", 748 | "for label, cols in top5_cols.items():\n", 749 | " print(f'{label}\\t\\t{\", \".join(cols)}')\n" 750 | ] 751 | }, 752 | { 753 | "cell_type": "code", 754 | "execution_count": 21, 755 | "id": "8cb1f9ca", 756 | "metadata": {}, 757 | "outputs": [ 758 | { 759 | "name": "stdout", 760 | "output_type": "stream", 761 | "text": [ 762 | "标签\t\t前三列名称\n", 763 | "50英尺至接地距离近\t\tDEP(起飞机场)_46, ARN(机号)_33号机, ARR(目的机场)_109\n", 764 | "50英尺至接地距离远\t\tARN(机号)_90号机, ARN(机号)_24号机, PHASE(飞行阶段)_6\n", 765 | "GPWS警告(sink rate)\t\tARN(机号)_9号机, ARR(目的机场)_54, ARR(目的机场)_65\n", 766 | "GPWS警告(windshear)\t\tARR(目的机场)_74, DEP(起飞机场)_106, DEP(起飞机场)_22\n", 767 | "High normal accel with flap (in flight)\t\tARR(目的机场)_4, DEP(起飞机场)_19, ARN(机号)_6号机\n", 768 | "Left of centreline below 1000ft\t\t月份_201606, ARR(目的机场)_16, ARN(机号)_3号机\n", 769 | "TCAS RA 警告\t\t月份_201608, ARR(目的机场)_78, ARN(机号)_82号机\n", 770 | "下滑道警告\t\tARN(机号)_68号机, ARN(机号)_91号机, ARR(目的机场)_95\n", 771 | "下降率大1000-400(含)ft\t\tARR(目的机场)_69, ARR(目的机场)_65, ARR(目的机场)_36\n", 772 | "下降率大2000-1000(含)ft\t\tARR(目的机场)_64, PHASE(飞行阶段)_5, ARR(目的机场)_84\n", 773 | "下降率大400-50ft\t\tARN(机号)_11号机, ARN(机号)_31号机, PHASE(飞行阶段)_5\n", 774 | "低于下滑道\t\tDEP(起飞机场)_72, ARR(目的机场)_80, PHASE(飞行阶段)_5\n", 775 | "低空大速度2500ft以下\t\tARN(机号)_90号机, ARR(目的机场)_67, ARN(机号)_94号机\n", 776 | "坡度大400/1500ft以上\t\tARN(机号)_55号机, ARN(机号)_36号机, ARR(目的机场)_49\n", 777 | "复飞\t\tARR(目的机场)_93, ARN(机号)_95号机, ARN(机号)_107号机\n", 778 | "抬前轮速度大\t\tARN(机号)_28号机, ARR(目的机场)_101, PHASE(飞行阶段)_2\n", 779 | "抬前轮速度小\t\tARR(目的机场)_98, ARR(目的机场)_44, PHASE(飞行阶段)_2\n", 780 | "抬头速率大\t\tDEP(起飞机场)_16, ARN(机号)_69号机, PHASE(飞行阶段)_2\n", 781 | "抬头速率小\t\tARN(机号)_84号机, ARN(机号)_77号机, PHASE(飞行阶段)_0\n", 782 | "接地速度小\t\tARR(目的机场)_9, DEP(起飞机场)_24, PHASE(飞行阶段)_6\n", 783 | "收反推晚\t\tARR(目的机场)_107, ARR(目的机场)_65, PHASE(飞行阶段)_7\n", 784 | "放起落架晚\t\tARR(目的机场)_4, DEP(起飞机场)_6, ARR(目的机场)_22\n", 785 | "未知\t\tARN(机号)_97号机, ARN(机号)_22号机, PHASE(飞行阶段)_0\n", 786 | "爬升坡度大35-400(含)ft\t\t月份_201507, ARN(机号)_18号机, ARR(目的机场)_99\n", 787 | "爬升速度大35-1000ft\t\tARR(目的机场)_66, DEP(起飞机场)_115, PHASE(飞行阶段)_4\n", 788 | "爬升速度小35-1000ft\t\tARR(目的机场)_30, ARR(目的机场)_98, ARR(目的机场)_91\n", 789 | "直线滑行速度大\t\tDEP(起飞机场)_49, ARN(机号)_95号机, PHASE(飞行阶段)_1\n", 790 | "着陆俯仰角大\t\tARR(目的机场)_88, DEP(起飞机场)_83, PHASE(飞行阶段)_7\n", 791 | "着陆俯仰角小\t\tARR(目的机场)_31, ARR(目的机场)_91, ARR(目的机场)_25\n", 792 | "着陆垂直载荷大\t\tARR(目的机场)_75, ARR(目的机场)_82, PHASE(飞行阶段)_7\n", 793 | "着陆襟翼到位晚\t\tARN(机号)_68号机, ARR(目的机场)_101, ARR(目的机场)_96\n", 794 | "着陆重、跳着陆\t\tDEP(起飞机场)_45, PHASE(飞行阶段)_7, ARN(机号)_108号机\n", 795 | "离地仰角大\t\tARN(机号)_82号机, ARN(机号)_97号机, ARN(机号)_57号机\n", 796 | "离地速度大\t\tARR(目的机场)_101, ARR(目的机场)_63, PHASE(飞行阶段)_3\n", 797 | "离地速度小\t\tARR(目的机场)_99, ARN(机号)_84号机, PHASE(飞行阶段)_3\n", 798 | "空中过载\t\tDEP(起飞机场)_84, DEP(起飞机场)_48, ARR(目的机场)_9\n", 799 | "起飞EGT超限\t\tARN(机号)_49号机, DEP(起飞机场)_50, ARR(目的机场)_4\n", 800 | "起飞坡度大0-35(含)ft\t\tARR(目的机场)_46, ARN(机号)_84号机, ARN(机号)_111号机\n", 801 | "起飞收起落架晚\t\tDEP(起飞机场)_43, PHASE(飞行阶段)_0, ARN(机号)_93号机\n", 802 | "起飞滑跑方向不稳定\t\tARN(机号)_60号机, PHASE(飞行阶段)_2, DEP(起飞机场)_108\n", 803 | "超襟翼限制速度Vfe\t\tARR(目的机场)_23, ARN(机号)_66号机, ARN(机号)_9号机\n", 804 | "转弯滑行速度大\t\tDEP(起飞机场)_1, ARR(目的机场)_83, PHASE(飞行阶段)_1\n", 805 | "进近坡度大1500-500(含)ft\t\tARN(机号)_85号机, ARR(目的机场)_104, ARR(目的机场)_21\n", 806 | "进近坡度大200-50(含)ft\t\tARR(目的机场)_67, ARN(机号)_104号机, ARR(目的机场)_31\n", 807 | "进近坡度大500-200(含)ft\t\tARR(目的机场)_69, ARR(目的机场)_54, ARR(目的机场)_56\n", 808 | "进近坡度大50ft以下\t\tARN(机号)_79号机, ARR(目的机场)_25, PHASE(飞行阶段)_5\n", 809 | "进近速度大50 ft以下\t\tARN(机号)_83号机, ARN(机号)_63号机, PHASE(飞行阶段)_5\n", 810 | "进近速度大500-50(含)ft\t\tDEP(起飞机场)_71, ARR(目的机场)_109, ARN(机号)_118号机\n", 811 | "进近速度小500 ft以下\t\t月份_201505, ARN(机号)_42号机, DEP(起飞机场)_86\n", 812 | "高于下滑道\t\tPHASE(飞行阶段)_0, ARN(机号)_27号机, ARR(目的机场)_87\n" 813 | ] 814 | } 815 | ], 816 | "source": [ 817 | "import pandas as pd\n", 818 | "from sklearn.linear_model import Ridge\n", 819 | "\n", 820 | "# 对标签列进行独热编码\n", 821 | "labels = data.iloc[:, 0]\n", 822 | "labels_encoded = pd.get_dummies(labels)\n", 823 | "\n", 824 | "# 提取其他 n 列数据作为特征\n", 825 | "n = data.shape[1] - 1 # 计算特征列数\n", 826 | "features = data.iloc[:, 1:] # 提取特征数据\n", 827 | "\n", 828 | "# 执行岭回归\n", 829 | "alpha = 1.0 # 设置岭回归的超参数 alpha\n", 830 | "mdl = Ridge(alpha=alpha)\n", 831 | "mdl.fit(features, labels_encoded) # 使用 Ridge 进行岭回归\n", 832 | "\n", 833 | "# 提取回归模型的回归系数\n", 834 | "coefs = mdl.coef_\n", 835 | "\n", 836 | "# 初始化存储结果的字典\n", 837 | "top5_cols = {}\n", 838 | "\n", 839 | "# 遍历每个标签,找出对应的前三列影响最大的因子\n", 840 | "for i, label in enumerate(labels_encoded.columns):\n", 841 | " idx = coefs[i].argsort()[-3:] # 找出最大的三个系数的索引\n", 842 | " top5_cols[label] = features.columns[idx] # 存储对应的列名称\n", 843 | "\n", 844 | "# 输出结果\n", 845 | "print('标签\\t\\t前三列名称')\n", 846 | "for label, cols in top5_cols.items():\n", 847 | " print(f'{label}\\t\\t{\", \".join(cols)}')\n" 848 | ] 849 | }, 850 | { 851 | "cell_type": "code", 852 | "execution_count": 22, 853 | "id": "65b16b5e", 854 | "metadata": {}, 855 | "outputs": [ 856 | { 857 | "name": "stdout", 858 | "output_type": "stream", 859 | "text": [ 860 | "岭回归模型的每折交叉验证的均方误差,平均均方误差\n", 861 | "Mean Squared Error for each fold: [0.00798278 0.00807174 0.00807823 0.00803226 0.00817225]\n", 862 | "Mean Squared Error (MSE): 0.00806745195165686\n" 863 | ] 864 | } 865 | ], 866 | "source": [ 867 | "from sklearn.model_selection import train_test_split, cross_val_score\n", 868 | "from sklearn.linear_model import Ridge\n", 869 | "\n", 870 | "X=features\n", 871 | "y=labels_encoded\n", 872 | "# 将数据集划分为训练集和测试集\n", 873 | "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n", 874 | "\n", 875 | "# 创建岭回归模型\n", 876 | "ridge_model = Ridge(alpha=1.0)\n", 877 | "\n", 878 | "# 训练岭回归模型\n", 879 | "ridge_model.fit(X_train, y_train)\n", 880 | "\n", 881 | "# 使用交叉验证对模型进行评估\n", 882 | "cv_scores = cross_val_score(ridge_model, X_train, y_train, cv=5, scoring='neg_mean_squared_error')\n", 883 | "\n", 884 | "# 将负均方误差转换为正值\n", 885 | "mse_scores = -cv_scores\n", 886 | "print(\"岭回归模型的每折交叉验证的均方误差,平均均方误差\")\n", 887 | "# 输出每折交叉验证的均方误差\n", 888 | "print(\"Mean Squared Error for each fold:\", mse_scores)\n", 889 | "\n", 890 | "# 输出平均均方误差\n", 891 | "print(\"Mean Squared Error (MSE):\", mse_scores.mean())\n" 892 | ] 893 | }, 894 | { 895 | "cell_type": "code", 896 | "execution_count": 23, 897 | "id": "b6b95855", 898 | "metadata": {}, 899 | "outputs": [ 900 | { 901 | "name": "stdout", 902 | "output_type": "stream", 903 | "text": [ 904 | "线性回归模型的每折交叉验证的均方误差,平均均方误差\n", 905 | "Mean Squared Error for each fold: [1.85519468e+20 8.12605321e+19 1.27686951e+16 3.69909206e+18\n", 906 | " 2.24166621e+19]\n", 907 | "Mean Squared Error (MSE): 5.8581704657836474e+19\n" 908 | ] 909 | } 910 | ], 911 | "source": [ 912 | "import pandas as pd\n", 913 | "from sklearn.model_selection import train_test_split\n", 914 | "from sklearn.linear_model import LinearRegression\n", 915 | "from sklearn.model_selection import cross_val_score\n", 916 | "from sklearn.metrics import mean_squared_error\n", 917 | "\n", 918 | "\n", 919 | "X=features\n", 920 | "y=labels_encoded\n", 921 | "\n", 922 | "# 划分训练集和测试集\n", 923 | "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n", 924 | "\n", 925 | "# 创建线性回归模型\n", 926 | "lr_model = LinearRegression()\n", 927 | "\n", 928 | "# 在训练集上拟合线性回归模型\n", 929 | "lr_model.fit(X_train, y_train)\n", 930 | "\n", 931 | "# 进行5折交叉验证,计算均方误差\n", 932 | "mse_scores = -cross_val_score(lr_model, X_train, y_train, cv=5, scoring='neg_mean_squared_error')\n", 933 | "print(\"线性回归模型的每折交叉验证的均方误差,平均均方误差\")\n", 934 | "# 输出每折交叉验证的均方误差\n", 935 | "print(\"Mean Squared Error for each fold:\", mse_scores)\n", 936 | "\n", 937 | "# 计算平均均方误差\n", 938 | "mse_mean = mse_scores.mean()\n", 939 | "print(\"Mean Squared Error (MSE):\", mse_mean)\n" 940 | ] 941 | }, 942 | { 943 | "cell_type": "code", 944 | "execution_count": null, 945 | "id": "b5562c9b", 946 | "metadata": {}, 947 | "outputs": [], 948 | "source": [] 949 | } 950 | ], 951 | "metadata": { 952 | "kernelspec": { 953 | "display_name": "Python 3 (ipykernel)", 954 | "language": "python", 955 | "name": "python3" 956 | }, 957 | "language_info": { 958 | "codemirror_mode": { 959 | "name": "ipython", 960 | "version": 3 961 | }, 962 | "file_extension": ".py", 963 | "mimetype": "text/x-python", 964 | "name": "python", 965 | "nbconvert_exporter": "python", 966 | "pygments_lexer": "ipython3", 967 | "version": "3.10.8" 968 | } 969 | }, 970 | "nbformat": 4, 971 | "nbformat_minor": 5 972 | } 973 | -------------------------------------------------------------------------------- /2023年MathorCup高校数学建模挑战赛赛题/D题/第三题思路及其代码/第三题思路说明.txt: -------------------------------------------------------------------------------- 1 | 实现思路和流程如下: 2 | 3 | 数据加载:使用Pandas库加载附件2的数据,得到一个包含所有数据的DataFrame。 4 | 数据预处理:对数据进行清洗和处理,包括处理缺失值、将非数值列进行独热编码、提取特征等。 5 | 特征工程:通过对数据的探索性分析,提取和分析不同超限的基本特征,如航线、机场等。 6 | 模型训练:使用岭回归算法对处理后的数据进行建模,并于线性回归模型做了比较。岭回归是一种正则化线性回归方法,可以在处理多重共线性问题时有效。可以使用Scikit-learn库中的Ridge模型进行训练。 7 | 模型评估:使用交叉验证等方法对模型进行评估,评估模型的性能和预测效果。 8 | 结果解释:根据训练得到的模型参数和特征重要性,对不同超限的基本特征进行解释和分析,得出结论。 9 | 10 | 11 | 12 | 使用岭回归相对于线性回归的优点包括: 13 | 14 | 解决多重共线性问题:岭回归通过引入正则化项,可以有效处理数据中存在的多重共线性问题,避免模型过于依赖某个特征,提高模型的稳定性和可靠性。 15 | 控制模型复杂度:岭回归通过正则化项控制模型的复杂度,可以防止过拟合,提高模型的泛化能力。 16 | 对异常值具有鲁棒性:岭回归对异常值的影响较小,能够在存在少量异常值的情况下依然获得较好的拟合效果。 17 | 可调节的超参数:岭回归通过调节超参数(正则化强度)来控制模型的拟合效果,可以根据实际情况进行调优。 18 | 通过以上实现思路和使用岭回归的方法,可以对附件2中的数据进行分析,研究不同超限的基本特征,如航线、机场等,并得出结论。同时,独热编码和岭回归方法可以在处理非数值列和解决多重共线性问题时提供有效的解决方案,从而得到更稳定和可靠的分析结果。 19 | 20 | 21 | 线性回归结果和岭回归的结果相比孰优孰劣: 22 | 23 | 根据给出的结果,线性回归的均方误差(MSE)明显较大,为5.8581704657836474e+19,而岭回归的均方误差(MSE)较小,为0.00806745195165686。因此,从评估指标MSE的角度来看,岭回归模型在这个数据集上的表现更好,因为其均方误差较小。 24 | 25 | MSE是评估模型预测效果的一种常用指标,其值越小表示模型预测效果越好。在这里,线性回归模型的MSE值较大,说明模型在训练集上的预测效果较差,可能存在过拟合的情况。而岭回归模型的MSE值较小,说明模型在训练集上的预测效果较好,相对来说更具有泛化能力,可以更好地应对新数据的预测。因此,从MSE指标来看,岭回归模型优于线性回归模型。 -------------------------------------------------------------------------------- /2023年MathorCup高校数学建模挑战赛赛题/D题/第二题数据处理/Joystick_Position_Trend_Analysis.mlx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindowBird/MathModel-with-python/0ac0a57f5dffd4e43a7229442c6d50a1eda80148/2023年MathorCup高校数学建模挑战赛赛题/D题/第二题数据处理/Joystick_Position_Trend_Analysis.mlx -------------------------------------------------------------------------------- /2023年MathorCup高校数学建模挑战赛赛题/D题/第二题数据处理/操纵杆位置趋势分析代码.txt: -------------------------------------------------------------------------------- 1 | % 提取杆量数据 2 | stick_position = OneData(:, 1:5); % 操纵杆位置数据,假设在第1列到第5列 3 | 4 | % 滑动窗口参数 5 | window_size = 5; % 滑动窗口大小,表示每秒记录的次数 6 | stride = 1; % 滑动窗口的步长 7 | 8 | % 初始化趋势线系数矩阵 9 | order = 1; % 多项式拟合的阶数,这里选择1表示线性拟合 10 | coeffs = zeros(order + 1, size(stick_position, 2)); % 初始化系数矩阵 11 | 12 | % 滑动窗口趋势分析 13 | for i = 1:size(stick_position, 2) 14 | for j = 1:stride:(size(stick_position, 1) - window_size + 1) 15 | window_data = stick_position(j:(j + window_size - 1), i); % 提取滑动窗口内的数据 16 | time = (j:(j + window_size - 1)) / window_size; % 时间,假设每秒记录5次 17 | coeffs(:, i) = coeffs(:, i) + polyfit(time, window_data, order)'; % 对滑动窗口内的数据进行多项式拟合并累加系数 18 | end 19 | coeffs(:, i) = coeffs(:, i) / ((size(stick_position, 1) - window_size + 1) / stride); % 求平均系数 20 | end 21 | 22 | % 数据可视化 23 | figure; 24 | plot(stick_position); 25 | xlabel('样本索引'); 26 | ylabel('操纵杆位置'); 27 | title('操纵杆位置趋势分析'); 28 | 29 | % 绘制趋势线 30 | hold on; 31 | for i = 1:size(stick_position, 2) 32 | time = (1:size(stick_position, 1)) / window_size; % 计算时间 33 | y_fit = polyval(coeffs(:, i), time); % 计算拟合后的值 34 | plot(time, y_fit, 'r'); % 绘制趋势线 35 | end 36 | legend('杆量1', '杆量2', '杆量3', '杆量4', '杆量5', '趋势线'); -------------------------------------------------------------------------------- /2023年MathorCup高校数学建模挑战赛赛题/D题/第二题数据处理/问题2.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindowBird/MathModel-with-python/0ac0a57f5dffd4e43a7229442c6d50a1eda80148/2023年MathorCup高校数学建模挑战赛赛题/D题/第二题数据处理/问题2.docx -------------------------------------------------------------------------------- /2023年MathorCup高校数学建模挑战赛赛题/D题/论文.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindowBird/MathModel-with-python/0ac0a57f5dffd4e43a7229442c6d50a1eda80148/2023年MathorCup高校数学建模挑战赛赛题/D题/论文.pdf -------------------------------------------------------------------------------- /2023年MathorCup高校数学建模挑战赛赛题/D题/附件/附件1-2关键参数航段数据的字段说明.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindowBird/MathModel-with-python/0ac0a57f5dffd4e43a7229442c6d50a1eda80148/2023年MathorCup高校数学建模挑战赛赛题/D题/附件/附件1-2关键参数航段数据的字段说明.xlsx -------------------------------------------------------------------------------- /2023年MathorCup高校数学建模挑战赛赛题/D题/附件/附件2:超限数据.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindowBird/MathModel-with-python/0ac0a57f5dffd4e43a7229442c6d50a1eda80148/2023年MathorCup高校数学建模挑战赛赛题/D题/附件/附件2:超限数据.xlsx -------------------------------------------------------------------------------- /2023年MathorCup高校数学建模挑战赛赛题/D题/附件/附件3 飞行参数测量数据/附件3:飞行参数测量数据.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindowBird/MathModel-with-python/0ac0a57f5dffd4e43a7229442c6d50a1eda80148/2023年MathorCup高校数学建模挑战赛赛题/D题/附件/附件3 飞行参数测量数据/附件3:飞行参数测量数据.xlsx -------------------------------------------------------------------------------- /2023年MathorCup高校数学建模挑战赛赛题/D题/附件/附件3 飞行参数测量数据/飞行参数测量数据的字段说明.xls: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindowBird/MathModel-with-python/0ac0a57f5dffd4e43a7229442c6d50a1eda80148/2023年MathorCup高校数学建模挑战赛赛题/D题/附件/附件3 飞行参数测量数据/飞行参数测量数据的字段说明.xls -------------------------------------------------------------------------------- /2023年MathorCup高校数学建模挑战赛赛题/第十三届MathorCup高校数学建模挑战赛论文格式及提交规范.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WindowBird/MathModel-with-python/0ac0a57f5dffd4e43a7229442c6d50a1eda80148/2023年MathorCup高校数学建模挑战赛赛题/第十三届MathorCup高校数学建模挑战赛论文格式及提交规范.pdf -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ### Hi there 👋 2 | 数学建模python备战数据库 3 | 仅做数据分析类题目 4 | 5 | 6 | 7 | - 🔭 I’m currently working on 复现往年国赛论文中的数据,图表 8 | - [2022国赛C题论文复现](https://github.com/WindowBird/MathModel-with-python/tree/a524059d85a514793ff3dfccea017e4b913560ea/C%E9%A2%98) 9 | 10 | - 🌱 I’m currently learning 数学建模 11 | - [数学建模算法实现](https://github.com/WindowBird/MathModel-with-python/tree/e5efea19de5948718b1f9d19e014ec76c212fc73/1a%E6%95%B0%E5%AD%A6%E5%BB%BA%E6%A8%A1%E5%9B%BD%E8%B5%9B%E7%AE%97%E6%B3%95%E5%BA%93) 12 | - 🤔 竞赛经历 13 | - [2022mothercupD题三等奖](https://github.com/WindowBird/MathModel-with-python/tree/d4b974008024290fa61f411da0abbe03b06d9963/2023%E5%B9%B4MathorCup%E9%AB%98%E6%A0%A1%E6%95%B0%E5%AD%A6%E5%BB%BA%E6%A8%A1%E6%8C%91%E6%88%98%E8%B5%9B%E8%B5%9B%E9%A2%98) 14 | - [2023数学建模国赛C题代码实现](https://github.com/WindowBird/MathModel-with-python/tree/main/2023%E6%95%B0%E5%AD%A6%E5%BB%BA%E6%A8%A1c%E9%A2%98) 15 | - 💬 Ask me about ... 16 | - 📫 How to reach me: ... 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /数学建模国赛算法库/供给地与需求地的最优资源分配问题.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "id": "99e2997f", 7 | "metadata": {}, 8 | "outputs": [ 9 | { 10 | "name": "stdout", 11 | "output_type": "stream", 12 | "text": [ 13 | "资源分配方案:\n", 14 | "[[ 3. 5. 0. 7. 0. 1.]\n", 15 | " [ 0. 0. 4. 0. 6. 10.]]\n", 16 | "最小距离与资源运载量之积: 135.28154179067644\n" 17 | ] 18 | } 19 | ], 20 | "source": [ 21 | "import numpy as np\n", 22 | "from scipy.optimize import linprog\n", 23 | "\n", 24 | "def distance(point1, point2):\n", 25 | " # 计算两点之间的距离,这里可以根据实际情况选择合适的距离计算方法\n", 26 | " return np.sqrt((point1[0] - point2[0])**2 + (point1[1] - point2[1])**2)\n", 27 | "\n", 28 | "def resource_allocation_optimization(ci, dj, supply_locations, demand_locations):\n", 29 | " n = len(ci) # 供给地数目\n", 30 | " m = len(dj) # 需求地数目\n", 31 | "\n", 32 | " # 构建目标函数系数向量 c\n", 33 | " c = np.zeros(n * m)\n", 34 | " for i, supply_loc in enumerate(supply_locations):\n", 35 | " for j, demand_loc in enumerate(demand_locations):\n", 36 | " c[i*m + j] = distance(supply_loc, demand_loc)\n", 37 | "\n", 38 | " # 构建等式约束矩阵 A_eq 和右侧常数向量 b_eq\n", 39 | " A_eq = np.zeros((m, n*m))\n", 40 | " b_eq = dj\n", 41 | " for i in range(m):\n", 42 | " A_eq[i, i::m] = 1\n", 43 | "\n", 44 | " # 构建不等式约束矩阵 A_ub 和右侧常数向量 b_ub\n", 45 | " A_ub = np.zeros((n, n*m))\n", 46 | " b_ub = ci\n", 47 | " for i in range(n):\n", 48 | " A_ub[i, i*m:(i+1)*m] = 1\n", 49 | "\n", 50 | " # 定义变量的上下界\n", 51 | " bounds = [(0, None) for _ in range(n*m)]\n", 52 | "\n", 53 | " # 使用线性规划求解问题\n", 54 | " result = linprog(c, A_eq=A_eq, b_eq=b_eq, A_ub=A_ub, b_ub=b_ub, bounds=bounds)\n", 55 | "\n", 56 | " # 输出结果\n", 57 | " xij = result.x.reshape(n, m)\n", 58 | " total_cost = result.fun\n", 59 | "\n", 60 | " return xij, total_cost\n", 61 | "\n", 62 | "# 示例输入数据\n", 63 | "ci = np.array([20,20]) # 供给地的资源量\n", 64 | "dj = np.array([3,5,4,7,6,11]) # 需求地的资源需求量\n", 65 | "supply_locations = [(5,1), (2,7)] # 供给地的地理位置\n", 66 | "demand_locations = [(1.25,1.25),(8.75,0.75),(0.5,4.75),(5.75,5),(3,6.5),(7.25,7.25)] # 需求地的地理位置\n", 67 | "\n", 68 | "# 求解资源分配问题\n", 69 | "xij, total_cost = resource_allocation_optimization(ci, dj, supply_locations, demand_locations)\n", 70 | "\n", 71 | "print(\"资源分配方案:\")\n", 72 | "print(xij)\n", 73 | "print(\"最小距离与资源运载量之积:\", total_cost)\n" 74 | ] 75 | }, 76 | { 77 | "cell_type": "code", 78 | "execution_count": 2, 79 | "id": "95f10cf2", 80 | "metadata": {}, 81 | "outputs": [ 82 | { 83 | "name": "stdout", 84 | "output_type": "stream", 85 | "text": [ 86 | "最优解: [3.00000000e+00 5.00000000e+00 4.00000000e+00 7.00000000e+00\n", 87 | " 1.00000000e+00 3.33429701e-15 8.63389187e-16 5.83928713e-16\n", 88 | " 1.22840006e-14 8.27021532e-16 5.00000000e+00 1.10000000e+01\n", 89 | " 5.69415991e+00 4.92569771e+00 7.24999995e+00 7.74999997e+00]\n", 90 | "最小成本: 89.88348555736768\n" 91 | ] 92 | } 93 | ], 94 | "source": [ 95 | "#更改供给地位置,对资源分配进行进一步优化\n", 96 | "import numpy as np\n", 97 | "from scipy.optimize import minimize\n", 98 | "\n", 99 | "def nsd(x):\n", 100 | " a = np.array([1.25, 8.75, 0.5, 5.75, 3, 7.25])\n", 101 | " b = np.array([1.25, 0.75, 4.75, 5, 6.5, 7.75])\n", 102 | " #s = np.zeros(12)\n", 103 | " f1 = sum([np.sqrt((x[12] - a[i])**2 + (x[13] - b[i])**2) * x[i] for i in range(6)])\n", 104 | " f2 = sum([np.sqrt((x[14] - a[i])**2 + (x[15] - b[i])**2) * x[i+6] for i in range(6)])\n", 105 | " return f1 + f2\n", 106 | "\n", 107 | "x0 = np.array([3, 5, 0, 7, 0, 1, 0, 0, 4, 0, 6, 10, 5, 1, 2, 7])\n", 108 | "bounds = [(0, None)]*12 + [(None, None)]*4\n", 109 | "\n", 110 | "A = np.array([[1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n", 111 | " [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0]])\n", 112 | "\n", 113 | "B = np.array([20, 20])\n", 114 | "\n", 115 | "Aeq = np.zeros((6, 16))\n", 116 | "for i in range(6):\n", 117 | " Aeq[i, i] = 1\n", 118 | " Aeq[i, i+6] = 1\n", 119 | "\n", 120 | "beq = np.array([3, 5, 4, 7, 6, 11])\n", 121 | "\n", 122 | "constraints = [{'type': 'eq', 'fun': lambda x, i=i : Aeq[i] @ x - beq[i]} for i in range(Aeq.shape[0])]\n", 123 | "constraints += [{'type': 'ineq', 'fun': lambda x, i=i : B[i] - A[i] @ x} for i in range(A.shape[0])]\n", 124 | "\n", 125 | "res = minimize(nsd, x0, bounds=bounds, constraints=constraints)\n", 126 | "\n", 127 | "print('最优解:', res.x)\n", 128 | "print('最小成本:', res.fun)" 129 | ] 130 | }, 131 | { 132 | "cell_type": "code", 133 | "execution_count": null, 134 | "id": "8cda0368", 135 | "metadata": {}, 136 | "outputs": [], 137 | "source": [] 138 | } 139 | ], 140 | "metadata": { 141 | "kernelspec": { 142 | "display_name": "Python 3 (ipykernel)", 143 | "language": "python", 144 | "name": "python3" 145 | }, 146 | "language_info": { 147 | "codemirror_mode": { 148 | "name": "ipython", 149 | "version": 3 150 | }, 151 | "file_extension": ".py", 152 | "mimetype": "text/x-python", 153 | "name": "python", 154 | "nbconvert_exporter": "python", 155 | "pygments_lexer": "ipython3", 156 | "version": "3.10.8" 157 | } 158 | }, 159 | "nbformat": 4, 160 | "nbformat_minor": 5 161 | } 162 | -------------------------------------------------------------------------------- /数学建模国赛算法库/分支定界算法求解整数规划.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": null, 6 | "id": "4890e981", 7 | "metadata": {}, 8 | "outputs": [], 9 | "source": [ 10 | "#我们可以先使用线性规划方法求解整数规划问题的松弛线性规划问题,\n", 11 | "#然后根据线性规划的结果来确定整数规划问题的整数变量的上下界,\n", 12 | "#再使用分支定界法进行求解整数规划问题。下面是完整的函数实现:" 13 | ] 14 | }, 15 | { 16 | "cell_type": "code", 17 | "execution_count": 1, 18 | "id": "31cbd36a", 19 | "metadata": {}, 20 | "outputs": [ 21 | { 22 | "name": "stdout", 23 | "output_type": "stream", 24 | "text": [ 25 | "最优目标函数值: -9.0\n", 26 | "最优解: [3. 1.]\n" 27 | ] 28 | } 29 | ], 30 | "source": [ 31 | "from scipy.optimize import linprog\n", 32 | "\n", 33 | "def branch_and_bound_integer_programming(c, A, b, integer_indices):\n", 34 | " \"\"\"\n", 35 | " 分支定界法求解整数规划问题\n", 36 | "\n", 37 | " 参数:\n", 38 | " c (list): 目标函数的系数向量\n", 39 | " A (list): 约束条件的系数矩阵\n", 40 | " b (list): 约束条件的右侧常数向量\n", 41 | " integer_indices (list): 整数变量的索引列表\n", 42 | "\n", 43 | " 返回:\n", 44 | " best_objective (float): 最优目标函数值\n", 45 | " best_solution (list): 最优解,即使没有找到整数解,也返回一个最接近整数解的非整数解\n", 46 | " \"\"\"\n", 47 | " def integer_solution(x):\n", 48 | " return all(abs(x[i] - round(x[i])) < 1e-6 for i in integer_indices)\n", 49 | "\n", 50 | " def branch_and_bound(c, A, b, integer_indices, integer_bounds, current_objective, current_solution):\n", 51 | " nonlocal best_objective, best_solution\n", 52 | "\n", 53 | " # 判断是否为整数解\n", 54 | " if integer_solution(current_solution):\n", 55 | " # 更新最优解\n", 56 | " if current_objective > best_objective:\n", 57 | " best_objective = current_objective\n", 58 | " best_solution = current_solution\n", 59 | " return\n", 60 | "\n", 61 | " # 选择一个整数变量进行分支\n", 62 | " branch_index = None\n", 63 | " for idx in integer_indices:\n", 64 | " if abs(current_solution[idx] - round(current_solution[idx])) >= 1e-6:\n", 65 | " branch_index = idx\n", 66 | " break\n", 67 | "\n", 68 | " # 如果所有整数变量都已经是整数解,则说明问题无解\n", 69 | " if branch_index is None:\n", 70 | " return\n", 71 | "\n", 72 | " # 对当前分支变量的两个取值进行递归分支\n", 73 | " lower_bound, upper_bound = integer_bounds[branch_index]\n", 74 | " branch_value = round(current_solution[branch_index])\n", 75 | "\n", 76 | " # 分支:当前分支变量取下界\n", 77 | " A_branch = A.copy()\n", 78 | " b_branch = b.copy()\n", 79 | " A_branch.append([0] * len(c))\n", 80 | " A_branch[-1][branch_index] = 1\n", 81 | " b_branch.append(lower_bound)\n", 82 | " lp_result = linprog(c, A_ub=A_branch, b_ub=b_branch)\n", 83 | " if lp_result.success and lp_result.fun > best_objective:\n", 84 | " branch_and_bound(c, A_branch, b_branch, integer_indices, integer_bounds,\n", 85 | " lp_result.fun, lp_result.x)\n", 86 | "\n", 87 | " # 分支:当前分支变量取上界\n", 88 | " A_branch = A.copy()\n", 89 | " b_branch = b.copy()\n", 90 | " A_branch.append([0] * len(c))\n", 91 | " A_branch[-1][branch_index] = -1\n", 92 | " b_branch.append(-upper_bound)\n", 93 | " lp_result = linprog(c, A_ub=A_branch, b_ub=b_branch)\n", 94 | " if lp_result.success and lp_result.fun > best_objective:\n", 95 | " branch_and_bound(c, A_branch, b_branch, integer_indices, integer_bounds,\n", 96 | " lp_result.fun, lp_result.x)\n", 97 | "\n", 98 | " best_objective = float('-inf')\n", 99 | " best_solution = None\n", 100 | "\n", 101 | " # 先使用线性规划方法求解整数规划问题的松弛线性规划问题\n", 102 | " lp_result = linprog(c, A_ub=A, b_ub=b)\n", 103 | " if lp_result.success:\n", 104 | " # 根据线性规划结果来确定整数规划问题的整数变量的上下界\n", 105 | " integer_bounds = [(int(lp_result.x[i]), int(lp_result.x[i])) if i in integer_indices else (0, None) for i in range(len(c))]\n", 106 | "\n", 107 | " # 使用分支定界法求解整数规划问题\n", 108 | " branch_and_bound(c, A, b, integer_indices, integer_bounds, lp_result.fun, lp_result.x)\n", 109 | "\n", 110 | " return best_objective, best_solution\n", 111 | "\n", 112 | "# 测试例子\n", 113 | "c = [-2, -3]\n", 114 | "A = [[3, 2], [1, 4]]\n", 115 | "b = [12, 8]\n", 116 | "integer_indices = [0, 1]\n", 117 | "\n", 118 | "# 使用分支定界法求解整数规划问题\n", 119 | "best_objective, best_solution = branch_and_bound_integer_programming(c, A, b, integer_indices)\n", 120 | "\n", 121 | "print(\"最优目标函数值:\", best_objective)\n", 122 | "print(\"最优解:\", best_solution)" 123 | ] 124 | }, 125 | { 126 | "cell_type": "code", 127 | "execution_count": null, 128 | "id": "4fe1b414", 129 | "metadata": {}, 130 | "outputs": [], 131 | "source": [] 132 | } 133 | ], 134 | "metadata": { 135 | "kernelspec": { 136 | "display_name": "Python 3 (ipykernel)", 137 | "language": "python", 138 | "name": "python3" 139 | }, 140 | "language_info": { 141 | "codemirror_mode": { 142 | "name": "ipython", 143 | "version": 3 144 | }, 145 | "file_extension": ".py", 146 | "mimetype": "text/x-python", 147 | "name": "python", 148 | "nbconvert_exporter": "python", 149 | "pygments_lexer": "ipython3", 150 | "version": "3.10.8" 151 | } 152 | }, 153 | "nbformat": 4, 154 | "nbformat_minor": 5 155 | } 156 | -------------------------------------------------------------------------------- /数学建模国赛算法库/匈牙利算法求解整数规划.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "id": "7e6a7caa", 7 | "metadata": {}, 8 | "outputs": [ 9 | { 10 | "name": "stdout", 11 | "output_type": "stream", 12 | "text": [ 13 | "最优指派方案: [(1, 0), (0, 1), (2, 2)]\n" 14 | ] 15 | } 16 | ], 17 | "source": [ 18 | "def hungarian_algorithm(cost_matrix):\n", 19 | " \"\"\"\n", 20 | " 使用匈牙利算法解决指派问题\n", 21 | "\n", 22 | " 参数:\n", 23 | " cost_matrix (list of lists): 成本矩阵,表示指派每个任务到每个工人的成本\n", 24 | "\n", 25 | " 返回:\n", 26 | " assignments (list of tuples): 最优指派方案,每个元组表示一个指派 (worker, task)\n", 27 | " \"\"\"\n", 28 | " rows = len(cost_matrix)\n", 29 | " cols = len(cost_matrix[0])\n", 30 | "\n", 31 | " def find_assignment(worker):\n", 32 | " for task in range(cols):\n", 33 | " if not assigned[task] and cost_matrix[worker][task] == 0:\n", 34 | " assigned[task] = True\n", 35 | " if worker_matches[task] is None or find_assignment(worker_matches[task]):\n", 36 | " worker_matches[task] = worker\n", 37 | " return True\n", 38 | " return False\n", 39 | "\n", 40 | " # 在每一行中找到最小成本并将其减去,使得每一行都有至少一个零元素\n", 41 | " for i in range(rows):\n", 42 | " min_cost = min(cost_matrix[i])\n", 43 | " for j in range(cols):\n", 44 | " cost_matrix[i][j] -= min_cost\n", 45 | "\n", 46 | " # 在每一列中找到最小成本并将其减去,使得每一列都有至少一个零元素\n", 47 | " for j in range(cols):\n", 48 | " min_cost = min(cost_matrix[i][j] for i in range(rows))\n", 49 | " for i in range(rows):\n", 50 | " cost_matrix[i][j] -= min_cost\n", 51 | "\n", 52 | " assigned = [False] * cols\n", 53 | " worker_matches = [None] * cols\n", 54 | "\n", 55 | " for worker in range(rows):\n", 56 | " assigned = [False] * cols\n", 57 | " find_assignment(worker)\n", 58 | "\n", 59 | " assignments = [(worker_matches[task], task) for task in range(cols) if worker_matches[task] is not None]\n", 60 | " return assignments\n", 61 | "\n", 62 | "# 示例\n", 63 | "cost_matrix = [\n", 64 | " [9, 11, 14],\n", 65 | " [6, 15, 13],\n", 66 | " [12, 13, 8]\n", 67 | "]\n", 68 | "\n", 69 | "assignments = hungarian_algorithm(cost_matrix)\n", 70 | "print(\"最优指派方案:\", assignments)\n", 71 | "\n" 72 | ] 73 | }, 74 | { 75 | "cell_type": "code", 76 | "execution_count": null, 77 | "id": "e707e4e4", 78 | "metadata": {}, 79 | "outputs": [], 80 | "source": [] 81 | } 82 | ], 83 | "metadata": { 84 | "kernelspec": { 85 | "display_name": "Python 3 (ipykernel)", 86 | "language": "python", 87 | "name": "python3" 88 | }, 89 | "language_info": { 90 | "codemirror_mode": { 91 | "name": "ipython", 92 | "version": 3 93 | }, 94 | "file_extension": ".py", 95 | "mimetype": "text/x-python", 96 | "name": "python", 97 | "nbconvert_exporter": "python", 98 | "pygments_lexer": "ipython3", 99 | "version": "3.10.8" 100 | } 101 | }, 102 | "nbformat": 4, 103 | "nbformat_minor": 5 104 | } 105 | -------------------------------------------------------------------------------- /数学建模国赛算法库/回归算法.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 3, 6 | "id": "bfe51a8f", 7 | "metadata": {}, 8 | "outputs": [ 9 | { 10 | "ename": "SyntaxError", 11 | "evalue": "unterminated string literal (detected at line 1) (3865750220.py, line 1)", 12 | "output_type": "error", 13 | "traceback": [ 14 | "\u001b[1;36m Cell \u001b[1;32mIn [3], line 1\u001b[1;36m\u001b[0m\n\u001b[1;33m '回归分析和插值都是根据已知数据进行预测的方法,但它们之间存在一些关键区别:()\u001b[0m\n\u001b[1;37m ^\u001b[0m\n\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m unterminated string literal (detected at line 1)\n" 15 | ] 16 | } 17 | ], 18 | "source": [ 19 | "/'回归分析和插值都是根据已知数据进行预测的方法,但它们之间存在一些关键区别:\n", 20 | "\n", 21 | "回归分析:\n", 22 | "\n", 23 | "回归分析是一种统计方法,旨在了解两种或多种变量之间的关系。最常见的类型是线性回归,\n", 24 | "它试图找到一条直线最好地描述两个变量之间的关系。\n", 25 | "回归分析对数据中的噪声和异常值有一定的鲁棒性,因为它不是精确地通过每个数据点,\n", 26 | "而是试图找到一条最适合所有数据点的线或曲线。\n", 27 | "回归分析可以用于外推(预测范围在已知数据范围之外的点)。\n", 28 | "插值:\n", 29 | "\n", 30 | "插值是一种数学方法,用于在已知数据点之间估计新的数据点。插值算法会精确地通过每个已知数据点。\n", 31 | "插值对数据中的噪声和异常值非常敏感,因为它会精确地通过每个数据点,如果数据点有噪声或异常值,\n", 32 | "插值的结果也可能有大的偏差。\n", 33 | "插值主要用于内插(预测范围在已知数据范围之内的点),如果用于外推,可能会导致不准确的结果。\n", 34 | "综上所述,选择回归分析还是插值主要取决于你的应用场景。如果你的数据可能包含噪声或异常值,\n", 35 | "并且你对预测范围在已知数据范围之外的点感兴趣,\n", 36 | "那么回归分析可能是一个更好的选择。如果你的数据非常准确,并且你只对预测范围在已知数据范围之内的点感兴趣,\n", 37 | "那么插值可能是一个更好的选择。''/" 38 | ] 39 | }, 40 | { 41 | "cell_type": "code", 42 | "execution_count": 4, 43 | "id": "468589d7", 44 | "metadata": {}, 45 | "outputs": [ 46 | { 47 | "data": { 48 | "image/png": "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\n", 49 | "text/plain": [ 50 | "
" 51 | ] 52 | }, 53 | "metadata": {}, 54 | "output_type": "display_data" 55 | } 56 | ], 57 | "source": [ 58 | "import matplotlib.pyplot as plt\n", 59 | "import numpy as np\n", 60 | "from sklearn.linear_model import LinearRegression\n", 61 | "\n", 62 | "# 创建数据\n", 63 | "x = np.array([5, 15, 25, 35, 45, 55]).reshape((-1, 1))\n", 64 | "y = np.array([5, 20, 14, 32, 22, 38])\n", 65 | "\n", 66 | "# 创建线性回归模型\n", 67 | "model = LinearRegression()\n", 68 | "\n", 69 | "# 训练模型\n", 70 | "model.fit(x, y)\n", 71 | "\n", 72 | "# 得到预测值\n", 73 | "y_pred = model.predict(x)\n", 74 | "\n", 75 | "# 绘制散点图和拟合线\n", 76 | "plt.scatter(x, y, color='blue')\n", 77 | "plt.plot(x, y_pred, color='red')\n", 78 | "plt.show()\n" 79 | ] 80 | }, 81 | { 82 | "cell_type": "code", 83 | "execution_count": null, 84 | "id": "bd8dd3b1", 85 | "metadata": {}, 86 | "outputs": [], 87 | "source": [] 88 | } 89 | ], 90 | "metadata": { 91 | "kernelspec": { 92 | "display_name": "Python 3 (ipykernel)", 93 | "language": "python", 94 | "name": "python3" 95 | }, 96 | "language_info": { 97 | "codemirror_mode": { 98 | "name": "ipython", 99 | "version": 3 100 | }, 101 | "file_extension": ".py", 102 | "mimetype": "text/x-python", 103 | "name": "python", 104 | "nbconvert_exporter": "python", 105 | "pygments_lexer": "ipython3", 106 | "version": "3.10.8" 107 | } 108 | }, 109 | "nbformat": 4, 110 | "nbformat_minor": 5 111 | } 112 | -------------------------------------------------------------------------------- /数学建模国赛算法库/层次分析法.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "id": "32ac797e", 7 | "metadata": {}, 8 | "outputs": [ 9 | { 10 | "name": "stdout", 11 | "output_type": "stream", 12 | "text": [ 13 | "==========准则层==========\n", 14 | "最大特征值5.072084,CR=0.014533,检验通过\n", 15 | "准则层权重 = [0.47583538 0.26360349 0.0538146 0.09806829 0.10867824]\n", 16 | "\n", 17 | "==========方案层==========\n", 18 | " 方案0 方案1 方案2 最大特征值 CR 一致性检验\n", 19 | "准则0 0.081935 0.236341 0.681725 3.001542 8.564584e-04 True\n", 20 | "准则1 0.595379 0.276350 0.128271 3.005535 3.075062e-03 True\n", 21 | "准则2 0.428571 0.428571 0.142857 3.000000 -4.934325e-16 True\n", 22 | "准则3 0.633708 0.191921 0.174371 3.009203 5.112618e-03 True\n", 23 | "准则4 0.344545 0.108525 0.546931 3.053622 2.978976e-02 True\n", 24 | "\n", 25 | "==========目标层==========\n", 26 | "[[0.318586 0.23898522 0.44242878]]\n", 27 | "最优选择是方案2\n" 28 | ] 29 | } 30 | ], 31 | "source": [ 32 | "from AHP import AHP\n", 33 | "import numpy as np\n", 34 | "\n", 35 | "# 准则重要性矩阵\n", 36 | "criteria = np.array([[1, 2, 7, 5, 5],\n", 37 | " [1 / 2, 1, 4, 3, 3],\n", 38 | " [1 / 7, 1 / 4, 1, 1 / 2, 1 / 3],\n", 39 | " [1 / 5, 1 / 3, 2, 1, 1],\n", 40 | " [1 / 5, 1 / 3, 3, 1, 1]])\n", 41 | "\n", 42 | "# 对每个准则,方案优劣排序\n", 43 | "b1 = np.array([[1, 1 / 3, 1 / 8], [3, 1, 1 / 3], [8, 3, 1]])\n", 44 | "b2 = np.array([[1, 2, 5], [1 / 2, 1, 2], [1 / 5, 1 / 2, 1]])\n", 45 | "b3 = np.array([[1, 1, 3], [1, 1, 3], [1 / 3, 1 / 3, 1]])\n", 46 | "b4 = np.array([[1, 3, 4], [1 / 3, 1, 1], [1 / 4, 1, 1]])\n", 47 | "b5 = np.array([[1, 4, 1 / 2], [1 / 4, 1, 1 / 4], [2, 4, 1]])\n", 48 | "\n", 49 | "b = [b1, b2, b3, b4, b5]\n", 50 | "a = AHP(criteria, b).run()" 51 | ] 52 | }, 53 | { 54 | "cell_type": "code", 55 | "execution_count": null, 56 | "id": "552fc97f", 57 | "metadata": {}, 58 | "outputs": [], 59 | "source": [] 60 | } 61 | ], 62 | "metadata": { 63 | "kernelspec": { 64 | "display_name": "Python 3 (ipykernel)", 65 | "language": "python", 66 | "name": "python3" 67 | }, 68 | "language_info": { 69 | "codemirror_mode": { 70 | "name": "ipython", 71 | "version": 3 72 | }, 73 | "file_extension": ".py", 74 | "mimetype": "text/x-python", 75 | "name": "python", 76 | "nbconvert_exporter": "python", 77 | "pygments_lexer": "ipython3", 78 | "version": "3.10.8" 79 | } 80 | }, 81 | "nbformat": 4, 82 | "nbformat_minor": 5 83 | } 84 | -------------------------------------------------------------------------------- /数学建模国赛算法库/拟牛顿法.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": null, 6 | "id": "16dba65c", 7 | "metadata": {}, 8 | "outputs": [], 9 | "source": [ 10 | "\"\"\"粒子群优化(PSO):\n", 11 | "\n", 12 | "优点:\n", 13 | "\n", 14 | "简单易实现,参数调整较为容易。\n", 15 | "由于其并行性,能够同时搜索解空间的多个区域,因此具有较好的全局优化能力。\n", 16 | "对于复杂的、非线性的、多模态的、高维度的问题有较好的适应性。\n", 17 | "缺点:\n", 18 | "\n", 19 | "对于一些复杂的、需要精确解的问题,粒子群优化可能无法找到最精确的解。\n", 20 | "可能会陷入局部最优,尤其是在处理高复杂度、高维度的问题时。\n", 21 | "拟牛顿法:\n", 22 | "\n", 23 | "优点:\n", 24 | "\n", 25 | "通常能够快速地收敛到最优解,尤其是在问题是凸的或近似凸的情况下。\n", 26 | "不需要提供目标函数的二阶导数,只需要一阶导数,计算成本相对较低。\n", 27 | "缺点:\n", 28 | "\n", 29 | "需要计算目标函数的梯度,对于一些不可微或者梯度难以求解的问题,可能无法使用。\n", 30 | "通常只能找到局部最优解,不一定能找到全局最优解。\n", 31 | "对于非凸、复杂的问题可能表现不佳。\"\"\"" 32 | ] 33 | }, 34 | { 35 | "cell_type": "code", 36 | "execution_count": 1, 37 | "id": "b4fe58eb", 38 | "metadata": {}, 39 | "outputs": [ 40 | { 41 | "name": "stdout", 42 | "output_type": "stream", 43 | "text": [ 44 | "Optimized parameters: [-5.84891567e-09 -5.84891567e-09]\n", 45 | "Minimum function value: 1.0053918284590435\n" 46 | ] 47 | }, 48 | { 49 | "data": { 50 | "image/png": "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\n", 51 | "text/plain": [ 52 | "
" 53 | ] 54 | }, 55 | "metadata": {}, 56 | "output_type": "display_data" 57 | } 58 | ], 59 | "source": [ 60 | "from scipy.optimize import minimize\n", 61 | "import numpy as np\n", 62 | "import matplotlib.pyplot as plt\n", 63 | "\n", 64 | "def func(x):\n", 65 | " # x输入粒子位置\n", 66 | " # y 粒子适应度值\n", 67 | " if (x[0]==0)&(x[1]==0):\n", 68 | " y = np.exp((np.cos(2*np.pi*x[0])+np.cos(2*np.pi*x[1]))/2)-2.71289\n", 69 | " else:\n", 70 | " y = np.sin(np.sqrt(x[0]**2+x[1]**2))/np.sqrt(x[0]**2+x[1]**2)+np.exp((np.cos(2*np.pi*x[0])+np.cos(2*np.pi*x[1]))/2)-2.71289\n", 71 | " return -y \n", 72 | "\n", 73 | "def store_values(x):\n", 74 | " store_values.f_values.append(-func(x))\n", 75 | "\n", 76 | "store_values.f_values = []\n", 77 | "\n", 78 | "x0 = np.array([0, 0])\n", 79 | "\n", 80 | "res = minimize(func, x0, method='BFGS', callback=store_values)\n", 81 | "\n", 82 | "print('Optimized parameters: ', res.x)\n", 83 | "print('Minimum function value: ', -res.fun)\n", 84 | "\n", 85 | "plt.plot(store_values.f_values)\n", 86 | "plt.xlabel('Iteration')\n", 87 | "plt.ylabel('Function value')\n", 88 | "plt.show()" 89 | ] 90 | }, 91 | { 92 | "cell_type": "code", 93 | "execution_count": null, 94 | "id": "34e32d7a", 95 | "metadata": {}, 96 | "outputs": [], 97 | "source": [] 98 | } 99 | ], 100 | "metadata": { 101 | "kernelspec": { 102 | "display_name": "Python 3 (ipykernel)", 103 | "language": "python", 104 | "name": "python3" 105 | }, 106 | "language_info": { 107 | "codemirror_mode": { 108 | "name": "ipython", 109 | "version": 3 110 | }, 111 | "file_extension": ".py", 112 | "mimetype": "text/x-python", 113 | "name": "python", 114 | "nbconvert_exporter": "python", 115 | "pygments_lexer": "ipython3", 116 | "version": "3.10.8" 117 | } 118 | }, 119 | "nbformat": 4, 120 | "nbformat_minor": 5 121 | } 122 | -------------------------------------------------------------------------------- /数学建模国赛算法库/粒子群算法.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "id": "276207fe", 7 | "metadata": {}, 8 | "outputs": [ 9 | { 10 | "data": { 11 | "image/png": "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\n", 12 | "text/plain": [ 13 | "
" 14 | ] 15 | }, 16 | "metadata": {}, 17 | "output_type": "display_data" 18 | } 19 | ], 20 | "source": [ 21 | "# -*- coding:utf-8 -*-\n", 22 | "import numpy as np\n", 23 | "import matplotlib.pyplot as plt\n", 24 | "import math\n", 25 | "\n", 26 | "def getweight():\n", 27 | " # 惯性权重\n", 28 | " weight = 1\n", 29 | " return weight\n", 30 | "\n", 31 | "def getlearningrate():\n", 32 | " # 分别是粒子的个体和社会的学习因子,也称为加速常数\n", 33 | " lr = (0.49445,1.49445)\n", 34 | " return lr\n", 35 | "\n", 36 | "def getmaxgen():\n", 37 | " # 最大迭代次数\n", 38 | " maxgen = 20\n", 39 | " return maxgen\n", 40 | "\n", 41 | "def getsizepop():\n", 42 | " # 种群规模\n", 43 | " sizepop = 50\n", 44 | " return sizepop\n", 45 | "\n", 46 | "def getrangepop():\n", 47 | " # 粒子的位置的范围限制,x、y方向的限制相同\n", 48 | " rangepop = (-2*math.pi , 2*math.pi)\n", 49 | " #rangepop = (-2,2)\n", 50 | " return rangepop\n", 51 | "\n", 52 | "def getrangespeed():\n", 53 | " # 粒子的速度范围限制\n", 54 | " rangespeed = (-0.5,0.5)\n", 55 | " return rangespeed\n", 56 | "\n", 57 | "def func(x):\n", 58 | " # x输入粒子位置\n", 59 | " # y 粒子适应度值\n", 60 | " if (x[0]==0)&(x[1]==0):\n", 61 | " y = np.exp((np.cos(2*np.pi*x[0])+np.cos(2*np.pi*x[1]))/2)-2.71289\n", 62 | " else:\n", 63 | " y = np.sin(np.sqrt(x[0]**2+x[1]**2))/np.sqrt(x[0]**2+x[1]**2)+np.exp((np.cos(2*np.pi*x[0])+np.cos(2*np.pi*x[1]))/2)-2.71289\n", 64 | " return y\n", 65 | "\n", 66 | "def initpopvfit(sizepop):\n", 67 | " pop = np.zeros((sizepop,2))\n", 68 | " v = np.zeros((sizepop,2))\n", 69 | " fitness = np.zeros(sizepop)\n", 70 | "\n", 71 | " for i in range(sizepop):\n", 72 | " pop[i] = [(np.random.rand()-0.5)*rangepop[0]*2,(np.random.rand()-0.5)*rangepop[1]*2]\n", 73 | " v[i] = [(np.random.rand()-0.5)*rangepop[0]*2,(np.random.rand()-0.5)*rangepop[1]*2]\n", 74 | " fitness[i] = func(pop[i])\n", 75 | " return pop,v,fitness\n", 76 | "\n", 77 | "def getinitbest(fitness,pop):\n", 78 | " # 群体最优的粒子位置及其适应度值\n", 79 | " gbestpop,gbestfitness = pop[fitness.argmax()].copy(),fitness.max()\n", 80 | " #个体最优的粒子位置及其适应度值,使用copy()使得对pop的改变不影响pbestpop,pbestfitness类似\n", 81 | " pbestpop,pbestfitness = pop.copy(),fitness.copy()\n", 82 | "\n", 83 | " return gbestpop,gbestfitness,pbestpop,pbestfitness \n", 84 | "\n", 85 | "w = getweight()\n", 86 | "lr = getlearningrate()\n", 87 | "maxgen = getmaxgen()\n", 88 | "sizepop = getsizepop()\n", 89 | "rangepop = getrangepop()\n", 90 | "rangespeed = getrangespeed()\n", 91 | "\n", 92 | "pop,v,fitness = initpopvfit(sizepop)\n", 93 | "gbestpop,gbestfitness,pbestpop,pbestfitness = getinitbest(fitness,pop)\n", 94 | "\n", 95 | "result = np.zeros(maxgen)\n", 96 | "for i in range(maxgen):\n", 97 | " t=0.5\n", 98 | " #速度更新\n", 99 | " for j in range(sizepop):\n", 100 | " v[j] += lr[0]*np.random.rand()*(pbestpop[j]-pop[j])+lr[1]*np.random.rand()*(gbestpop-pop[j])\n", 101 | " v[vrangespeed[1]] = rangespeed[1]\n", 103 | "\n", 104 | " #粒子位置更新\n", 105 | " for j in range(sizepop):\n", 106 | " #pop[j] += 0.5*v[j]\n", 107 | " pop[j] = t*(0.5*v[j])+(1-t)*pop[j]\n", 108 | " pop[poprangepop[1]] = rangepop[1]\n", 110 | "\n", 111 | " #适应度更新\n", 112 | " for j in range(sizepop):\n", 113 | " fitness[j] = func(pop[j])\n", 114 | "\n", 115 | " for j in range(sizepop):\n", 116 | " if fitness[j] > pbestfitness[j]:\n", 117 | " pbestfitness[j] = fitness[j]\n", 118 | " pbestpop[j] = pop[j].copy()\n", 119 | "\n", 120 | " if pbestfitness.max() > gbestfitness :\n", 121 | " gbestfitness = pbestfitness.max()\n", 122 | " gbestpop = pop[pbestfitness.argmax()].copy()\n", 123 | "\n", 124 | " result[i] = gbestfitness\n", 125 | "\n", 126 | "\n", 127 | "plt.plot(result)\n", 128 | "plt.show()" 129 | ] 130 | }, 131 | { 132 | "cell_type": "code", 133 | "execution_count": 2, 134 | "id": "d28922c0", 135 | "metadata": {}, 136 | "outputs": [ 137 | { 138 | "data": { 139 | "text/plain": [ 140 | "array([0.51744368, 0.51744368, 0.51744368, 0.98885325, 0.98885325,\n", 141 | " 0.98885325, 0.98885325, 1.00363772, 1.00363772, 1.00435015,\n", 142 | " 1.00435015, 1.00498527, 1.00498527, 1.0052142 , 1.00537065,\n", 143 | " 1.00537065, 1.005382 , 1.00538932, 1.00538932, 1.00539142])" 144 | ] 145 | }, 146 | "execution_count": 2, 147 | "metadata": {}, 148 | "output_type": "execute_result" 149 | } 150 | ], 151 | "source": [ 152 | "result" 153 | ] 154 | }, 155 | { 156 | "cell_type": "code", 157 | "execution_count": null, 158 | "id": "ef005a77", 159 | "metadata": {}, 160 | "outputs": [], 161 | "source": [] 162 | } 163 | ], 164 | "metadata": { 165 | "kernelspec": { 166 | "display_name": "Python 3 (ipykernel)", 167 | "language": "python", 168 | "name": "python3" 169 | }, 170 | "language_info": { 171 | "codemirror_mode": { 172 | "name": "ipython", 173 | "version": 3 174 | }, 175 | "file_extension": ".py", 176 | "mimetype": "text/x-python", 177 | "name": "python", 178 | "nbconvert_exporter": "python", 179 | "pygments_lexer": "ipython3", 180 | "version": "3.10.8" 181 | } 182 | }, 183 | "nbformat": 4, 184 | "nbformat_minor": 5 185 | } 186 | -------------------------------------------------------------------------------- /数学建模国赛算法库/非线性规划函数.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "id": "868f0d3d", 7 | "metadata": {}, 8 | "outputs": [ 9 | { 10 | "name": "stdout", 11 | "output_type": "stream", 12 | "text": [ 13 | "最优目标函数值: 10.651091840572583\n", 14 | "最优解: [0.55216734 1.20325918 0.94782404]\n" 15 | ] 16 | } 17 | ], 18 | "source": [ 19 | "# 等式约束意味着约束函数结果为零,而不等式意味着约束函数结果为非负。请注意,COBYLA 仅支持不等式约束。\n", 20 | "import numpy as np\n", 21 | "from scipy.optimize import minimize\n", 22 | "\n", 23 | "def objective_function(x):\n", 24 | " return x[0]**2 + x[1]**2+x[2]**2+8\n", 25 | "\n", 26 | "def constraint1(x):\n", 27 | " return x[0]**2 - x[1]+x[2]**2\n", 28 | "\n", 29 | "def constraint2(x):\n", 30 | " return -x[0] - x[1]**2-x[2]**2+20\n", 31 | "\n", 32 | "def constraint3(x):\n", 33 | " return -x[0] - x[1]**2+2\n", 34 | "\n", 35 | "def constraint4(x):\n", 36 | " return x[1]+2*x[2]**2-3\n", 37 | "\n", 38 | "# 定义初始猜测值\n", 39 | "x0 = [0, 0,0]\n", 40 | "\n", 41 | "bounds = [(0, None), (0, None), (0, None)]\n", 42 | "\n", 43 | "# 定义约束条件\n", 44 | "constraint1_args = {'type': 'ineq', 'fun': constraint1}\n", 45 | "constraint2_args = {'type': 'ineq', 'fun': constraint2}\n", 46 | "constraint3_args = {'type': 'eq', 'fun': constraint3}\n", 47 | "constraint4_args = {'type': 'eq', 'fun': constraint4}\n", 48 | "\n", 49 | "# 定义约束条件列表\n", 50 | "constraints = [constraint1_args, constraint2_args,constraint3_args, constraint4_args]\n", 51 | "\n", 52 | "# 使用minimize函数求解非线性规划问题\n", 53 | "result = minimize(objective_function, x0, method='SLSQP', constraints=constraints,bounds=bounds)\n", 54 | "\n", 55 | "# 输出结果\n", 56 | "print(\"最优目标函数值:\", result.fun)\n", 57 | "print(\"最优解:\", result.x)\n" 58 | ] 59 | }, 60 | { 61 | "cell_type": "code", 62 | "execution_count": null, 63 | "id": "b2353d2f", 64 | "metadata": {}, 65 | "outputs": [], 66 | "source": [] 67 | } 68 | ], 69 | "metadata": { 70 | "kernelspec": { 71 | "display_name": "Python 3 (ipykernel)", 72 | "language": "python", 73 | "name": "python3" 74 | }, 75 | "language_info": { 76 | "codemirror_mode": { 77 | "name": "ipython", 78 | "version": 3 79 | }, 80 | "file_extension": ".py", 81 | "mimetype": "text/x-python", 82 | "name": "python", 83 | "nbconvert_exporter": "python", 84 | "pygments_lexer": "ipython3", 85 | "version": "3.10.8" 86 | } 87 | }, 88 | "nbformat": 4, 89 | "nbformat_minor": 5 90 | } 91 | --------------------------------------------------------------------------------