728x90
import matplotlib.pyplot as plt

bream_length = [25.4, 26.3, 26.5, 29.0, 29.0, 29.7, 29.7, 30.0, 30.0, 30.7, 31.0, 31.0, 
                31.5, 32.0, 32.0, 32.0, 33.0, 33.0, 33.5, 33.5, 34.0, 34.0, 34.5, 35.0, 
                35.0, 35.0, 35.0, 36.0, 36.0, 37.0, 38.5, 38.5, 39.5, 41.0, 41.0]
bream_weight = [242.0, 290.0, 340.0, 363.0, 430.0, 450.0, 500.0, 390.0, 450.0, 500.0, 475.0, 500.0, 
                500.0, 340.0, 600.0, 600.0, 700.0, 700.0, 610.0, 650.0, 575.0, 685.0, 620.0, 680.0, 
                700.0, 725.0, 720.0, 714.0, 850.0, 1000.0, 920.0, 955.0, 925.0, 975.0, 950.0]

smelt_length = [9.8, 10.5, 10.6, 11.0, 11.2, 11.3, 11.8, 11.8, 12.0, 12.2, 12.4, 13.0, 14.3, 15.0]
smelt_weight = [6.7, 7.5, 7.0, 9.7, 9.8, 8.7, 10.0, 9.9, 9.8, 12.2, 13.4, 12.2, 19.7, 19.9]

plt.scatter(bream_length, bream_weight)
plt.scatter(smelt_length, smelt_weight)
plt.xlabel('length')
plt.ylabel('weight')
plt.show()

length = bream_length + smelt_length
weight = bream_weight + smelt_weight
fish_data = [[l, w] for l, w in zip(length, weight)]
print(fish_data)

fish_target = [1] * 35 + [0] * 14
print(fish_target)

from sklearn.neighbors import KNeighborsClassifier

kn = KNeighborsClassifier()
kn.fit(fish_data, fish_target)
kn.score(fish_data, fish_target)

"""### k-최근접 이웃 알고리즘"""
plt.scatter(bream_length, bream_weight)
plt.scatter(smelt_length, smelt_weight)
plt.scatter(30, 600, marker='^')
plt.xlabel('length')
plt.xlabel('weight')
plt.show()

kn.predict([[30,600]])
print(kn._fit_X)
print(kn._y)

"""기본 5로 설정된 근접이웃 알고리즘 단계를 49로 높임"""
""" 주변 49개 값을 확인하여 비슷한 것으로 보내기"""
kn49 = KNeighborsClassifier(n_neighbors=49)
kn49.fit(fish_data, fish_target)
kn49.score(fish_data, fish_target)

 

import matplotlib.pyplot as plt 
 -> pyplot을 plt로 정의
 
from sklearn.neighbors import KNeighborsClassifier
kn = KNeighborsClassifier()
 -> 아래와 같이 사용 가능
import sklearn
kn = sklearn.neighbors.KNeighborsClassifier()

 

KNeighborsClassifier 메소드들

fit() : 학습 진행(훈련)

predict() : 어느 값에 근접한지 예측

score() : 알고리즘의 정확도(0~1)

pyplot : 산점도를 보여준다
scatter() : data 지정, 연속으로 사용하면 data가 추가됨
xlabel(), ylabel() : label 표시
show() : 그래프로 보여줌
 

Key-word

특성 : data를 표헌하는 성질

훈련 : data에서 규칙을 찾는 과정 : fit()

k-최근접 이웃 알고리즘 : 가장 간단한 머신러닝 알고리즘 중 하나 -> 규칙을 찾기보다는 전체 data를 memory에 가지고 있는 것이 전부라고 한다

정확도 = (정확히 맞힌 개수) / (전체 data 개수)

728x90
728x90

무엇을 설계하는가?

 * System architecture

 * Module/Component

 * Class/Data type

 * Function

 

좋은 설계의 목표

 * 작성하기 쉽고

 * 이해하기 쉽고

 * 고치기 쉽고(문제를 쉽게 찾고)

 * 버그가 숨어 있을 가능성이 더 적고

 * 변경에 대해 더 탄력적인

 

어떤 코드를 만들 것인가?

 - 반복적이고, 신중하고, 현실적이고, 지식에 근거한

 

Blaise Pascal

Pascal : "편지가 길어서 죄송합니다. 하지만 짧게 쓸 시간이 없었습니다."

 

단순성

 - 잘 설계된 코드의 가장 중요한 특성이다. 단순한 설계는 이해가 쉽고, 군더더기나 오점이 없고, 구현이 쉽다. 조리에 맞고 모순이 없다. 

728x90

'Programming > 좋은습관들이기' 카테고리의 다른 글

