Upload New File
This commit is contained in:
1 parent
492686df00
commit
a31eea177c
1 file changed
+324
@@ -0,0 +1,324 @@
|
|||||||
|
{
|
||||||
|
"cells": [
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 44,
|
||||||
|
"id": "b94b0451",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"image/png": "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 truncated
|
||||||
|
"text/plain": [
|
||||||
|
"<Figure size 640x480 with 1 Axes>"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "display_data"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"[[6.30165767]]\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"import matplotlib.pyplot as plt\n",
|
||||||
|
"import numpy as np\n",
|
||||||
|
"import pandas as pd\n",
|
||||||
|
"from sklearn.linear_model import LinearRegression\n",
|
||||||
|
"\n",
|
||||||
|
"# Download and prepare the data\n",
|
||||||
|
"lifesat = pd.read_csv(\"lifesat.csv\")\n",
|
||||||
|
"X = lifesat[[\"GDP per capita (USD)\"]].values\n",
|
||||||
|
"y = lifesat[[\"Life satisfaction\"]].values\n",
|
||||||
|
"\n",
|
||||||
|
"# Visualize the data\n",
|
||||||
|
"lifesat.plot(kind='scatter', grid=True,\n",
|
||||||
|
" x=\"GDP per capita (USD)\", y=\"Life satisfaction\")\n",
|
||||||
|
"plt.axis([23_500, 62_500, 4, 9])\n",
|
||||||
|
"plt.show()\n",
|
||||||
|
"\n",
|
||||||
|
"# Select a linear model\n",
|
||||||
|
"model = LinearRegression()\n",
|
||||||
|
"\n",
|
||||||
|
"# Train the model\n",
|
||||||
|
"model.fit(X, y)\n",
|
||||||
|
"\n",
|
||||||
|
"# Make a prediction for Cyprus\n",
|
||||||
|
"X_new = [[37_655.2]] # Cyprus' GDP per capita in 2020\n",
|
||||||
|
"print(model.predict(X_new)) # outputs [[6.30165767]]\n"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 45,
|
||||||
|
"id": "94fda07f",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"X_test = np.linspace(25000, 60000, 200)\n",
|
||||||
|
"X_test = [[value] for value in X_test]\n",
|
||||||
|
"y_test = model.predict(X_test)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 46,
|
||||||
|
"id": "838b0242",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAioAAAG2CAYAAABRfK0WAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABMUElEQVR4nO3deVxU1f8/8Newg4AgIEqyKbiEqChpqLl8xT23ckMzxa3F0jKX6pOppWnLTy01zX3fKjMtN1LT3JeA3MINRU1SQDZRGOH8/rjNwAgMjMwwd2Zez8eDx0fOXO6cM5ePvjr3nvNWCCEEiIiIiGTIytgdICIiIioNgwoRERHJFoMKERERyRaDChEREckWgwoRERHJFoMKERERyRaDChEREckWgwoRERHJFoMKERERyRaDChEREcmWUYNKVlYW3nnnHfj7+8PR0REtW7bEqVOnjNklIiIikhGjBpWRI0ciJiYGa9euxdmzZ9GpUydERkbi9u3bxuwWERERyYTCWEUJHz58CBcXF/z888/o3r27ur1Zs2bo2rUrZsyYYYxuERERkYzYGOuNHz9+jPz8fDg4OGi0Ozo64vDhwyX+TG5uLnJzc9XfFxQUIC0tDR4eHlAoFAbtLxEREemHEAJZWVnw8fGBlVUZN3eEEUVERIi2bduK27dvi8ePH4u1a9cKKysrUbdu3RKPnzp1qgDAL37xi1/84he/zODr5s2bZWYFo936AYCrV69i+PDhOHToEKytrdG0aVPUrVsXZ86cwcWLF4sd/+SMSkZGBvz8/JCYmAgXF5cK9UWpVOLAgQNo3749bG1tK3QuU2TJ47fksQMcvyWP35LHDlj2+I099qysLAQGBiI9PR1Vq1bVeqzRbv0AQJ06dXDw4EE8ePAAmZmZqFmzJgYMGIDatWuXeLy9vT3s7e2LtVerVg2urq4V6otSqYSTkxM8PDws7hcWsOzxW/LYAY7fksdvyWMHLHv8xh676j3L89iGLPZRqVKlCmrWrIn79+9jz5496NWrl7G7RERERDJg1BmVPXv2QAiBevXq4cqVK5g4cSLq16+P6OhoY3aLiIiIZMKoMyoZGRkYM2YM6tevj1dffRWtW7fGnj17LG4KjoiIiEpm1BmV/v37o3///sbsAhEREcmYLJ5RISIiIioJgwoRERHJFoMKERERyRaDChEREckWgwoRERHJFoMKERERyRaDChEREckWgwoRERHJFoMKERERyRaDChEREckWgwoRERHJFoMKERERyRaDChEREckWgwoRERHJFoMKERERyRaDChEREckWgwoRERHJFoMKERERyRaDChEREckWgwoRERHJFoMKERERyRaDChEREckWgwoRERHJFoMKERERyRaDChEREckWgwoRERHJFoMKERERyRaDChEREckWgwoRERHJFoMKERERyRaDChEREckWgwoRERHJFoMKERERyRaDChEREckWgwoRERHJFoMKERERyRaDChEREckWgwoRERHJFoMKERERyRaDChEREckWgwoRERHJFoMKERERyRaDChEREckWgwoRERHJFoMKERERyRaDChEREckWgwoRERHJFoMKERERyRaDChEREckWgwoRERHJFoMKERERyRaDChEREckWgwoRERHJFoMKERERyRaDChEREckWgwoRERHJFoMKERERyRaDChEREckWgwoRERHJFoMKERERyRaDChEREckWgwoRERHJFoMKERERyZZRg0p+fj6mTJmCwMBAODo6ok6dOvj0008hhDBmt4iIiEgmbIz55p9//jkWLVqE1atXIyQkBKdPn0Z0dDSqVq2KsWPHGrNrREREJANGDSpHjx5Fr1690L17dwBAQEAANm7ciJMnTxqzW0RERCQTRg0qLVu2xJIlS3Dp0iXUrVsX8fHxOHz4MObMmVPi8bm5ucjNzVV/n5mZCQBQKpVQKpUV6ovq5yt6HlNlyeO35LEDHL8lj9+Sxw5Y9viNPXZd3lchjPhASEFBAT788EN88cUXsLa2Rn5+PmbOnIkPPvigxOOnTZuG6dOnF2vfsGEDnJycDN1dIiIi0oOcnBwMGjQIGRkZcHV11XqsUYPKpk2bMHHiRHz55ZcICQlBXFwc3nnnHcyZMwdDhw4tdnxJMyq+vr5ISUkpc6BlUSqViImJQceOHWFra1uhc5kiSx6/JY8d4PgtefyWPHbAssdv7LFnZmbC09OzXEHFqLd+Jk6ciPfffx8DBw4EAISGhuLGjRuYNWtWiUHF3t4e9vb2xdptbW319kHr81ymyJLHb8ljBzh+Sx6/JY8dsOzxG2vsurynUZcn5+TkwMpKswvW1tYoKCgwUo+IiIhITow6o9KjRw/MnDkTfn5+CAkJQWxsLObMmYPhw4cbs1tEREQk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 truncated
|
||||||
|
"text/plain": [
|
||||||
|
"<Figure size 640x480 with 1 Axes>"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "display_data"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"# Visualize the data\n",
|
||||||
|
"lifesat.plot(kind='scatter', grid=True,\n",
|
||||||
|
" x=\"GDP per capita (USD)\", y=\"Life satisfaction\")\n",
|
||||||
|
"plt.axis([23_500, 62_500, 4, 9])\n",
|
||||||
|
"plt.plot(X_test, y_test, color='red')\n",
|
||||||
|
"plt.show()"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 47,
|
||||||
|
"id": "aa14a4ca",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"class KNearestNeighborRegressor(object):\n",
|
||||||
|
" \"\"\" a kNN regressor with L2 distance \"\"\"\n",
|
||||||
|
"\n",
|
||||||
|
" def __init__(self):\n",
|
||||||
|
" pass\n",
|
||||||
|
"\n",
|
||||||
|
" def train(self, X, y):\n",
|
||||||
|
" \"\"\"\n",
|
||||||
|
" Train the classifier. For k-nearest neighbors this is just \n",
|
||||||
|
" memorizing the training data.\n",
|
||||||
|
"\n",
|
||||||
|
" Inputs:\n",
|
||||||
|
" - X: A numpy array of shape (num_train, D) containing the training data\n",
|
||||||
|
" consisting of num_train samples each of dimension D.\n",
|
||||||
|
" - y: A numpy array of shape (N,) containing the training labels, where\n",
|
||||||
|
" y[i] is the label for X[i].\n",
|
||||||
|
" \"\"\"\n",
|
||||||
|
" self.X_train = X\n",
|
||||||
|
" self.y_train = y\n",
|
||||||
|
" \n",
|
||||||
|
" def predict(self, X, k=1):\n",
|
||||||
|
" \"\"\"\n",
|
||||||
|
" Predict labels for test data using this classifier.\n",
|
||||||
|
"\n",
|
||||||
|
" Inputs:\n",
|
||||||
|
" - X: A numpy array of shape (num_test, D) containing test data consisting\n",
|
||||||
|
" of num_test samples each of dimension D.\n",
|
||||||
|
" - k: The number of nearest neighbors that vote for the predicted labels.\n",
|
||||||
|
" - num_loops: Determines which implementation to use to compute distances\n",
|
||||||
|
" between training points and testing points.\n",
|
||||||
|
"\n",
|
||||||
|
" Returns:\n",
|
||||||
|
" - y: A numpy array of shape (num_test,) containing predicted labels for the\n",
|
||||||
|
" test data, where y[i] is the predicted label for the test point X[i]. \n",
|
||||||
|
" \"\"\"\n",
|
||||||
|
" dists = self.compute_distances(X)\n",
|
||||||
|
" \n",
|
||||||
|
" return self.predict_values(dists, k=k)\n",
|
||||||
|
"\n",
|
||||||
|
"\n",
|
||||||
|
" def compute_distances(self, X):\n",
|
||||||
|
" \"\"\"\n",
|
||||||
|
" Compute the distance between each test point in X and each training point\n",
|
||||||
|
" in self.X_train using a single loop over the test data.\n",
|
||||||
|
"\n",
|
||||||
|
" Inputs:\n",
|
||||||
|
" - X: A numpy array of shape (num_test, D) containing test data.\n",
|
||||||
|
"\n",
|
||||||
|
" Returns:\n",
|
||||||
|
" - dists: A numpy array of shape (num_test, num_train) where dists[i, j]\n",
|
||||||
|
" is the Euclidean distance between the ith test point and the jth training\n",
|
||||||
|
" point.\n",
|
||||||
|
" \"\"\"\n",
|
||||||
|
" num_test = X.shape[0]\n",
|
||||||
|
" num_train = self.X_train.shape[0]\n",
|
||||||
|
" dists = np.zeros((num_test, num_train))\n",
|
||||||
|
" for i in range(num_test):\n",
|
||||||
|
" #######################################################################\n",
|
||||||
|
" # TODO: #\n",
|
||||||
|
" # Compute the l2 distance between the ith test point and all training #\n",
|
||||||
|
" # points, and store the result in dists[i, :]. #\n",
|
||||||
|
" #######################################################################\n",
|
||||||
|
" \n",
|
||||||
|
" dists[i,:] = np.sqrt(np.sum((self.X_train - X[i, :])**2, axis=1))\n",
|
||||||
|
" \n",
|
||||||
|
" #######################################################################\n",
|
||||||
|
" # END OF YOUR CODE #\n",
|
||||||
|
" #######################################################################\n",
|
||||||
|
" return dists\n",
|
||||||
|
"\n",
|
||||||
|
"\n",
|
||||||
|
"\n",
|
||||||
|
" def predict_values(self, dists, k=1):\n",
|
||||||
|
" \"\"\"\n",
|
||||||
|
" Given a matrix of distances between test points and training points,\n",
|
||||||
|
" predict a value for each test point.\n",
|
||||||
|
"\n",
|
||||||
|
" Inputs:\n",
|
||||||
|
" - dists: A numpy array of shape (num_test, num_train) where dists[i, j]\n",
|
||||||
|
" gives the distance betwen the ith test point and the jth training point.\n",
|
||||||
|
"\n",
|
||||||
|
" Returns:\n",
|
||||||
|
" - y: A numpy array of shape (num_test,) containing predicted values for the\n",
|
||||||
|
" test data, where y[i] is the predicted value for the test point X[i]. \n",
|
||||||
|
" \"\"\"\n",
|
||||||
|
" num_test = dists.shape[0]\n",
|
||||||
|
" y_pred = np.zeros(num_test)\n",
|
||||||
|
" for i in range(num_test):\n",
|
||||||
|
" # A list of length k storing the labels of the k nearest neighbors to\n",
|
||||||
|
" # the ith test point.\n",
|
||||||
|
" \n",
|
||||||
|
" \n",
|
||||||
|
" #########################################################################\n",
|
||||||
|
" # TODO: #\n",
|
||||||
|
" # Use the distance matrix to find the k nearest neighbors of the ith #\n",
|
||||||
|
" # testing point, and use self.y_train to find the labels of these #\n",
|
||||||
|
" # neighbors. Store these labels in closest_y. #\n",
|
||||||
|
" # Hint: Look up the function numpy.argsort. #\n",
|
||||||
|
" #########################################################################\n",
|
||||||
|
" \n",
|
||||||
|
" closest_y = self.y_train[np.argsort(dists[i, :])[:k]].flatten()\n",
|
||||||
|
" \n",
|
||||||
|
" #########################################################################\n",
|
||||||
|
" # TODO: #\n",
|
||||||
|
" # Now that you have found the labels of the k nearest neighbors, you #\n",
|
||||||
|
" # need to compute the average of the target values corresponding to the #\n",
|
||||||
|
" # nearest neighbors. #\n",
|
||||||
|
" #########################################################################\n",
|
||||||
|
" \n",
|
||||||
|
" closest_dists = dists[i, np.argsort(dists[i, :])[:k]]\n",
|
||||||
|
"\n",
|
||||||
|
" epsilon = 1e-8\n",
|
||||||
|
" weights = (1 / (closest_dists + epsilon))\n",
|
||||||
|
" weights = weights / np.sum(weights)\n",
|
||||||
|
"\n",
|
||||||
|
" y_pred[i] = np.sum(weights * closest_y)\n",
|
||||||
|
" \n",
|
||||||
|
" #########################################################################\n",
|
||||||
|
" # END OF YOUR CODE # \n",
|
||||||
|
" #########################################################################\n",
|
||||||
|
"\n",
|
||||||
|
" return y_pred"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 48,
|
||||||
|
"id": "267d1168",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"knn_reg = KNearestNeighborRegressor()\n",
|
||||||
|
"knn_reg.train(np.array(X), y)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 49,
|
||||||
|
"id": "fd8203ba",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"y_hat_1 = knn_reg.predict(np.array(X_test), k=1)\n",
|
||||||
|
"y_hat_3 = knn_reg.predict(np.array(X_test), k=3)\n",
|
||||||
|
"y_hat_5 = knn_reg.predict(np.array(X_test), k=5)\n",
|
||||||
|
"y_hat_7 = knn_reg.predict(np.array(X_test), k=7)\n",
|
||||||
|
"y_hat_20 = knn_reg.predict(np.array(X_test), k=20)\n",
|
||||||
|
"y_hat_27 = knn_reg.predict(np.array(X_test), k=27)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 50,
|
||||||
|
"id": "d3704256",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"image/png": "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 truncated
|
||||||
|
"text/plain": [
|
||||||
|
"<Figure size 640x480 with 1 Axes>"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "display_data"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"# Visualize the data\n",
|
||||||
|
"lifesat.plot(kind='scatter', grid=True,\n",
|
||||||
|
" x=\"GDP per capita (USD)\", y=\"Life satisfaction\")\n",
|
||||||
|
"plt.axis([23_500, 62_500, 4, 9])\n",
|
||||||
|
"plt.plot(X_test, y_test, color='red')\n",
|
||||||
|
"plt.plot(X_test, y_hat_1, color='green')\n",
|
||||||
|
"plt.plot(X_test, y_hat_3, color='blue')\n",
|
||||||
|
"plt.plot(X_test, y_hat_5, color='magenta')\n",
|
||||||
|
"plt.plot(X_test, y_hat_7, color='orange')\n",
|
||||||
|
"plt.plot(X_test, y_hat_20, color='black')\n",
|
||||||
|
"plt.plot(X_test, y_hat_27, color='grey')\n",
|
||||||
|
"plt.show()"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 51,
|
||||||
|
"id": "dab45709",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"[7.19862495]\n",
|
||||||
|
"[7.23555601]\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"print(knn_reg.predict(np.array([[38341]]), k=7))\n",
|
||||||
|
"print(knn_reg.predict(np.array([[69669]]), k=7))"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"kernelspec": {
|
||||||
|
"display_name": "Python 3",
|
||||||
|
"language": "python",
|
||||||
|
"name": "python3"
|
||||||
|
},
|
||||||
|
"language_info": {
|
||||||
|
"codemirror_mode": {
|
||||||
|
"name": "ipython",
|
||||||
|
"version": 3
|
||||||
|
},
|
||||||
|
"file_extension": ".py",
|
||||||
|
"mimetype": "text/x-python",
|
||||||
|
"name": "python",
|
||||||
|
"nbconvert_exporter": "python",
|
||||||
|
"pygments_lexer": "ipython3",
|
||||||
|
"version": "3.11.9"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nbformat": 4,
|
||||||
|
"nbformat_minor": 5
|
||||||
|
}
|
||||||
Reference in new issue
Block a user