반응형

+ csc x의 적분



분자 분모에 csc(x)-cot(x)를 곱한다.










+ csc x의 적분2


-> 제곱의 형태로 만들어 다른 삼각함수로 변경한다. 


-> 부분분수로 쪼갠다.


--> 분모를 단항으로 만들기 위해 1+cos(x)를 분자,분모에 곱한다.






'Math' 카테고리의 다른 글

적분팁 (Integration Tip). 이것만 알아도 적분속도향상.  (3) 2019.03.29
integral sec(x)  (0) 2019.03.28
최소제곱법  (0) 2019.03.26
[선형대수] 프로젝션, 최소제곱법  (0) 2019.03.26
[미분] 미분  (0) 2017.05.08
반응형


+최소제곱법

샘플데이터들을 최대한 근사할 수 있는 하나의 직선이나 평면으로 모델링하여 다른 샘플들도 모델링한 시스템으로 예측할 수 있다.

실제 해(샘플데이터)와 모델이 예측한 결과와의 차이가 최소가 되게하는 방식.

샘플데이터 (x, Y)

y=ax+b 인 모델로 예측. 

에러값을  오차^2의 합으로 한다.  (Y-(ax+b))^2 으로 해야 맞는데, 제곱이므로 상관없다.

J(Cost) =  

위 Cost Function을  a, b로 각각 편미분하여 0이 되도록 한다. 최적화 문제.  (위 cost function이 convex 형태이기 때문에 가능하다. 아니면 local minima 문제가 있음.)



위 식을 정리하면

 : 1번식 

   : 2번식

2식을 n으로 나누면

   : 3번식

3번식에서 b를 구해 번식에 대입한다.

a로 묶어주면

양변을 n으로 나눠주면

a를 뺀 왼쪽부분을 잘 보면 (제곱의 평균 - 평균의 제곱)이다.  어디서 많이 본 형태이다. 이것은 x의 분산이다.

분산은 또 편차 제곱의 평균이다. 즉, 왼쪽 부분을  다르게 표현하자면 아래와 같다... (전개해서 계산하면 똑같다는 것을 알 수 있다.)

양변에 n을 곱하면 

오른쪽 부분을 정리하면 = Sigma (xy) - n * m_x * m_y
= Sigma (xy) + ( -n -n +n ) * m_x * m_y
 Sigma (xy) - m_y*n*m_x - m_x *n * m_y + m_x m_y n
 = Sigma (xy) - m_y Sigma(x) - m_x Sigma(y) + m_x m_y Sigma(1)
= Sigma (  xy  - x m_y - y m_x + m_x m_y )
= Sigma ( (x- m_x ) ( y - m_y ) ) 

따라서 a를 구할 수 있다.

a의 의미를 보자면, 

a= 편차곱의 합 / 편차제곱의 합

같은 값으로 분자 분모를 각각 n으로 나누게 되면 

a = 편차 곱의 평균 / x의 편차제곱의 평균이 되고, 이것은 

   =  x,y 공분산 / x의 분산.

결국 a 는 공분산을 x의 분산으로 나눈 값이된다.


a를 구한다음에는  b를 쉽게 구할 수 있다.  (3번식에 대입)



+예제)  임의의  점 7개를 생성. (black box 모델을 임의로 만들고 노이즈를 추가하였음.)

[Python Code]

import numpy as np
import matplotlib.pyplot as plt

# some data
x=np.random.rand(7)*10
print('x=',x)

# black box + noise
y=x*1.5 + np.random.rand(len(x))*3
print('y=', y)

# model : y = ax + b
mx = np.average(x)
my = np.average(y)

print('mx=', mx, ' my=', my)
a1=np.average((x-mx)*(y-my))
a2=np.average(np.power((x-mx), 2))
a=a1/a2
b=my - a * mx
print('a=',a, 'b=',b)

plt.figure()
plt.scatter(x,y, marker='o', c='blue')

# predict
newx=np.arange(0, 10, 0.2)
yy = a*newx + b
print('predict yy=', yy)
plt.scatter(newx,yy, marker='+', c='red')

