'<개념> > 기타' 카테고리의 다른 글

FPGA, NPU 초간단 개념  (0) 2022.02.28
푸리에 변환 초간단 정리  (0) 2022.01.30
SHIFT 개념 이해하기 예제 with SIN/COS/TAN  (0) 2021.12.30
자주나오는 이산수학관련 내용  (0) 2021.11.28
RestfulAPI 개념정리  (0) 2021.08.14

NPU ?

  • 지금 개발된 고도화된 AI 기술 구현에는 GPU(그래픽처리장치)의 공이 크다.
  • GPU의 원래 목적은 컴퓨터 그래픽 처리다. AI용으로 GPU를 쓰는 이유는 그래픽 처리와 AI 연산이 비슷한 방법으로 이뤄지기 때문.
  • 그러나, GPU의 원래 목적이 AI 연산은 아니기 때문에 비용이나 전력소모 등 비효율적인 부분이 발생. 
  • 이를 극복하기 위해 최근에는 FPGA를 사용하거나 NPU, TPU 등 새로운 프로세서를 개발해 사용하고 있다.
  • 한마디로 NPU 는 인공지능을 위해 만든 프로세서
  • TPU 도 구글에서 인공지능을 위해 만든 NPU이다.


FPGA ?

  • FPGA(field programmable gate array)는 CPU나 GPU 등 회로 변경이 불가능한 다른 프로세서와 달리 프로그래밍이 가능한 프로세서로 용도에 맞게 회로를 변경할 수 있다. 
  • FPGA는 인공지능에 중요하게 쓰인다. 병렬연산 등 새로운 설계가 가능하기 때문에 머신러닝(ML)에 적합한 프로세서 설계에 적합하다.
  • 짧은 대기 시간과 높은 처리량은 FPGA의 가장 큰 장점. 
  • FPGA는 GPU보다 전력효율이 높다
  • BING 검색엔진에 FPGA 를 활용

 

 

아래글  읽어보면 FPGA ,NPU 가 뭘 의미하는지 대충감이옴

http://www.aitimes.com/news/articleView.html?idxno=137640 

http://www.aitimes.com/news/articleView.html?idxno=134014 

 

푸리에 변환이란??

  • 시간을 기준으로 그린 그래프에서 → 주파수 기준 그래프로 변환해줌.
  • 한마디로 주어진 신호를 다양한 주파수를 가지는 주기함수들의 합으로 나타내는 것이다.
  • 여기서 주기함수란? 우리가 일반적으로 알고 있는 사인(sin), 코사인(cos) 함수를 의미.

 

 

 

시간기준 -> 주파수 그래프 바뀌는 원리만 정확히 이해하면  감이온다. 

아래그림처럼 해당 주파수가 sin,cos그래프들이 몇개 모여 이루어졌나 보는것이다. 

 

 

 

 

푸리에 변환도 여러가지가 있는데 그중에서 FFT 를 사용한 초간단 예제. (빠르다!)

'<개념> > 기타' 카테고리의 다른 글

벡터 유사도 (vector similiarity)  (0) 2022.06.05
FPGA, NPU 초간단 개념  (0) 2022.02.28
SHIFT 개념 이해하기 예제 with SIN/COS/TAN  (0) 2021.12.30
자주나오는 이산수학관련 내용  (0) 2021.11.28
RestfulAPI 개념정리  (0) 2021.08.14
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from synthetic_tests_lib import crosscorr, compute_shift
from scipy import signal
# 완전다른 그래프랑 어케 나타나는지 
x = [0,1,2,3,4,5,6,7,8,9]
g1 = [1,2,3,4,5,6,7,8,9,10]
g2 = [10,9,8,7,6,5,4,3,2,1]
shift = compute_shift(g1,g2)
plt.plot(x,g1,label='g1')
plt.plot(x,g2,label='g2')
plt.legend(loc='upper right')
plt.title("compute_shift(g1,g2)")
print('shift : '+ str(shift))
print('shift 가 의미하는바 =  g1 그래프가 얼마만큼 움직여야 g2 그래프와 동일해는가')

from synthetic_tests_lib import crosscorr, compute_shift

