1
0
Files
AI-learning/lab/3_Polynomial_Regression.ipynb
2025-01-25 22:33:14 +08:00

161 lines
4.9 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"from sklearn.preprocessing import PolynomialFeatures\n",
"from sklearn.linear_model import LinearRegression\n",
"from sklearn.linear_model import Ridge\n",
"from sklearn.pipeline import make_pipeline\n",
"from sklearn.metrics import mean_squared_error\n",
"from sklearn.preprocessing import StandardScaler"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"f_{w,b}(x) = 2x + 3x^2 + 4x^3 + 5\n",
"$$"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def generateData():\n",
" # 生成数据集\n",
" x = np.linspace(-10, 10, 40)\n",
" # 使用噪声构建y\n",
" y = 2 * x + 3 * x**2 + 4 * x**3 + 5 + np.random.normal(scale=200, size=x.shape)\n",
"\n",
" data = np.column_stack((x, y))\n",
"\n",
" # 绘制数据集\n",
" plt.figure(dpi=600)\n",
" plt.scatter(x, y)\n",
" plt.show()\n",
" \n",
" return data\n",
"\n",
"data = generateData()"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [],
"source": [
"# 保存数据\n",
"def save_data(filename, data):\n",
" np.savetxt(filename, data, delimiter=',')\n",
" print(f\"{filename} 已成功创建并写入数据。\")\n",
"\n",
"# save_data('data.csv', data)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def polynomial_normal_regression(data, degree=3):\n",
" # 生成多项式特征并进行线性回归\n",
" model = make_pipeline(PolynomialFeatures(degree), LinearRegression())\n",
" model.fit(data[:, 0].reshape(-1, 1), data[:, 1])\n",
" y_pred = model.predict(data[:, 0].reshape(-1, 1))\n",
" \n",
" # 输出拟合后的多项式\n",
" coef = model.named_steps['linearregression'].coef_\n",
" intercept = model.named_steps['linearregression'].intercept_\n",
" poly_features = model.named_steps['polynomialfeatures']\n",
" feature_names = poly_features.get_feature_names_out(['x'])\n",
" \n",
" polynomial = \" + \".join(f\"{coef[i]:.2f}*{feature_names[i]}\" for i in range(len(coef)))\n",
" polynomial = f\"{intercept:.2f} + \" + polynomial\n",
" print(f\"拟合后的多项式: {polynomial}\")\n",
" \n",
" # 计算并输出损失\n",
" loss = mean_squared_error(data[:, 1], y_pred)\n",
" print(f\"损失: {loss:.2f}\")\n",
"\n",
" # 绘制拟合结果\n",
" plt.figure(dpi=600)\n",
" plt.scatter(data[:, 0], data[:, 1], label='original data')\n",
" plt.plot(data[:, 0], y_pred, label='fit curve', color='red')\n",
" plt.legend()\n",
" plt.show()\n",
"\n",
"polynomial_normal_regression(data)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def polynomial_ridge_regression(data, degree=3):\n",
" # 生成多项式特征并进行线性回归\n",
" model = make_pipeline(PolynomialFeatures(degree), Ridge(alpha=0.5))\n",
" model.fit(data[:, 0].reshape(-1, 1), data[:, 1])\n",
" y_pred = model.predict(data[:, 0].reshape(-1, 1))\n",
" \n",
" # 输出拟合后的多项式\n",
" coef = model.named_steps['ridge'].coef_\n",
" intercept = model.named_steps['ridge'].intercept_\n",
" poly_features = model.named_steps['polynomialfeatures']\n",
" feature_names = poly_features.get_feature_names_out(['x'])\n",
" \n",
" polynomial = \" + \".join(f\"{coef[i]:.2f}*{feature_names[i]}\" for i in range(len(coef)))\n",
" polynomial = f\"{intercept:.2f} + \" + polynomial\n",
" print(f\"拟合后的多项式: {polynomial}\")\n",
" \n",
" # 计算并输出损失\n",
" loss = mean_squared_error(data[:, 1], y_pred)\n",
" print(f\"损失: {loss:.2f}\")\n",
"\n",
" # 绘制拟合结果\n",
" plt.figure(dpi=600)\n",
" plt.scatter(data[:, 0], data[:, 1], label='original data')\n",
" plt.plot(data[:, 0], y_pred, label='fit curve', color='red')\n",
" plt.legend()\n",
" plt.show()\n",
"\n",
"polynomial_ridge_regression(data)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "pt",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.14"
}
},
"nbformat": 4,
"nbformat_minor": 2
}