plt.show()
[결과]
x= [ 5.91242894  8.31159962  5.84424276  1.6816099   3.96831144  5.44434753
  4.99976856]
y= [ 11.3111561   14.27345181   9.25338631   4.42757815   7.11410915
   8.43423682   7.51826014]
mx= 5.16604410833  my= 8.90459692524
a= 1.49495983563 b= 1.18156847417

임의의 파란점을 기반으로 최소제곱법으로 주어진 모델로 추정선을 만들어 그림.







'Math' 카테고리의 다른 글

integral sec(x)  (0) 2019.03.28
integral csc(x)  (0) 2019.03.27
[선형대수] 프로젝션, 최소제곱법  (0) 2019.03.26
[미분] 미분  (0) 2017.05.08
[적분] 곡선의 길이 계산2  (0) 2017.05.08
반응형


+ Projection / 프로젝션 / 투영

a벡터에 b벡터를 프로젝션시키면, b에서 a로 수선의 발을 내린다.  

project b onto a 라고 표현. (b를 a에 수직으로 내림. 수직으로 내리면 최단거리가 됨.)

수선의 발을 p라 하면. p점은 a 선상에 있고 p벡터를 a벡터의 상수배로 볼 수 있다.

   

b벡터 끝에서 p벡터에 가는 벡터와 a 벡터는 수직이다. 따라서 

수직인 벡터의 내적은 0이다. 열벡터에서 내적은 transpose의 곱으로 표현.

   ,     

여기서 매트릭스 연산식으로 바꾸고, 파라미터를 b로 보고 시스템을 꺼내보면. 프로젝션한 포인트 p는 

    ,    


이렇게 된다. 프로젝션 시스템 P는

이 변환 시스템이 어떤 점을 a 벡터로 프로젝션시키는 시스템이다.


프로젝션의 의미?

project b onto a (b를 a로 프로젝션 시킨다.)

     여기에서 는  a,b의 내적이다.  b를 a에 내린 사영의 크기 * a벡터의 크기이고,      는  a벡터 / a 벡터크기의 제곱.  즉, a 방향의 단위벡터 / a벡터의 크기가 되고,  이 둘을 곱하면  a벡터 크기 부분이 없어지므로  a 방향이고, 크기가 b를 a에 내린 사영의 크기인 벡터가 된다. 즉, 프로젝션이 된다.

b벡터에서 a벡터의 성분을 얼만큼 갖고있는지를 나타냄. 내적은 닮은 정도를 나타내기도 한다. 해당 성분이 얼만큼 있는지 나타내므로 닮은 정도이기도 하다. ( 내적이 a b cos (theta) 라는 의미를 생각해 보면 알 수 있다. 닮은 정도를 cos 유사도로 표현하는 것도 비슷하다. 두 벡터의 사이 각도가 0에 가까울 수록 비슷하고 cos값이 최대가 된다. 반대 방향으로 갈수록 작아진다.) 



+ 벡터의 투영과 최소 제곱

벡터와 평면이 수직인가를 알려면? 평면을  구성하는 기저벡터를 구하여 해당 벡터와 모두 수직인지 확인하면 된다.

임의 평면 x+2y+3z=0 의 기저 벡터를 구하려면?

위 방정식을 만족하는 독립인 벡터 두 개를 구하면 된다.

[1 1 1 ], [3 0 1]

위 두 개 벡터로 위 평면위의 모든 점을 스팬할 수 있다.

A는 위 기저벡터를 컬럼벡터로 하는 매트릭스로 어떤 시스템으로 볼 수 있다.

Ax는 위 평면위의 임의의 점이다. 기저벡터들의 선형결합으로 구성된 평면위의 점을 가리키는 벡터.

만약  평면 밖에 있는 b벡터를 A 평면에 내부의 벡터로 가장 가깝게 표현하려면??? 프로젝션!

즉, ||Ax-b||^2이 최소값이 되도록 한다. 최소제곱법.


Ax-b 벡터는 A 평면과 수직이다. 여기서 Ax는 b를 A 평면위에 프로젝션한 벡터이다. --> 최단 거리 지점.