# 완전다른 그래프랑 어케 나타나는지 
g1 = np.sin(x)
g2 = np.cos(x)
g3 = np.tan(x)
x1=[3,4,5,6,7,8,9,10,11,12]
g4 = np.sin(x1)
g5 = np.sin(x)*2
x2=[0,0.2,0.4,0.6,0.8,1.0,1.2,1.4,1.6,1.8]
g6 = np.sin(x2)

shift = compute_shift(g1,g2)
shift2 = compute_shift(g1,g3)
shift3 = compute_shift(g1,g5)
shift4 = compute_shift(g1,g6)

shift5 = compute_shift(g3,g5)
shift6 = compute_shift(g2,g4)

plt.plot(x,g1,label='g1 : sin(x)')
plt.plot(x,g2,label='g2 : cos(x)')
plt.plot(x,g3,label='g3 : tan(x)')
plt.plot(x,g4,label='g4 : sin(x+3)')
plt.plot(x,g5,label='g5 : sin(x)*2')
plt.plot(x,g6,label='g6 : sin(1/5*x)')



plt.legend(loc='upper right')
plt.title("compute_shift")
print('shift(sin,cos) : '+ str(shift))
print('shift2(sin,tan) : '+ str(shift2))
print('shift3(sin,sin*2) : '+ str(shift3))
print('shift4(sin,sin(1/5*x) : '+ str(shift4))
print('shift5(tan,sin*2) : '+ str(shift5))
print('shift6(cos,sin(x+3) : '+ str(shift6))

d1, d2 ,d3 = pd.Series(g1), pd.Series(g2),pd.Series(g3)
lags = np.arange(-(5), (5), 1)
rs = np.nan_to_num([crosscorr(d1, d2, lag) for lag in lags])
rs2 = np.nan_to_num([crosscorr(d1, d3, lag) for lag in lags])
#print('rs'+str(rs))
#print('rs2'+str(rs2))
#print(np.corrcoef(g1,g2))

# 높이는 상관없다.(sinx,sinx*2) shift=0

# 완전다른 그래프랑 어케 나타나는지 
x = [0,1,2,3,4,5,6,7,8,9]
g1 = [1,0,0,1,1,0,0,1,1,0]
g2 = [10,9,8,7,6,5,4,3,2,1]
shift = compute_shift(g1,g2)
plt.plot(x,g1,label='g1')
plt.plot(x,g2,label='g2')
plt.legend(loc='upper right')
plt.title("compute_shift(g1,g2)")
print('shift : '+ str(shift))
print('shift 가 의미하는바 =  g1 그래프가 얼마만큼 움직여야 g2 그래프와 동일해는가')

d1, d2 = pd.Series(g1), pd.Series(g2)
lags = np.arange(-(5), (5), 1)
rs = np.nan_to_num([crosscorr(d1, d2, lag) for lag in lags])
print('rs'+str(rs))
print(np.corrcoef(g1,g2))

'<개념> > 기타' 카테고리의 다른 글

FPGA, NPU 초간단 개념  (0) 2022.02.28
푸리에 변환 초간단 정리  (0) 2022.01.30
자주나오는 이산수학관련 내용  (0) 2021.11.28
RestfulAPI 개념정리  (0) 2021.08.14
AJAX,JSON 개념메모  (0) 2021.08.14

'<개념> > 기타' 카테고리의 다른 글

푸리에 변환 초간단 정리  (0) 2022.01.30
SHIFT 개념 이해하기 예제 with SIN/COS/TAN  (0) 2021.12.30
RestfulAPI 개념정리  (0) 2021.08.14
AJAX,JSON 개념메모  (0) 2021.08.14
도커 초간단 개념정리  (0) 2021.05.09

