Last active
          January 23, 2021 13:17 
        
      - 
      
- 
        Save saccadic/da5b95e72df0dc2c8f22c4a900e232c6 to your computer and use it in GitHub Desktop. 
    opencv_solver
  
        
  
    
      This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      Learn more about bidirectional Unicode characters
    
  
  
    
  | { | |
| "nbformat": 4, | |
| "nbformat_minor": 0, | |
| "metadata": { | |
| "colab": { | |
| "name": "opencv_solver", | |
| "provenance": [], | |
| "collapsed_sections": [], | |
| "authorship_tag": "ABX9TyPZukTZBkAo9clkILBcfbDO", | |
| "include_colab_link": true | |
| }, | |
| "kernelspec": { | |
| "name": "python3", | |
| "display_name": "Python 3" | |
| } | |
| }, | |
| "cells": [ | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "view-in-github", | |
| "colab_type": "text" | |
| }, | |
| "source": [ | |
| "<a href=\"https://colab.research.google.com/gist/saccadic/da5b95e72df0dc2c8f22c4a900e232c6/opencv_solver.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "NpUDfIVXMz0N" | |
| }, | |
| "source": [ | |
| "import cv2\r\n", | |
| "import numpy as np\r\n", | |
| "import pandas as pd\r\n", | |
| "import matplotlib.pyplot as plt\r\n", | |
| "from sklearn.preprocessing import PolynomialFeatures" | |
| ], | |
| "execution_count": 1, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "4jkrz3_qNKGN" | |
| }, | |
| "source": [ | |
| "def model(x, hyperparameter):\r\n", | |
| " data = []\r\n", | |
| " for i in range(len(x)):\r\n", | |
| " y = hyperparameter[0]\r\n", | |
| " for k in range(1,len(hyperparameter)):\r\n", | |
| " y = y + hyperparameter[k] * np.power(x[i],k)\r\n", | |
| " data.append(y)\r\n", | |
| " return np.array(data)" | |
| ], | |
| "execution_count": 2, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "colab": { | |
| "base_uri": "https://localhost:8080/" | |
| }, | |
| "id": "KozaDRbYM8iV", | |
| "outputId": "373a1cc4-6a9b-4137-deb8-c9c2922f398c" | |
| }, | |
| "source": [ | |
| "pt = np.array([\r\n", | |
| " [0.0,0.0],\r\n", | |
| " [0.1230469,0.2],\r\n", | |
| " [0.2480469,0.4],\r\n", | |
| " [0.3730469,0.5],\r\n", | |
| " [0.4980469,0.6],\r\n", | |
| " [0.6231689,0.7],\r\n", | |
| " [0.7481689,0.8],\r\n", | |
| " [0.8731689,0.9],\r\n", | |
| " [1.0,1.0],\r\n", | |
| "],dtype=np.double)\r\n", | |
| "\r\n", | |
| "x = pt.T[0]\r\n", | |
| "y = pt.T[1]\r\n", | |
| "\r\n", | |
| "data = pd.DataFrame.from_dict({'x': x})\r\n", | |
| "\r\n", | |
| "print(data)" | |
| ], | |
| "execution_count": 3, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "text": [ | |
| " x\n", | |
| "0 0.00\n", | |
| "1 0.10\n", | |
| "2 0.20\n", | |
| "3 0.30\n", | |
| "4 0.40\n", | |
| "5 0.41\n", | |
| "6 0.42\n", | |
| "7 0.46\n", | |
| "8 0.50\n", | |
| "9 0.51\n", | |
| "10 0.52\n", | |
| "11 0.53\n", | |
| "12 0.60\n", | |
| "13 0.70\n", | |
| "14 0.80\n", | |
| "15 0.90\n", | |
| "16 1.00\n" | |
| ], | |
| "name": "stdout" | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "colab": { | |
| "base_uri": "https://localhost:8080/" | |
| }, | |
| "id": "UjKQlB2vM-cY", | |
| "outputId": "ac1f453f-4303-4d9c-96d7-012415f1115e" | |
| }, | |
| "source": [ | |
| "order = 4\r\n", | |
| "pf = PolynomialFeatures(degree=order, include_bias=True)\r\n", | |
| "weights = pf.fit_transform(data)\r\n", | |
| "weight_values = pd.DataFrame(weights, columns=pf.get_feature_names(data.columns))\r\n", | |
| "print(weight_values)" | |
| ], | |
| "execution_count": 4, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "text": [ | |
| " 1 x x^2 x^3 x^4\n", | |
| "0 1.0 0.00 0.0000 0.000000 0.000000\n", | |
| "1 1.0 0.10 0.0100 0.001000 0.000100\n", | |
| "2 1.0 0.20 0.0400 0.008000 0.001600\n", | |
| "3 1.0 0.30 0.0900 0.027000 0.008100\n", | |
| "4 1.0 0.40 0.1600 0.064000 0.025600\n", | |
| "5 1.0 0.41 0.1681 0.068921 0.028258\n", | |
| "6 1.0 0.42 0.1764 0.074088 0.031117\n", | |
| "7 1.0 0.46 0.2116 0.097336 0.044775\n", | |
| "8 1.0 0.50 0.2500 0.125000 0.062500\n", | |
| "9 1.0 0.51 0.2601 0.132651 0.067652\n", | |
| "10 1.0 0.52 0.2704 0.140608 0.073116\n", | |
| "11 1.0 0.53 0.2809 0.148877 0.078905\n", | |
| "12 1.0 0.60 0.3600 0.216000 0.129600\n", | |
| "13 1.0 0.70 0.4900 0.343000 0.240100\n", | |
| "14 1.0 0.80 0.6400 0.512000 0.409600\n", | |
| "15 1.0 0.90 0.8100 0.729000 0.656100\n", | |
| "16 1.0 1.00 1.0000 1.000000 1.000000\n" | |
| ], | |
| "name": "stdout" | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "colab": { | |
| "base_uri": "https://localhost:8080/" | |
| }, | |
| "id": "8_1fIg89Slib", | |
| "outputId": "3877b390-47af-4a06-90ff-2dda52de941a" | |
| }, | |
| "source": [ | |
| "retval, dst = cv2.solve(np.array(weights),np.array(y),flags=cv2.DECOMP_SVD)\r\n", | |
| "hyperparameter = dst.T[0]\r\n", | |
| "hyperparameter_values = pd.DataFrame([hyperparameter], columns=list(weight_values.columns))\r\n", | |
| "print(hyperparameter_values)" | |
| ], | |
| "execution_count": 5, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "text": [ | |
| " 1 x x^2 x^3 x^4\n", | |
| "0 -0.000567 2.060142 0.280604 -3.302395 1.960334\n" | |
| ], | |
| "name": "stdout" | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "colab": { | |
| "base_uri": "https://localhost:8080/" | |
| }, | |
| "id": "H3777KzLUIbU", | |
| "outputId": "0f4605ca-c7f3-4fb6-f9ee-29580ea58103" | |
| }, | |
| "source": [ | |
| "new_data = pd.DataFrame.from_dict({\r\n", | |
| " 'x': x,\r\n", | |
| " 'y1': y,\r\n", | |
| " 'y2': model(x, hyperparameter),\r\n", | |
| "})\r\n", | |
| "\r\n", | |
| "print(new_data)" | |
| ], | |
| "execution_count": 6, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "text": [ | |
| " x y1 y2\n", | |
| "0 0.00 0.00 -0.000567\n", | |
| "1 0.10 0.20 0.205147\n", | |
| "2 0.20 0.40 0.399403\n", | |
| "3 0.30 0.60 0.569444\n", | |
| "4 0.40 0.70 0.707218\n", | |
| "5 0.41 0.71 0.719051\n", | |
| "6 0.42 0.72 0.730523\n", | |
| "7 0.46 0.73 0.772806\n", | |
| "8 0.50 0.80 0.809377\n", | |
| "9 0.51 0.82 0.817646\n", | |
| "10 0.52 0.83 0.825572\n", | |
| "11 0.53 0.87 0.833159\n", | |
| "12 0.60 0.90 0.877278\n", | |
| "13 0.70 0.91 0.916983\n", | |
| "14 0.80 0.93 0.939260\n", | |
| "15 0.90 0.96 0.959580\n", | |
| "16 1.00 1.00 0.998118\n" | |
| ], | |
| "name": "stdout" | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "colab": { | |
| "base_uri": "https://localhost:8080/", | |
| "height": 265 | |
| }, | |
| "id": "-eBumcbrUr3O", | |
| "outputId": "0a6fad6d-c05c-4fd6-a10b-b18dd21b61a5" | |
| }, | |
| "source": [ | |
| "x = np.array(range(1000)) / 1000\r\n", | |
| "y = model(x, hyperparameter)\r\n", | |
| "\r\n", | |
| "plt.clf()\r\n", | |
| "plt.plot(new_data[\"x\"],new_data[\"y1\"], c=\"k\")\r\n", | |
| "plt.plot(x,y, c=\"r\")\r\n", | |
| "plt.show()" | |
| ], | |
| "execution_count": 7, | |
| "outputs": [ | |
| { | |
| "output_type": "display_data", | |
| "data": { | |
| "image/png": "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\n", | |
| "text/plain": [ | |
| "<Figure size 432x288 with 1 Axes>" | |
| ] | |
| }, | |
| "metadata": { | |
| "tags": [], | |
| "needs_background": "light" | |
| } | |
| } | |
| ] | |
| } | |
| ] | |
| } | 
  
    Sign up for free
    to join this conversation on GitHub.
    Already have an account?
    Sign in to comment