b를 A에 프로젝션한 결과 : 




+ 실전

그렇다면 여러 점들을 가장 최적의 라인(또는 평면) 하나로 표현하려면?

측정값: (x1,y1), (x2,y2), (x3, y3), ...

피팅라인: y=ax+b   : 구하고자 하는 값 (a,b)

y1=ax1+b

y2=ax2+b

..

위 식을 모두 만족하는 a,b는 보통 존재하지 않는다. 다만 거리가 최소가 되도록 최적화된 라인을 찾을 수는 있다.

A x = b ( 왼쪽의 b는 위의 a,b 게수의 b와는 다른 것. y1,y2,y3를 말함)

x를 구하는 문제의 방정식을 만든다.

||Ax-b||^2 이 최소가 되게 하는 해를 구한다.

최소 거리를 만드는 문제는 프로젝션이다.

스페이스 밖의 점 b, 시스템은 A,   Ax는 b를 A에 프로젝션한 A 내부의 최적화된 점(p, 프로젝션)이 된다.

여기서 x를 구하면 최적화된 방정식의 계수인 a,b가 나온다.


) (x1,x2) -> y    이러한 함수가 y=ax1+bx2+c 이 모델로 만들어진다고 한다. 아래 점들에 최대한 근사한  평면으로 표현하라면 최적의 계수 a,b,c?

(0,0) -> 1

(2,2)->6

(1,4)->2

(4,6)->10



A=np.array([[0,0,1],[2,2,1],[1,4,1],[4,6,1]])

b=np.array([[1],[6],[2],[10]])

np.dot( np.dot( np.linalg.inv( np.dot(np.transpose(A), A)), np.transpose(A) ) , b)

Out[72]: 

array([[ 3. ],

       [-0.5],

       [ 1. ]])



+ python source  

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D


A=np.array([[0,0,1],[2,2,1],[1,4,1],[4,6,1]])
b=np.array([[1],[6],[2],[10]])

x = np.dot( np.dot( np.linalg.inv( np.dot(np.transpose(A), A)), np.transpose(A) ) , b)

print('A=',A)
print('b=',b)
print('x=',x)

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

ax.scatter(A[:,0], A[:,1], b[:,0], marker='o', label='sample')

ax.set_xlabel('x1')
ax.set_ylabel('x2')
ax.set_zlabel('Y')
y = x[0]*A[:,0] + x[1]*A[:,1]+ x[2]
print('y=', y)
ax.scatter(A[:,0], A[:,1], y, marker='+', label='fitting')

# predict plane
x1=np.arange(0, 7, 0.2)
x2=np.arange(0, 7, 0.2)
x1,x2 = np.meshgrid(x1,x2)
Y = x[0]*x1 + x[1]*x2+ x[2]
ax.plot_surface(x1, x2, Y, alpha=0.2)


ax.legend()

plt.show()




파란점이 샘플 포인트이고 샘플 포인트에 최적화된 평면을 찾아 그 평면으로 다시 샘플포인트의 값을 추정하여 +로 표시하였음.   (거의 일치)

이렇게 프로젝션을 이용하여 최적화 할 수 있다. 


'Math' 카테고리의 다른 글

integral csc(x)  (0) 2019.03.27
최소제곱법  (0) 2019.03.26
[미분] 미분  (0) 2017.05.08
[적분] 곡선의 길이 계산2  (0) 2017.05.08
[적분] 곡선의 길이 계산  (0) 2016.09.06
반응형

파이썬에서 간단하게 랜덤 스트링 만들기



import string
import random

def random_string(size=6, chars=string.ascii_lowercase+string.digits):
return ''.join(random.choice(chars) for _ in range(size))



print( random_string(6) )
print( random_string(6) )
print( random_string(6) )

-위 함수에 파라미터로 랜덤스트링 길이를 넣어주면 된다.

-random.choice()는 내부에 아무 원소를 랜던하게 하나 뽑아준다.

-chars는 아래 정의된 값들을 사용.

-string.ascii_lowercase

Out[5]: 'abcdefghijklmnopqrstuvwxyz'

