161 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			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
 | 
						|
}
 |