회귀 곡선과의 거리에 따른 점 색칠

목적


  • 회귀 분석에서 구한 직선이나 곡선으로부터의 거리에 따라,
    플롯하는 점의 색, 농도를 바꾼다.
  • 거리 분포를 다른 그림에서 시각화합니다.

  • 코드



    example.py
    import numpy as np
    import matplotlib.pyplot as plt
    import seaborn as sns
    sns.set()  #図がきれいに描画出来るおまじないらしい、私はいつも使っている
    
    amp = 100    #振幅
    frequency = 0.02     #周波数
    offset = 1000       #オフセット
    
    t = np.linspace(0,100,1000)
    y_ = amp*np.sin(2*np.pi*frequency*t)+offset  #理論値=回帰曲線sin
    y = np.random.poisson(y_)    #観測値=誤差付きsin
    
    ###メイン###
    dis = abs( y_ - y )/ y_.max()   #理論値と観測値の差を0.0~1.0の値にスケーリング
    color_list=[ [1-9*i,0,i*9,i*5] for i in dis ]   #RGBの値で色を指定
    
    f = plt.figure(figsize = (12,6))
    f.add_subplot(121)
    plt.scatter(t,y_)
    plt.xlabel('t')
    plt.ylabel('y')
    
    f.add_subplot(122)
    plt.scatter(t,y,color = color_list)    
    plt.xlabel('t')
    plt.ylabel('y')
    

    결과





    해설



      우선, 데이터에 대해서이지만, 각 시각의 sin파의 값을 np.random.poisson(y_) 에 대입하는 것으로,
    y는 오차가 평균 y_ 인 poisson 분포를 따르는 sin 파입니다. 따라서 큰 값에서는 오차가 커지고 작은 값에서는 오차가 작습니다.
     
    이번 메인 그라데이션은 보시다시피 for 문을 사용하여 색상을 지정하고 있습니다. matplotlib에서는 색 지정을 [R, G, B, 농도] = [r, g, b, c]로 지정할 수 있습니다. 다만, r, g, b, c는 0.0~1.0의 값을 취한다.
    이 구조를 이용하여 근거리에서는 색이 얇고 원거리에서는 진해지도록 사칙연산을 했다.
    이번 예에서는 근거리에서는 얇은 빨강, 원거리에서는 짙은 청색으로 되어 있다.

    주의점


  • RGB값은 0.0~1.0이어야 하므로 계수로 이 범위로 조정을 하여야 한다.
  • 회귀곡선(회귀직선) 부근은, 당연히, 점이 많기 때문에, 상당히 얇게 하지 않으면, 점이 겹치고, 밀도가 높은지 거리가 가까운지 구별할 수 없다.

  • 응용



    이번 색 지정은 회귀 곡선으로부터의 거리를 다른 도면에서도 가시화할 수 있다.
    방금 전의 코드를 조금 변경해, 시간이 진행됨에 따라 오차가 커지는 경우를 생각한다. (코드는 후술)
    가로축 t, 세로축 y, 가로축 y_, 세로축 y의 그림을 고려하면,



    왼쪽 그림에서 한눈에 거리(오차)의 증가를 확인할 수 있다. 오른쪽 그림에서 y와 y_의 거리는 y_와의 상관이 있음을 알 수 있습니다.
    따라서 플롯 할 축을 변경하면 데이터에 대한 이해를 더욱 향상시킬 수 있습니다.
    관측치 y를 결정하는 파라미터가 많아지면, 보다 다양한 견해를 즐길 수 있다.

    변경 코드



    example2.py
    
    import numpy as np
    import matplotlib.pyplot as plt
    import seaborn as sns
    sns.set()
    
    amp=100   #振幅
    frequency=0.02 #周波数
    offset=1000     #バイアス
    t=np.linspace(0,100,1000)
    y_=amp*np.sin(2*np.pi*frequency*t)+offset
    
    y=np.random.poisson(y_+2.6*t)   ###変更行###
    
    dis=abs(y_-y)/y_.max()
    color_list=[[1-3*i,0,3*i,i] for i in dis]    ###変更行###
    
    f=plt.figure(figsize=(12,6))
    f.add_subplot(121)
    plt.scatter(t,y,color=color_list)    
    plt.xlabel('t')
    plt.ylabel('y')
    
    f.add_subplot(122)
    plt.scatter(y_,y,color=color_list)
    plt.xlabel('y_')
    plt.ylabel('y')
    

    추가분



    시간과 이론값 y_의 비교

    접힌 색의 농도는 아마 점의 고밀도 때문입니다.

    좋은 웹페이지 즐겨찾기