-string.digits

Out[6]: '0123456789'




반응형


+matplotlib subplot 화면분할 grid로 분할하기

HTML의 테이블의 TR, TD, colspan, rowspan 하듯이 그리드로 서브 플롯을 구성할 수 있다.


예제)

import matplotlib.pyplot as plt

import numpy as np


plt.figure(figsize=(15,8))

plt.subplots_adjust(hspace=0.5, wspace=0.4)

gridshape=(4,3)
loc=(0,0)

plt.subplot2grid(gridshape, loc, colspan=2)
plt.plot(np.arange(0,10,1), np.random.randint(0,10,10))

loc=(0,2)
plt.subplot2grid(gridshape, loc, rowspan=2)
plt.plot(np.arange(0,10,1), np.random.randint(0,10,10))

loc=(1,0)
plt.subplot2grid(gridshape, loc)
plt.plot(np.arange(0,10,1), np.random.randint(0,10,10))

loc=(1,1)
plt.subplot2grid(gridshape, loc )
plt.plot(np.arange(0,10,1), np.random.randint(0,10,10))

loc=(2,0)
plt.subplot2grid(gridshape, loc)
plt.plot(np.arange(0,10,1), np.random.randint(0,10,10))

loc=(2,1)
plt.subplot2grid(gridshape, loc)
plt.plot(np.arange(0,10,1), np.random.randint(0,10,10))

loc=(2,2)
plt.subplot2grid(gridshape, loc)
plt.plot(np.arange(0,10,1), np.random.randint(0,10,10))

loc=(3,0)
plt.subplot2grid(gridshape, loc, colspan=3)
plt.plot(np.arange(0,10,1), np.random.randint(0,10,10))


plt.show()


결과)





'Python' 카테고리의 다른 글

[Python] enum  (0) 2019.03.28
랜덤스트링 만들기  (0) 2019.03.22
File I/O, Directory list, read/write  (0) 2018.07.04
WebAPI thread work status  (0) 2018.07.03
Python BeautifulSoup 웹크롤링/HTML 파싱.  (0) 2018.04.25
반응형

+SVM (support vector machine)을 사용하여 간단하게 바이너리 분류하기


간단하게 말하면 가장 마진이 크도록 최적의 구분 라인 긋기. 약간의 판단 오류가 있더라면 데이터의 밀집 분포 정도에 따라 최적의 라인은 다를 수 있다. 판단오류가 하나도 없도록(과적합) 구분 라인을 만들면 오히려 임의의 값 예측시 정확도가 더 떨어질 수 있다. 


X 데이터 : 피쳐2개. 

Y데이터 : 라벨 (0, 1) binary 분류값.

SVM으로 최적 구분 라인 계산.

임의의 값에 대해 Y데이터 예측하기.


from sklearn.svm import SVC
import matplotlib.pyplot as plt
import numpy as np

# line split SVM

