스트링으로 저장된 dictionary나 list 들을 바꾸는방법



import ast


a = "{ 'a':1, ...  }"


d = ast.literal_eval(a)


b="['a','b']"


d = ast.literal_eval(b)


'python' 카테고리의 다른 글

jupyter notebook 비밀번호 변경  (0) 2021.09.28
python 오브젝트 함수,변수 리스트  (0) 2018.04.02
디렉토리 순회  (0) 2018.03.09
dictionary sort  (0) 2018.02.19
python2 utf8인코딩  (0) 2017.07.29
Posted by rjh
,
출처 - http://newsight.tistory.com/147



KL Divergence : 두 확률 분포 p,q 간의 차이를 계산하는 방법

즉 p,q의 크로스엔트로피에서 p의 엔트로피를 뺀 값.

D 는 두 확률 분포 p,q가 같을 때 0이 된다. (이는 jensen's 부등식으로 증명가능하다.)
즉 D 값이 클 수록 두 확률 분포

KL Divergence는 p,q사이의 차이를 나타내는 수치


Entropy : 확률 분포 p 에 담긴 불확실성을 나타내는 지표. 이 값이 클 수록 일정한 방향성과 규칙성이 없는 chaos를 뜻함. 정돈된 세계, 고차원적인 지능은 이 엔트로피가 낮아야만 가능함.

엔트로피는 p라는 대상을 표현하기위해 필요한 정보량


Cross Entropy : 두 확률 분포 p,q 사이에 존재하는 정보량을 계산하는 방법.

크로스 엔트로피는 p->q로 정보를 바꾸기위해 필요한 정보량을 의미한다.



- 뉴럴 넷에서의 Softmax, Cross-entropy

뉴럴 넷에서 3클래스 이상인 멀티클래스 문제에서는 softmax 를 사용해야한다. output 3개의 노드를 logistic regression 으로 각 클래스가 맞을 확률을 나타내는 것 보다, softmax 를 사용해 셋중에 오직 하나의 노드만을 가리키도록 제한을 두는 것이 더 강한 조건이며, 클래시피케이션에 더 적합하기 때문이다.

logistic regression 으로 각 클래스를 가리키면 이론상 모두 다 1,1,1 로 나타나는 경우도 가능한 반면 softmax는 반드시셋을 다합쳐서 1인, 확률로써 나타내야한다. 따라서 멀티클래스의 문제 세팅에는 softmax가 훨씬 더 잘 맞고 성능도 더 잘나온다.



Binary class에서 ouput 뉴런에 사용하는 logistic regression을 multi class에서는 softmax로 바꾸고
[ yk=시그모이드(WK) ---> yk=exp(z)/sum(expZ) ] 
Loss function LSE를 cross-entropy로 바꾸면
[ Error = 1/2 sum{yk-tk}^2 ---> Error = -P(t)*logQ(y)]
위 두식을 이용해 Error함수를 W로미분한 백프로퍼게이션 식이 서로 동일하다.


(수식 전개는 PRML 205쪽과 242쪽 참고)


이 때 Loss function은 [softmax일 경우 cross entropy]를 사용한다. 그러면 [logistic regression에서 Least Sqaured Error]을 사용한것과 동일한 백프로퍼게이션 식이 계산된다.

멀티클래스에서는 Loss function 이 cross entropy이고, 바이너리클래스에서는 least squared error이다.


뉴럴넷에서 cross entropy는 다음과 같이 해석한다.

D는 minibatch 사이즈를 의미하고, k는 클래스의 개수를 의미한다.
P(Td=k) 는 1 or 0의 값으로 학습할 데이터에서 y레이블이 one-of-K coding을 이용한 확률로 나타내어진 값이다.
P(Od=k) 는 [0,1]사이의 값으로 뉴럴 넷의 output 노드가 해당 클래스로 추론한 확률 값이다.

이 값을 잘 분석해 보면 결국 P(Td=k)값은 정답레이블일 때에만 1이고, 틀리면 항상 0의 값을 갖는다.

그러므로 [정답을 맞췄을 떄의 -logP(Od=k)] 값을 최소화시키는 방향으로 학습을 한다. 즉 정답 레이블을 100%의 확률로 예측하는 objective function 으로 학습하는 것이다.

이때 크로스앤트로피 = -{모델이 정답 레이블을 예측한 확률의 합} 이므로 따라서 Softmax 세팅에서는 굉장히 특수하게도 -log likelihood = Cross-entropy = Loss function 이 된다.



------------------------------보조자료-------------------------

Least Square Error는 확률적인 관점 없이, 오직 output값과 target값의 차이를 최소화 하는 것인 반면, Cross Entropy는 output과 target의 모든 변수들 간의 확률 차이를 측정한다.

2 class 문제라면, softmax를 통해 뉴럴 넷이 각 class로 예측한 확률을 알아낼 수 있다.
ex) 1번 클래스일 확률 = 0.7 / 2 번 클래스일 확률 = 0.3

그다음 target도 마찬가지로 각 class일 확률을 갖고 있다.
ex) 1번 클래스일 확률 = 1 / 2 번 클래스일 확률 = 0

그러면 두 확률에서의 cross entropy를 계산할 수 있다.


백프로퍼게이션에서의 미분 식은 둘이 같다. 식은 똑같지만, target과 output 값이 달라 성능이 훨씬 잘나온다.
코드에서는 output을 logistic regression에서 softmax로 바꿔주기만 하면 된다.

2클래스 classification문제의 output에 sigmoid를 쓰는것은 softmax와 동일하다. 또한 3클래스에서 sigmoid 나 linear을 쓰는 것은 잘못된 설계이다. Regression 일때는 output노드로 LSM+linear unit을 쓴다.


http://en.wikipedia.org/wiki/Kullback%E2%80%93Leibler_divergence
http://en.wikipedia.org/wiki/Cross_entropy
http://en.wikipedia.org/wiki/Jensen's_inequality


Posted by rjh
,

simple adjacency list

자료구조 2015. 5. 22. 15:27

#include <stdio.h>

#include <stdlib.h>


struct node

{

int end;

int w;

struct node* next;

};


struct node** adjlist;

int node_cnt=5;


struct node* adjlist2[5];




struct node* newnode(int e)

{

struct node* temp= (struct node*) malloc(sizeof(struct node));

temp->end=e;

temp->next=NULL;

temp->w=1;


return temp;

}


void insert(int s,int e)

{

if (adjlist[s] == NULL)

{

adjlist[s] = newnode(e);

}

else

{

struct node* temp = adjlist[s];


while(temp->next != NULL)

{

temp=temp->next;

}


temp->next= newnode(e);

}

}

void print()

{

int i;

struct node* temp;


for (i=0;i<node_cnt;i++)

{

temp = adjlist[i];

printf ("%d : ",i);

while ( temp!=NULL )

{

printf ("%d ",temp->end);

temp=temp->next;

}

printf ("\n");

}


}


int main(void)

{

int i;


adjlist = (struct node**)malloc(sizeof(struct node*) * node_cnt );


for (i=0;i<node_cnt; i++)

{

adjlist[i] = NULL;

}


insert(0,1);

insert(1,0);


insert(0,2);

insert(2,0);


insert(1,2);

insert(2,1);


insert(3,1);

insert(1,3);


insert(4,3);

insert(3,4);


print();


}


'자료구조' 카테고리의 다른 글

hash simple linear  (0) 2015.05.22
binary search tree ( insert, kth smallest, inorder, delete by key)  (0) 2015.05.15
link list(single)  (0) 2015.05.01
boolean combination  (0) 2015.05.01
Posted by rjh
,