[코드멍키] 생각해 봅시다  (0) 2022.01.08
프로그래머의 종류  (0) 2022.01.03
최적화  (0) 2022.01.01
Build 관점에서의 language 구분  (0) 2021.12.31
Comment 작성 요령  (0) 2021.12.30
.vimrc option  (0) 2011.07.22
Artistic Style : SourceInsight  (0) 2011.04.28
툴을 사용하자  (0) 2008.07.08
오류처리 - 프로그래밍 습관03  (0) 2008.06.26
오류처리 - 프로그래밍 습관02  (0) 2008.06.24
728x90

Google Colab

* Machine learning : scikit-learn (Python API)

* Deep learning :

      - TensorFlow : Google (Python API)

      - PyTorch : Facebook (Python API)

 

 

Google Colab 

Cloud 기반 개발 환경

https://colab.research.google.com/

 

728x90
728x90

 잘못된 최적화

 

최적화란?

 Optimization : 우너래 의미는 개선을 하고 더 좋은 무엇인가를 만드는 것이지만 일반적으로 code의 실행 속도를 높이는 것으로 받아들여 진다.

* 프로그램의 실행 속도를 높이는 것

* 실행파일의 크기를 줄이는 것

* 코드의 질을 향상시키는 것

* 출력의 정확성을 높이는 것

* 기동시간(startup time)을 최소화하는 것

* 단위시간당 데이터의 처리량을 늘리는 것(반드시 실행속도와 같지는 않다)

* 저장장치의 부담을 줄이는 것(ex. database size)

** Embedded에서 최적화라 하면 Tuning의 개념도 포함된다.

 

코드를 다 만들고 나서 나중에 최적화 하는 것은 아주 위험하다.

 - 처음 시작할 때부터 성능에 대해 고민하라. 개발이 끝날 때 고칠 수 있다고 생각하면서 소홀히 하지 마라

 - 올바른 코드가 빠른 코드보다 훨씬 더 중요하다.

 

최적화를 해치는 요인들

* 복잡성

* 간접성

* 중복성

* 잘못된 설계

* I/O : 특히 입출력이 어려군데 흩어져 있으면 성능에 아주 많은 영향을 준다.

 

최적화의 필요성

 * 게임 프로그래밍 : 실행환경의 한계까지 가기 때문에 실행 속도에 대한 최적화가 필요, 특히나 delay에 민감하다

* Digital signal porocessing : 대량의 data를 빠르게 digital filtering해야 함

* Embedded platform : 자원이 제한된 환경이라 하드웨어에 맞춰 최대한의 성능을 이끌어 내야 한다

* Realtime system : 정확한 시간에 시작하고, 주어진 시간 내에 작업을 완료해야 한다. 이 환경에서는 알고리즘이 신중하게 다듬어져야 하고, 실행이 정해진 제한시간 안에 된다는 것을 증명해야 한다.

 * 금융 분야, 과학 연구에 사용되는 수치 프로그래밍(numerical programming) : 높은 성능을 필요로 함, 벡터연산(vector operation), 병렬계산(parallel calculation)

 

최적화를 할 때는..

* 가장 느린 코드를 찾아라 : 모든 코드를 고치지 말고 가장 느린(특별하게 느린) 부분만 수정

* 수정한 코드에 대해 unit test : 모든 수정은 side-effect를 유발할 수 있다

* 그럼에도 느릴 수밖에 없는 일은 ->

        1) 실행 속도를 높인다.

        2) 횟수를 줄인다

        3) 정말 필요할 때까지 미루었다가 한다(상대적으로 중요하지 않은 시간에 한다)

 

H/W의 성능은 시간이 갈수록 좋아지고 있다. 그리고 compiler단계의 최적화도 점점 더 좋아지고 있다.

이미 최적화가 되어 있는 library도 더 많아지고 있다.

==> 결론은 최적화보다는 정확하고 (사람이) 알아보기 쉬운 코드를 작석하는 것이 훨씬 중요하다.

728x90

'Programming > 좋은습관들이기' 카테고리의 다른 글

[코드멍키] 생각해 봅시다  (0) 2022.01.08
프로그래머의 종류  (0) 2022.01.03
설계하기  (0) 2022.01.02
Build 관점에서의 language 구분  (0) 2021.12.31
Comment 작성 요령  (0) 2021.12.30
.vimrc option  (0) 2011.07.22
Artistic Style : SourceInsight  (0) 2011.04.28
툴을 사용하자  (0) 2008.07.08
오류처리 - 프로그래밍 습관03  (0) 2008.06.26
오류처리 - 프로그래밍 습관02  (0) 2008.06.24

+ Recent posts