X = np.array([[1,2],
[5,8],
[1.5,1.8],
[8,8],
[1,0.6],
[9,11]])
y = [0,1,0,1,0,1]
clf = SVC(kernel='linear'1.0# C is error penalty. if C is bigger then more strictly but margin will be narrow...
clf.fit(X,y)
print(clf.predict([[0.58,0.76]]))
print(clf.predict([[10.58,10.76]]))

w = clf.coef_[0]
print(w)
a = -w[0] / w[1]

xx = np.linspace(0,12)
yy = a * xx - clf.intercept_[0] / w[1]

h0 = plt.plot(xx, yy, 'k-'label="non weighted div")

plt.scatter(X[:, 0], X[:, 1], = y)
plt.legend()
plt.show()

[해설]
x데이터의 벡터는 2차원이고 구분 레이블은 y로 0, 1로 두 그룹으로 나눈다.
SVC의 리턴값으노 clf로 피팅을 하게 되면
clf.predict()로 입력값 x에 대한 구분 레이블 y를 예측할 수 있다.

x데이터의 벡터요소(피쳐)를 x0, x1라 하면
새로운 좌표계의 1차원 좌표축을 z라하면
z = f (x0, x1) 
z>=0 이면 레이블1, z<0이면 레이블 0가 될 것이다. (z=0이면 1일까? 맞다.)

clf의 coef_로 w0, w1를 얻고, intercept로 b를 얻는다.
w0, w1는 입력값의 가중치. b 는 bias

z = w0*x0+w1*x1 + b 가 된다.
따라서 위 라인 (z=0으로 놓는다.)을 기준으로 분류한다.

위 라인을 x1(Y축)에 대해 정리하면
기울기는 -w0/w1
y절편은 -b/w1가 된다.
이 라인이 구분선이 된다.





반응형



+ 스마트포인터 (Smart Pointer) shared_ptr


동적으로 할당된 메모리를 관리하기 용이하다.
동작개념; 모든 것을 스택에 두어 로컬 변수로 관리하면 대부분의 메모리 문제가 해결된다는 것을 이용한다.
스택에 저장된 메모리는 스콥을 벗어나면 자동 해제되어 안전하다.

스콥을 벗어날때 참조된 메모리를 해제한다. unique_ptr 이 이러한 방식.
그러나 포인터를 복사하여 참조할 수 도 있어서 가장 마지막에 사용하는 곳에서 메모리 해제를 해야되는데, 트래킹을
하든지 해야된다. 참조가 0이되면 그 때 실제 해제되는 것이다. shared_ptr 이 이러한 방식.

C++표준 이전에는 auto_ptr을 사용했으나 폐기예정. (STL에서 사용시 문제 발생) 사용하면 안 됨.
C++11의 새로운 스마트 포인터는 unique_ptr, shared_ptr 이다.

unique_ptr ; 스코프 방식
shared_ptr ; 레퍼런스 카운팅 방식

-동적으로 메모리 할당한 객체라면 스택변수 shared_ptr에 항상 저장하라!
-동적메모리는 new든 malloc이든 할당과 동시에 shared_ptr에 저장하라!     

결국은 c++11에서는 항상 shared_ptr을 써라!!!


void leak(){
Simple *myptr = new Simple();
myptr->go();
} // 메모리 누수 발생. delete가 빠졌다.


#include <memory>
void noleak() {
shared_ptr<Simple> smartptr(new Simple() );
smartptr->go();
}     // 메모리 자동 해제.!!!!!!!!!!!


-스마트 포인터 사용 방법
shared_ptr<Simple> smartptr(new Simple() );
or
auto smartptr = make_shared<Simple>();


-주의!  shared_ptr을 한 객체에 하나만 생성해야 한다. 그렇지 않으면 중복해제가 됨. !! Warning!!

void a() {
Nothing *my = new Nothing();
shared_ptr<Nothing> sp1( my ) ;
shared_ptr<Nothing> sp2( my ) ;
}
// 에러위험. 위 함수가 실행되면, my객체의 constructor 1번 호출, destructor 2번 호출된다.

void a() {
Nothing *my = new Nothing();
shared_ptr<Nothing> sp1( my ) ;
shared_ptr<Nothing> sp2 = sp1 ;     // sp를 대입해서 참조해야 한다.
}
// ok. 위 함수가 실행되면, my객체의 constructor 1번 호출, destructor 1번 호출된다.





반응형


+ const와 pointer 헛갈림 주의!
pointer(*) vs const pointer( *const )
포인터냐 콘스트 포인터냐?

주소를 보호하는 걸까 데이터를 보호하는 걸까? 
const뒤에 오는 것이 중요! *p면 값 보호, p면 주소 보호.
또는 영어로 코드를 거꾸로 읽으면 간단하다.


1)  값의 보호 ; const 뒤에 *가 있다.   (많이 사용. 값의 보호가 주로 목적)

  • 그냥 포인터임. p is a pointer. p앞에 *가 있다.
const char *p =&xxx;          ====> const 뒤에 *가 있으면 값의 보호다.
char const *p = &xxx ;  (상동!) ==> const 뒤에 *가 있으면 값의 보호다.

