[태그:] 근사함수

  • linear approxmation

    python으로 데이터를 근사 함수로 바꾸는 명령이 있다. polyfit. 대박이다!

    Python 3.5.2 (default, Jul 10 2019, 11:58:48) 
    [GCC 5.4.0 20160609] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import numpy as np
    >>> x=np.arange(0,4)
    >>> y=np.array([0,1,1.9,3.1])
    >>> np.polyfit(x,y,1)
    array([ 1.02, -0.03])
    >>> np.polyfit(x,y,2)
    array([0.05, 0.87, 0.02])

    인터넷에서 구한 sine 데이터로 근사 함수를 구해봐야 겠다.

    #_*_ coding: utf-8 _*_
    import matplotlib
    matplotlib.use('Agg')
    
    import numpy as np
    from sklearn.preprocessing import PolynomialFeatures
    
    import csv 
    import tensorflow as tf
    import matplotlib.pyplot as plt 
    import pandas as pd
    
    from keras.models import Sequential
    from keras.layers import Dense
    from keras.layers import Dropout
    from keras.callbacks import ModelCheckpoint
    
    print ("Package Loaded")
    print ("데이터로 함수 근사하기")
    
    ipd = pd.read_csv("./sine.csv")
    print (ipd.head())
    print (ipd.shape)
    
    #column 선택.
    time=ipd.iloc[:,0].array
    sineValue=ipd.iloc[:,1].array
    #print(type(time))
    #print(time)
    #print(time)
    #print(sineValue)
    approxFunc = np.polyfit(time,sineValue,6, full=False)
    print(approxFunc)
    

    처음에 5,000개를 모두 시키니 애가 이상한 짓을 한다. 사인 웨이브 크기가 1이고 0.001 단위로 쪼갰다. 파랑색 선이 내가 예상한 그림인데 애가 작고 너무 티 안나게 그렸다. 오차를 줄이려 노력하다 보니 아무것도 아닌 그래프를 그렸다.

    이번에는 앞에 몇 개 잘랐다.

    tf-docker /home/tensorflow/tutorial/ItnSensor > cat sine.csv
    0,0.841470985
    0.001,0.873736397
    0.002,0.90255357
    0.003,0.927808777
    0.004,0.949402346
    0.005,0.967249058
    0.006,0.98127848
    0.007,0.991435244
    0.008,0.997679266
    0.009,0.999985904
    0.01,0.998346054
    0.011,0.992766189
    0.012,0.983268329
    0.013,0.969889958
    0.014,0.952683874
    0.015,0.931717983
    0.016,0.907075026
    0.017,0.878852258
    0.018,0.847161063
    0.019,0.812126509
    0.02,0.773886863
    0.021,0.73259304
    0.022,0.688408006
    0.023,0.64150614
    0.024,0.592072543
    0.025,0.540302306
    0.026,0.486399742
    0.027,0.430577581
    0.028,0.373056127
    0.029,0.314062391
    0.03,0.253829194
    0.031,0.192594249
    0.032,0.130599223

    이렇게 하면 좀 비슷하게 그린다. 입력으로 준 수치가 (0.032, 0.1305..)에서 끊어져 애는 끝까지 아래로 간다고 생각하나 보다.

    특정 부분을 보고 특징을 뽑아내야 하는데, 그냥 인공지능 하나 만들어서 하는게 낫다. 에러, 정확도가 얼마인지도 모르겠다.