AJAX

  • 자바스크립트의 라이브러리중 하나
  • 브라우저가 가지고있는 XMLHttpRequest 객체를 이용해서 전체 페이지를 새로 고치지 않고도 페이지의 일부만을 위한 데이터를 로드하는 기법 이며 JavaScript를 사용한 비동기 통신, 클라이언트와 서버간에 XML 데이터를 주고받는 기술이다. (https://velog.io/@surim014/AJAX란-무엇인가)
  • 단순히 웹화면에서 무언갈 부르거나 데이터를 조회하고 싶을때 페이지전체를 새로고침하지않기위해 사용한다.
  • 기본적으로 HTTP 프로토콜은 클라이언트쪽에서 Request를 보내고 서버쪽에서 Response를 받으면 이어졌던 연결이 끊기게 되어있다. 그래서 화면의 내용을 갱신하기 위해서는 다시 request를 하고 response를 하며 페이지 전체를 갱신하게 된다. 하지만 이렇게 할 경우, 엄청난 자원낭비와 시간낭비를 초래 → ajax를 사용
  • 서버에서 데이터를 http get, post, json 의 모든방식으로 전송한후 서버측 응답을 받으럐때 사용, http get방식으로 전송한후 서버측 응답을 json형식으로 받을떄는 $get.JSON 을 사용한다.
var serverAddress = 'https://hacker-news.firebaseio.com/v0/topstories.json';

// jQuery의 .get 메소드 사용
$.ajax({
    url: ,
    type: 'GET',
    success: function onData (data) {
        console.log(data);
    },
    error: function onError (error) {
        console.error(error);
    }
});
<script>

$(document).ready(function() {
     jQuery.ajax({
           type:"GET",
           url:"/test",
           dataType:"JSON", // 옵션이므로 JSON으로 받을게 아니면 안써도 됨
           success : function(data) {
                 // 통신이 성공적으로 이루어졌을 때 이 함수를 타게 된다.
                 // TODO
           },
           complete : function(data) {
                // 통신이 실패했어도 완료가 되었을 때 이 함수를 타게 된다.
                 // TODO
           },
           error : function(xhr, status, error) {
                 alert("에러발생");
           }
     });
});
</script>

출처: https://marobiana.tistory.com/77 [Take Action]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ko"  xml:lang="ko">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <head>
  <script src="./js/jquery-1.11.3.min.js"></script>
  <script type="text/javascript">
	$(document).ready(function() {
		$("#btn1").click(function() {
			$.ajax({
				type:"post",
				url:"./list.json",
				dataType:"text",
				success:function(data) {					
					$.each(JSON.parse(data), function(index, entry) {
						console.log("menu : " + entry["menu"] + ", page " + entry["page"]);
						$("#" + entry["menu"]).html( entry["menu"] + ", page " + entry["page"]);
					});
			}});
		});
	});
  </script>
 </head>
 <body>
	<div id="human"></div>
	<div id="animal"></div>
	<div id="fruit"></div>
	<button id="btn1">button</button>
 </body>
</html>


출처: https://leojin.tistory.com/entry/Ajax-로-json-파일-내용-읽기

header:{"Content-Type":"application/json"}

ajax로 서버에 데이터를 보낼때 header 중 content-type이 존재하는데 이를 설정하지않으면 디폴트값으로 application/x-www-form-urlencoded; charset=UTF-8 타입으로 지정됨.

그래서 json형태의 데이터를 주고싶을떄는 위의 헤더를 지정해주어야함.

문제 → request안에 포함된 json형태의 데이터를 받았을때 보통 vo,dto에서 담아 다시 사용하는데, ajax는 데이터를 문자열화해주지않아서 보낼 데이터를 json.stringfy()로 감싸주어야함

그렇지않을경우 json데이터를 인식을 못함

기본값은 true, 기본적을 key,value 값을 쿼리 스트링을 변환해서 보내줌. 이게 False 로 지정되어있으면 쿼리 String으로 설정하지않음 , 이것은 파일 전송시에 사용한다고함

전제조건 : 내가보고있는 페이지에서 다른페이지의 rest api를 호출해서 데이터를 json으로 가져오려고함. 내가 이용하는 페이지주소랑 데이터를 가지고 오기위한 서버 도메인이 서로 다를경우 crossdomain이라고 부름.

  • formData

비동기 업로드를 위해 ajax formData를 사용함. 평소엔 안쓰임 , 이미지를 ajax로 업로드할때 필요함.

  • *** 비동기?
    • 비동기 처리 ? 특정 코드의 연산이 끝날떄까지 코드의 실행을 멈추지않고 다음코드를 먼저 실행하는 자바스크립트의 특성을 의미함. → 제이쿼리의 ajax를 많이씀.
    • function getData() {
      	var tableData;
      	$.get('https://domain.com/products/1', function(response) {
      		tableData = response;
      	});
      	return tableData;
      }
      
      console.log(getData()); // undefined
      
      // get 부분이 ajax로 통신을 하는 부분임. http~ 에 get 요처응ㄹ 날려서 product정보를 요청함. 
      // 한마디로 쉽게 말하면 지정된 url에 데이터를 하나 보내주세요 라는 요청을 날리는것과 같음. 
      // http 서버에서 받아온 데이터를 respose 인자에 담김
      // getdata는 뭐임?? undefined 왜? 왜냐 이전에 미리 return 해줘서 그럼. 기다려주지않고 바로
      리턴해버려서 undefined를 출력하게됨. 
      // 이런식으로 특정로직의 실행이 끝날떄까지 기다려주지않고 나머지 코드를 먼저 실행해버리는게 비동기처리라는것임
      콜백함수로 비동기처리 방식의 문제점 해결하기
    • function getData(callbackFunc) {
      	$.get('https://domain.com/products/1', function(response) {
      		callbackFunc(response); // 서버에서 받은 데이터 response를 callbackFunc() 함수에 넘겨줌
      	});
      }
      
      getData(function(tableData) {
      	console.log(tableData); // $.get()의 response 값이 tableData에 전달됨
      });

중요 : ajax formData 사용시에 contentTYpe, processData 옵션을 false로 설정해야함 !!!

사용법은 두가지가있음

(1) form 에 작성된 전체데이터 보내기 (2) form 에 작성된것 중 필요한것만 선택해서 보내기

//후자 (2)  방법
var formData = new formData();
formData.append([key],[value]);
//append는 전체데이터중에 필요한것만 선택해서 보낼때를 의미함. 더해준다는 의미가 아님.

formData.append('username', 'Chris'); //이런식으로 쓰인다~

<form id="myForm" name="myForm">
  <div>
    <label for="username">Enter name:</label>
    <input type="text" id="username" name="username">
  </div>
  <div>
    <label for="useracc">Enter account number:</label>
    <input type="text" id="useracc" name="useracc">
  </div>
  <div>
    <label for="userfile">Upload file:</label>
    <input type="file" id="userfile" name="userfile">
  </div>
  <input type="submit" value="Submit!">
</form>

/////////////////////////////////////////////////////////////////////////////

let myForm = document.getElementById('myForm');
let formData = new FormData(myForm);
  • document.getElementById

id 로 요소를 찾고 이를 나타내는 elements 객체를 반환

  • param(obj)

폼 요소들의 값을 변환해서 직렬화한 문자열로 표현함.

  • datatype

내가보는 데이터타입 아님, 서버가 응답(response)할떄 보내줄 데이터타입임. 이는 success function에 전달될 argument의 형태를 지정하는데 사용된다고 한다

→ 한마디로 서버측에서 전송받은 데이터의 형식

  • processData

일반적으로 서버에 전달되는 데이터는 query string이라는 형태로 전달된다. data 파라미터로 전달된 데이터를 내부적으로 query string으로 만드는데 파일전송의 경우 이렇게 하면안된다.

-기본값은 true

-해당값이 true →> data 값들이 쿼리 스트링 형태인 Key=value & key2=value2 형태로 전달이된다. 하지만 리헌식으로 진행하면 file값들이 제대로 전달되지않음

-해당값이 false → { key1 : 'value1', key2 : 'value2' } 형태로 전달

  • contentType

디폴트값은 "application/x-www-form-urlencoded; charset=UTF-8" 인데 , multipart/form-data로 전송이 되게 false로 넣어줌.

  • data

http 요청후 return하는 값임

  • url

요청이 전송되는 url 이 포함되는 문자열

  • type

http 요청방식 (Get/Post)

  • async

요청시 동기유무를 선택할수 있다 ( true/False)

.ajax 에서 string으로 보내서 전송하고,

success 후에는 돌려받은걸 다시 json파일로 변환해서 출력한다

  • enctype1. application/www-form-urlencoded2. multipart/form-data3. text/plain출처: https://dydals5678.tistory.com/113
  • 이 형식은 인코딩을 하지 않은 문자 상태로 전송한다.
  • 파일이나 이미지를 서버로 전송할 경우 이 방식을 사용한다. 그렇게 하지 않으면 웹 서버로 데이터를 넘길때 파일의 경로명만 전송되고 파일 내용이 전송되지 않기 때문이다. 그리고 이떄 메소드는 post값으로 지정해줘야 한다 (핵중요)
  • 디폴트값이다. enctype을 따로 설정하지 않으면 이 값이 설정된다. 폼데이터는 서버로 전송되기 전에 URL-Encode 된다.
  • enctype 은 다음 3가지값을 지정가능

JSON 메모

  • JSON.stringify(value)

→ 인수로 전달받은 자바스크립트 객체를 문자열로 변환해서 반환해줌

예제1

<html>
<body>
	<p id="json"></p>
	<script>
		var dog = {name: "식빵", family: "웰시코기", age: 1, weight: 2.14};	// 자바스크립트 객체
		
		var data = JSON.stringify(dog);	// 자바스크립트 객체를 문자열로 변환함.
		document.getElementById("json").innerHTML = data; // json 데이터 불러옴

	</script>
</body>
</html>
//output : {"name":"식빵","family":"웰시코기","age":1,"weight":2.14}ㅁ

예제2

var obj = { name: "John", age: 30, city: "New York" }; 
var myJSON = JSON.stringify(obj); 
document.getElementById("demo").innerHTML = myJSON; 
//결과값 {"name":"John","age":30,"city":"New York"}
  • JSON.parse(text)

→인수로 전달받은 문자열을 자바스크립트 객체로 변환해서 반환해줌

<html>
<head>
	<title>parse</title>      
</head>
<body>
	<p id="json"></p>
	<script>
		// JSON 형식의 문자열
		var data = '{"name": "식빵", "family": "웰시코기", "age": 1, "weight": 2.14}';
		
		var dog = JSON.parse(data);	// JSON 형식의 문자열을 자바스크립트 객체로 변환함.
		document.getElementById("json").innerHTML = dog + "<br>";
		document.getElementById("json").innerHTML += dog.name + ", " + dog.family;
	</script>
</body>
</html>

//결과 
[object Object]
식빵, 웰시코기
const json = '{"result":true, "count":42}';
const obj = JSON.parse(json);

console.log(obj.result);
// expected output: true
  • toJSON()

→ 자바스크립트의 Date 객체를 Json 형식의 문자열로 반환해서 변환

 

 

예제1

추가 참조 :  https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=mk1126sj&logNo=221016837263

https://developer.mozilla.org/en-US/docs/Web/API/FormData/FormData

https://grip.news/archives/1397

https://galid1.tistory.com/398

<string 유사도 구하기 알고리즘3가지 적용>

 

1. LCS알고리즘 (=최장공통부분 문자열)

=Longest Common Subsequence

(substring은 연속된 부분 문자열, subsequence는 연속적이지 않은 부분 문자열 - 핵심!)

두개 s1,s2가 주어졌을때, 공통으로 들어있는 부분열중 가장긴 열의 길이를 찾아낸다. (여기서 부분열이란? 몇몇 문자가 빠져도 순서는 바뀌지않는 문자열을 의미

def lcs(a, b):
    prev = [0]*len(a)
    for i,r in enumerate(a):
        current = []
        for j,c in enumerate(b):
            if r==c:
                e = prev[j-1]+1 if i* j > 0 else 1
            else:
                e = max(prev[j] if i > 0 else 0, current[-1] if j > 0 else 0)
            current.append(e)
        prev = current
    return current[-1]
   

2. 레벤슈타인 알고리즘(=편집거리 알고리즘)

→ 위에 LCS랑 거의 비슷한데 약간의 디테일만 다르다!!!!!!

두 문자열이 같아지려면, 몇번의 문자조작(삽입,삭제,변경)이 필요한지 구하는것 ( 위의 3개를 합치면 총 조작비용이 나온다)

#레반슈타인 알고리즘 ( 편집거리 알고리즘 )
import numpy as np
def levenshtein(seq1, seq2):
    size_x = len(seq1) + 1    #왜냐면 matrix에 넣어줄때, 제일 왼쪽에 0이 붙으니까~~
    size_y = len(seq2) + 1
    matrix = np.zeros ((size_x, size_y)) # matrix를 0으로 초기화함
    for x in range(size_x): 
        matrix [x, 0] = x
    for y in range(size_y):
        matrix [0, y] = y
# 참조링크 들어가보면 matrix 북서쪽에 0,1,2,... 이런식으로 숫자 채워줌
# matrix 북서쪽 채워주고 나머지는 전부 0
# 북서쪽이 뭐냐! 앞에서 len()+1로 더해준 0이랑 조작비용을 계산하는거라 0,1,2,3....이렇게 채워진다.


# 여기서부터 나머지 matrix값들 채워줌
    for x in range(1, size_x):  #북서쪽 앞에서 채워준거 제외해줘야하니까 1부터 시작~
        for y in range(1, size_y):  #for, for로 비교
            if seq1[x-1] == seq2[y-1]:  # seq[]이랑 matrix[]이거랑 따로!!! 그려서 넣어보면 바로이해감
                matrix [x,y] = min(
                    matrix[x-1, y] + 1,#문자삽입
                    matrix[x-1, y-1],   #문자제거 
                    matrix[x, y-1] + 1   #문자변경
                )
            else:
                matrix [x,y] = min(   #둘이 안같으면 그냥 전값에 1더해주기
                    matrix[x-1,y] + 1,
                    matrix[x-1,y-1] + 1,
                    matrix[x,y-1] + 1
                )
    #print (matrix)  
    return (matrix[size_x - 1, size_y - 1])  # matrix에서 제일 오른쪽아래값을 출력해줌 

3. n-gram

n개의 연속적인 단어나열 / n개의 단어뭉치단위로 끊어서 이것을 하나의 토큰으로 간주.

위에 두개는 subsequence로 연속적이지 않는 부분 문자열을 살폈지만, 이건 연속적인것으로 판단함

그러니까 2-gram이라고 하면, 두개씩 찢어서 찢어놓은 리스트에서 같은것이 몇개인가를 확률로 나타낸것.

#n-gram
def ngram(s, num): #
    res = []
    slen = len(s) - num + 1  # num개로 찢으면 몇개나오나 연산
    for i in range(slen): 
        ss = s[i:i+num]  #찢어준다!
        res.append(ss)   #res안에 조각조각낸거 넣어줌
    return res
def diff_ngram(sa, sb, num):   #sa,sb가 비교할 string, num은 몇개로 찢을거냐
    a = ngram(sa, num)  #sa를 num으로 찢은게 a
    b = ngram(sb, num)  #sb를 num으로 찢은게 b
    r = []
    cnt = 0
    for i in a:   #찢어준 리스트중에 머가 곂치는지 하나하나 비교해줌
        for j in b:
            if i == j:
                cnt += 1
                r.append(i) 
    return cnt / len(a)#곂치는 조각들을 모아서 리스트로 만들어줌
    #return cnt / len(a), r     # cnt을 리스트개수로 나눠서 출력/ r

4. 그외 문자열 유사도 구하는 다른 방법들... Hamming Distance / Smith-Waterman / Sørensen–Dice coefficient ......

 

 

 

- Lcs랑 레벤슈타인 피처들간의 연관도를 표로 만들었을때 차이점 (헷갈리지말기)

-> 연관도 있는 피처쌍을 뽑을때, lcs는 숫자가 큰것들을 필러팅 / 레벤슈타인은 숫자가 작은것들을 필터링해야한다

'<개념> > 기타' 카테고리의 다른 글

SHIFT 개념 이해하기 예제 with SIN/COS/TAN  (0) 2021.12.30
자주나오는 이산수학관련 내용  (0) 2021.11.28
RestfulAPI 개념정리  (0) 2021.08.14
AJAX,JSON 개념메모  (0) 2021.08.14
도커 초간단 개념정리  (0) 2021.05.09

+ Recent posts