변수 p 바로 앞에 *가 있으면 그냥 일반 포인터가 된다. (const pointer가 아니라 일반 포인터일뿐) 
포인터가 가리키는 타입이 const char ; 값 보호.
p is a pointer to  const char/char const(same) ; 코드를 거꾸로 읽으면 이렇게 됨.
*p=1;            // error!!  const로 지정된 값 보호.  값 변경 불가.
p=&yy ;          // ok!  주소가 변경됨.


2) 주소 보호 ; const 뒤에 *가 없음. 앞에 있음. (많이 쓰이지 않음. 선언과 동시에 초기화 필요.)

  • 콘스트 포인터임. const pointer​  (*const). 포인터 보호.
int *const p = &xxx ;     
int *const p ;    ==> 에러! 초기화를 해줘야 한다. 왜? 변경불가이기 때문에...

변수 p 바로 앞에 *가 없으면 앞을 묶어서 타입으로 봐야 한다. *const 이므로 const pointer 가 된다. (일반 포인터가 아니다.)
p is a const pointer(*) to int. ; 코드를 거꾸로 읽으면 이렇게 됨.

*p=1;            // ok 값 변경.
p=&yy ;          // error! 주소변경 불가.


3)  값과 주소 둘 다 보호
const int *const p=&xxx;
p is a const pointer(*) to const int. 
*p = 1 ;     // error
p = &yy;     // error


즉, *가 어디에(변수에? or const에?)  붙었나 살펴보거나, 코드를 뒤에서 부터 읽으면 된다.



반응형



++ Linear Regression with multi-variables
X의 feature들이 여러 개 x1, x2, ...

import tensorflow as tf
# y = x1*2+x2+x3 training
# W => 2,1,1, b=0
x_train = [[1,2,3],[2,3,4],[3,4,5],[4,5,6], [1,3,5]]
y_train = [[7],[11],[15],[19], [10]]

#placeholder
x = tf.placeholder(tf.float32, shape=[None,3])
y = tf.placeholder(tf.float32, shape=[None,1])
# variables
W = tf.Variable(tf.random_normal(shape=[3,1]), name='W')
b = tf.Variable(tf.random_normal(shape=[1]), name='b')

# model
hypothesis = tf.matmul(x, W) + b
cost = tf.reduce_mean( tf.square(hypothesis-y) )
# train
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01)
train = optimizer.minimize(cost)
sess = tf.Session()
sess.run(tf.global_variables_initializer())
# test
# hres= sess.run(hypothesis, feed_dict={x:x_train, y:y_train})
for i in range(3001):
    _, pcost, _W, _b= sess.run([train, cost, W, b], feed_dict={x:x_train, y:y_train})
    if i%500==0:
        print (i, pcost, _W, _b)

# test
print( sess.run(hypothesis, feed_dict={x: [[4, 2, 3]]}))





반응형



1. Linear Regression 

++ single attribute . 

H(x) = x*W + b
cost(W,b) = 1/m * 오차제곱의 합  =   오차제곱의 평균. (편차제곱의 평균은 분산이다.)
   = 1/m * Sigma(  (H(x)-y)^2  )                    # cost함수를 여기에다가 1/2을 곱하여 사용하기도 한다. 그 때의 미분결과는 아래에 2*가 없어진다.
dJ/dW = 2* (1/m) * Sigma(  (H(x)-y) x )
#train
W := W - alpha* dJ/dW

x_train=[1,2,3]
y_train=[1,2,3]

W=tf.Variable(tf.random_normal([1]), name='weight')
b = tf.Variable(tf.random_normal([1]), name="bias')
hypothesis = x_train * W + b

cost = tf.reduce_mean(  tf.square(hypothesis - y_train) )

optimizer = tf.train.GradientDescentOptimizer( learning_rate=0.1 )
train = optimizer.minimize(cost)

sess = tf.Session()
sess.run( tf.global_variables_initializer())
for step in range(2001):
     sess.run(train)
     if step%100==0:
          print(step, sess.run(cost), sess.run(W), sess.run(b) )

+ 예측 
print ( sess.run( hypothesis , {X:[100]} ) )



+ Recent posts