반응형

JavaScript에서 숫자 계산을 할 때, 소수점을 처리하는 다양한 수학 함수들이 있습니다. 그 중 Math.ceil() 함수는 주어진 숫자보다 크거나 같은 가장 작은 정수를 반환하는 함수로, 주로 올림 처리에 사용됩니다. 이번 포스트에서는 Math.ceil() 함수의 사용법, 동작 원리, 그리고 예시를 함께 살펴보겠습니다.

1. Math.ceil() 함수란?

Math.ceil() 함수는 주어진 숫자보다 크거나 같은 가장 작은 정수를 반환합니다. 이는 소수점을 처리할 때, 항상 올림 처리를 하여 결과를 정수로 변환하는 함수입니다.

구문:

Math.ceil(x)
  • x: 올림할 숫자입니다. 이 숫자는 정수든 실수든 상관없습니다.

2. Math.ceil()의 동작 원리

Math.ceil() 함수는 다음과 같은 방식으로 동작합니다:

  • 양수일 때: 숫자가 소수점을 포함하고 있으면, 해당 숫자보다 크거나 같은 가장 작은 정수로 변환합니다.
  • 음수일 때: 음수일 경우에도 올림 처리가 적용되며, 그 절댓값이 더 큰 방향으로 올림됩니다.

3. 예시

Math.ceil() 함수의 동작을 예시를 통해 더 자세히 살펴보겠습니다.

console.log(Math.ceil(4.1));   // 5
console.log(Math.ceil(4.9));   // 5
console.log(Math.ceil(-4.1));  // -4
console.log(Math.ceil(-4.9));  // -4
console.log(Math.ceil(0.0001)); // 1

결과 설명:

  • Math.ceil(4.1)은 4.1보다 크거나 같은 가장 작은 정수인 5를 반환합니다.
  • Math.ceil(4.9)는 4.9보다 크거나 같은 가장 작은 정수인 5를 반환합니다.
  • Math.ceil(-4.1)은 -4.1보다 크거나 같은 가장 작은 정수인 -4를 반환합니다. (음수도 올림 처리)
  • Math.ceil(-4.9)는 -4.9보다 크거나 같은 가장 작은 정수인 -4를 반환합니다.
  • Math.ceil(0.0001)은 0.0001보다 크거나 같은 가장 작은 정수인 1을 반환합니다. (소수점이 매우 작은 값일지라도 올림 처리)

4. Math.ceil()과 Math.floor() 비교

Math.ceil()과 Math.floor()는 비슷한 역할을 하지만, 차이점이 있습니다. Math.ceil()은 올림 처리를 하여 숫자를 "위로" 변환하고, Math.floor()는 내림 처리를 하여 숫자를 "아래로" 변환합니다.

console.log(Math.ceil(4.1));   // 5
console.log(Math.floor(4.1));  // 4

5. Math.ceil() 사용 용도

Math.ceil() 함수는 다양한 상황에서 유용하게 사용될 수 있습니다. 예를 들어:

  • 페이지네이션: 데이터가 여러 페이지에 걸쳐 표시될 때, 데이터의 개수를 페이지 수로 나눈 후 올림 처리를 통해 마지막 페이지를 계산할 때 사용합니다.
  • 금액 계산: 사용자가 결제할 금액을 올림 처리하여 결제 금액이 항상 일정하게 유지될 수 있도록 할 때 유용합니다.
  • 시간 계산: 특정 시간 단위로 올림 처리하여 최소 시간을 계산할 때 사용됩니다.

결론

Math.ceil() 함수는 JavaScript에서 숫자를 올림 처리하여 가장 작은 정수로 변환할 수 있는 유용한 함수입니다. 양수와 음수 모두에서 올림 처리가 적용되며, 소수점 값이 매우 작은 경우에도 유용하게 사용할 수 있습니다. 다양한 계산에서 활용할 수 있기 때문에, 숫자 처리에 있어 중요한 역할을 합니다.

728x90
반응형
반응형

셀프 생일선물로 구매한 지샥 GW-9400

언젠가 사야지 했던 모델인데 때마침 공홈에서 세일을 하고 있어 구매를 하게 되었네요

공홈지샥박스

택배 박스는 언제 받아도 기분이 좋습니다. 갖고 싶던 물건이면 더더욱!!

 

박스에는 지샥 본품 박스만 들어가 있습니다. 깔끔하지만 뭔가 허전한 느낌

보통 온라인쇼핑몰들은 이거저거 주는데 없어서 그런걸까요

하지만 사은품이 중복으로 받다보니 필요없는 경우가 더 많더라고요

지샥 구성품

시계 포장은 대부분의 브랜드들은 비슷한거 같아요

설명서, 워런티 카드, 시계 본품

지샥의 메탈케이스는 늘 맘에 드네요

 

엄청난 두께의 설명서 

하지만 한글은 없다는 점

공홈에서 정식 수입해서 파는데도 한글 번역이 안되있는건 아쉬운 점인거 같습니다

트리플 센서나 스마트워치 기능이 있는 경우는 설명서가 중요한데 말이죠

 

케이스안에 스폰지로 꽁꽁 고정되어 있는 본품

여기서 빼낼 때가 기분이 가장 좋은거 같아요

 

오늘의 주인공 GW-9400 레인지맨

요즘 검노 조합이 눈에 들어오더라고요

이참에 검노 시계만 모아볼까 했는데 자금력도 문제고 제품이 많지는 않아서 안하기로 합니다

프로트렉 처럼 트리플 센서가 왼쪽에 위치하고 있습니다. 바로 맞은편 센서버튼을 누르면 고도 / 방위 / 기압, 온도가 보여집니다

마스터 오브 지 시리즈는 트리플 센서가 들어가 있는 모델이 많아서인지 디자인 외에 레인지맨만의 특징은 모르겠더라고요

터프솔라 기능과 멀티밴드6 도 포함되어 있는데 이건 카시오 웨이브셉터에도 있는 기능이기에 역시 레인지맨 만의 특징은 모르겠네요

 

밴드 두께는 생각보다 얇습니다

사실은 일반적인 지샥 밴드 두께인데 시계의 무게때문에 얇게 느껴집니다

기존 걸프맨과 비교해보니 그 느낌이 더 확실해지네요 

 

지샥의 맨 시리즈는 고유의 캐릭터 엠블럼을 가지고 있는데 레인지맨은 고양이 입니다

고양이손목에 나침반이 있는거 보면 레인지맨은 방위가 주요 특징인걸까요?

아무튼 오랜만에 산 지샥 

디자인 하나만으로도 충분히 만족스럽습니다

 

728x90
반응형
반응형

JavaScript에서 날짜와 시간을 다루다 보면, 타임존(Timezone) 관련 코드에서 종종 헷갈리는 순간이 있습니다.
특히 dayjs를 사용할 때, 아래 두 코드의 차이를 아는 것이 정말 중요해요:

const t1 = dayjs('202505271800', 'YYYYMMDDHH').tz("Asia/Seoul");
const t2 = dayjs.tz('202505271800', 'YYYYMMDDHH', 'Asia/Seoul');

겉보기엔 비슷해 보이지만, 내부적으로는 아주 다른 동작을 하게 됩니다.
이 글에서는 그 차이를 최대한 쉽게 설명해볼게요.


우선 두 코드의 차이부터 볼게요

① dayjs('202505271800', 'YYYYMMDDHH').tz("Asia/Seoul")

  • 이 코드는 먼저 '202505271800'을 UTC 기준으로 해석합니다.
    즉, '2025년 5월 27일 18시'는 UTC 시간대의 6시라고 인식합니다.
  • 그 다음, .tz("Asia/Seoul")을 적용하면서 UTC 6시 → KST 기준 15시로 변환됩니다.
  • 결과적으로 날짜와 시간이 변형됩니다.

② dayjs.tz('202505271800', 'YYYYMMDDHH', 'Asia/Seoul')

  • 이 코드는 처음부터 '202505271800'을 "Asia/Seoul" 시간대로 해석합니다.
  • 즉, '2025년 5월 27일 18시 (한국시간 기준)' 그대로 유지됩니다.
  • 시간 값은 그대로이고, 정확한 타임존이 적용됩니다.

예시로 비교해볼게요

// 1번 방식 (시간이 바뀜)
const t1 = dayjs('202505271800', 'YYYYMMDDHH').tz("Asia/Seoul");
console.log(t1.format()); // 2025-05-28T03:00:00+09:00 ❌ 원래 18시 아님

// 2번 방식 (정확하게 해석됨)
const t2 = dayjs.tz('202505271800', 'YYYYMMDDHH', 'Asia/Seoul');
console.log(t2.format()); // 2025-05-27T18:00:00+09:00 ✅ 원하던 시간

그래서 어떤 걸 써야 할까?

목적추천 방식

 

목적 추천 방식
입력된 시간이 이미 KST라고 가정하고 싶다면 ✅ dayjs.tz(..., ..., 'Asia/Seoul')
입력된 시간이 UTC인데 KST로 변환해서 보여주고 싶다면 ✅ .tz('Asia/Seoul')
 

 


📝 마무리 정리

  • dayjs(...).tz(...)는 UTC로 해석 후 시간대 변환
  • dayjs.tz(..., ..., timezone)는 처음부터 그 시간대를 기준으로 파싱
  • 사용자 입력이 "한국 시간"이라는 것이 확실하다면, 무조건 dayjs.tz(...)를 쓰는 것이 안전합니다
728x90
반응형
반응형

Google Cloud Platform(GCP)에서는 Compute Engine을 통해 가상 머신(VM)을 쉽게 생성하고 관리할 수 있습니다.
이 글에서는 GCP에서 생성한 VM 인스턴스에 SSH로 접속하는 방법을 단계별로 설명합니다.

 

✅ 1. 사전 준비

SSH 접속을 위해 다음 사항이 준비되어 있어야 합니다:

  • ✅ GCP 계정 및 프로젝트 생성 완료
  • ✅ VM 인스턴스 생성 완료
  • ✅ 로컬 환경에 Google Cloud SDK (gcloud) 설치 및 로그인

설치 후 로그인:

gcloud auth login

 

활성화할 프로젝트 지정:

gcloud config set project [PROJECT_ID]

 

✅ 2. gcloud compute ssh 명령어로 SSH 접속하기

GCP에서는 gcloud 명령어로 SSH 키 생성 → VM 등록 → 접속 과정을 자동으로 처리할 수 있습니다.

gcloud compute ssh [VM_INSTANCE_NAME] --zone=[ZONE]

 

실행 시:

  • 로컬에 SSH 키가 없으면 자동 생성
  • VM 인스턴스에 공개키 자동 등록
  • SSH 터널을 통해 접속

✅ 3. 수동 SSH 접속 (이미 키가 등록된 경우)

공개키가 이미 VM에 등록되어 있다면, 일반적인 SSH 명령어로 접속할 수 있습니다:

ssh -i ~/.ssh/google_compute_engine [USERNAME]@[EXTERNAL_IP]

※ 기본 SSH 키는 ~/.ssh/google_compute_engine에 생성됩니다.
※ 퍼미션 오류를 방지하려면 .ssh 폴더는 700, 개인키는 600으로 설정하세요.

 

✅ 4. 접속 오류 발생 시 점검사항

에러 메시지 원인 및 해결
Permission denied (publickey) SSH 키가 VM에 등록되지 않았거나 권한 문제
connection timed out 방화벽 설정에서 포트(22) 허용 안 됨
not found: [VM name] zone 또는 project 설정이 잘못되었을 가능성
 

🔧 확인 명령어들

  • 프로젝트 확인:
gcloud config list project
  • 인증된 사용자 확인:
gcloud auth list
  • VM 목록 확인:
gcloud compute instances list

 

#GCP #GoogleCloud #ComputeEngine #SSH접속 #클라우드서버 #VM인스턴스 #gcloud #서버관리 #리눅스서버 #개발환경세팅 #인프라구축 #DevOps #클라우드기초 #우분투서버 #Debian서버 #IT블로그 #개발자팁 #백엔드개발 #터미널사용법

728x90
반응형
반응형

concurrent.futures란?

Python 3.2 이상에서 기본 제공되는 고수준(High-level) 병렬 처리 라이브러리

concurrent.futures는 멀티스레딩(Thread) 또는 멀티프로세싱(Process)을 훨씬 간단하게 구현할 수 있게 도와주는 표준 라이브러리입니다.
Executor, submit, Future 같은 개념을 기반으로 병렬 작업을 추상화하고 자동으로 스케줄링해줍니다.

대표 클래스

  • ThreadPoolExecutor: 스레드 기반 병렬 처리
  • ProcessPoolExecutor: 프로세스 기반 병렬 처리 (CPU 병렬화에 적합)

주요 개념 설명

Executor 스레드 또는 프로세스를 관리하는 실행기
Future 아직 완료되지 않은 작업의 결과를 나타내는 객체
*submit(fn, args) 작업을 실행 큐에 비동기로 등록
result() 작업이 완료될 때까지 기다린 후 결과 반환

 

기본 사용 예제

from concurrent.futures import ThreadPoolExecutor

def task(x):
    return x * x

with ThreadPoolExecutor(max_workers=3) as executor:
    future = executor.submit(task, 5)
    print(future.result())  # 출력: 25

 

  • submit()은 작업을 비동기로 예약
  • result()는 Future 객체의 실행 결과를 반환 (필요하면 대기)

 

threading 모듈과의 차이점

concurrent.futures는 threading 모듈보다 더 간결하고, 안전하며, 확장성 있는 방식으로 병렬 처리를 제공합니다.

 

항목 threading 모듈 concurrent.futures 모듈
레벨 저수준 (Low-level) 고수준 (High-level)
제어 직접 Thread 객체 생성, 시작, 관리 Executor가 스레드를 대신 관리
코드 복잡도 복잡함 (start/join/lock 등 직접 관리) 매우 간결 (submit만 하면 됨)
오류 처리 try/except 수작업 Future에서 예외 자동 관리
스케줄링 수동 (Queue 사용 필요) 자동 (Executor가 내부 큐 관리)
멀티프로세싱 지원 불가 (Thread만) 가능 (ProcessPoolExecutor로 프로세스 병렬화)

 

코드 비교

1. threading 모듈 사용

import threading

def worker(x):
    print(x * x)

threads = []
for i in range(5):
    t = threading.Thread(target=worker, args=(i,))
    t.start()
    threads.append(t)

for t in threads:
    t.join()
  • 직접 Thread 객체를 생성하고 start(), join()을 관리해야 합니다.
  • 예외 처리는 try/except를 수동으로 구현해야 함

2. concurrent.futures 사용

from concurrent.futures import ThreadPoolExecutor

def worker(x):
    return x * x

with ThreadPoolExecutor(max_workers=5) as executor:
    futures = [executor.submit(worker, i) for i in range(5)]
    results = [f.result() for f in futures]

print(results)  # 출력: [0, 1, 4, 9, 16]
  • submit()만 호출하면 Executor가 자동으로 작업을 관리
  • Future.result()를 통해 결과 또는 예외를 얻을 수 있음

실무에서 언제 어떤 걸 써야 할까?

상황 추천 모듈
웹 크롤링, 파일 다운로드, DB insert 등 I/O 중심 ThreadPoolExecutor
영상 인코딩, 이미지 처리 등 CPU 집중 작업 ProcessPoolExecutor
세밀한 스레드 동기화 제어 필요 (Lock 등) threading (낮은 수준의 제어)

마무리 요약

concurrent.futures란? Executor 기반 병렬 처리 고수준 API
threading과 차이점은? 수동 관리 vs 자동 스케줄링/예외처리
언제 쓰면 좋나? 빠르게 병렬처리를 설계하고 싶을 때 특히 유용

🔗 참고자료

728x90
반응형
반응형

헤비츠 카드지갑 구매 후기

지갑은 늘 손에 닿는 물건이기에, 그 변화가 더 크게 느껴지곤 합니다. 오래 사용해오던 카드 지갑이 점점 헤져가면서, 자연스럽게 '이제 바꿔야 할 때가 왔구나' 하는 생각이 들었습니다. 그러던 중 문득 떠오른 브랜드, 헤비츠.

기존에 쓰던 스타벅스 카드지갑 - 고생했다

다시 떠오른 헤비츠, 익숙한 신뢰감

헤비츠는 예전에 시계 가죽 스트랩을 구매하면서 처음 알게 된 가죽 공방 브랜드입니다. 직접 사용해본 스트랩의 퀄리티와 감촉이 정말 만족스러워, 그 기억이 오래 남아 있었죠. 가죽이 주는 깊이 있는 질감과 시간이 지날수록 자연스럽게 더 멋스러워지는 그 매력, 헤비츠는 그런 가죽을 정말 잘 다루는 브랜드라는 인상이 강했습니다.

그래서 이번에 카드 지갑을 새로 구입해야겠다고 마음먹었을 때, 가장 먼저 떠오른 곳도 당연히 헤비츠였습니다.

마음을 사로잡은 색 조합

홈페이지를 둘러보다가 마침 딱 내 취향에 쏙 드는 색 조합의 카드 지갑을 발견했어요. 너무 튀지 않으면서도 은은하게 멋이 느껴지는 색감, 그리고 군더더기 없는 디자인. 특히 가죽의 질감이 사진으로도 느껴질 만큼 깊고 탄탄해 보였고, 실물이 오기 전부터 이미 마음은 반 이상 기울어 있었죠.

첫인상: ‘단단하지만 가벼운’

지갑을 처음 받아들었을 때의 느낌은 "가볍다" 그리고 "단단하다"였습니다. 손에 쥐었을 때 부담스럽지 않은 무게감과 함께, 가죽 자체가 탄탄하게 마감되어 있다는 인상이 강했습니다. 바느질은 균일하고  내부 마감도 깔끔해서 오래도록 쓰고 싶다는 생각이 들었습니다.

카드는 3~4장 정도 넣을 수 있다고 하는데 3장 정도가 적당할거 같다고 생각됩니다.

2미리 두께 - 원포켓

일상을 담을 공간

요즘은 현금을 거의 사용하지 않기에 카드 지갑 하나면 충분하다는 생각입니다. 오히려 너무 두꺼운 지갑은 부담스러울 정도니까요. 이번에 새로 산 헤비츠 카드 지갑은 그런 현대적인 라이프스타일에 딱 맞는 구성입니다. 꼭 필요한 카드 몇 장과 명함 몇 장만 넣고 다닐 수 있는, 가볍지만 실용적인 동반자 같은 느낌.

 

한 손에 들어오는 크기의 카드 지갑 : 가죽공방 헤비츠

바지 주머니, 자켓 안주머니 등 어디에나 부담 없이 수납 가능한 카드지갑.

smartstore.naver.com

 


마무리하며

헤비츠 카드 지갑을 고른 건 단순히 예쁘기 때문만은 아니었습니다. 예전부터 알고 있던 브랜드, 실제로 써본 경험에서 오는 신뢰, 그리고 가죽이 주는 감성.


이 모든 것이 모여 다시 한 번 선택하게 만든 거죠.

앞으로 이 지갑과 함께 또 어떤 하루하루를 담게 될지 기대됩니다.
가죽이 점점 나만의 흔적으로 변해가는 그 과정마저 즐겁게 느껴지겠죠.

728x90
반응형
반응형

수학 공식이나 머신러닝 관련 수식을 티스토리 블로그에 작성해보신 분들이라면 이런 경험 있으실 거예요:

d(x, y) = \sqrt{\sum_{i=1}^{n}(x_i - y_i)^2}

분명 LaTeX 문법으로 썼는데, 그대로 텍스트로 보이기만 한다고요?

그 이유는 티스토리는 기본적으로 수학 공식(LaTeX)을 렌더링하는 기능이 없기 때문입니다.
하지만 걱정 마세요! 아주 간단한 설정만 해주면 수학 공식을 예쁘게 수식 형태로 표시할 수 있습니다.
이번 글에서는 KaTeX을 활용한 설정 방법과 사용 예시까지 알려드릴게요.


✅ KaTeX란?

KaTeX는 LaTeX 문법으로 작성된 수학 공식을 웹에서 빠르게 렌더링해주는 라이브러리입니다.
MathJax보다 가볍고 빠르기 때문에 블로그나 기술 문서에 매우 적합합니다.


🔧 티스토리에 KaTeX 설정하는 방법

1단계. 티스토리 관리자 페이지 접속

[티스토리 관리 > 꾸미기 > HTML/CSS 편집] 메뉴로 이동합니다.

2단계. </head> 태그 바로 위에 아래 코드를 추가

<!-- KaTeX for LaTeX math rendering -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.css">
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.js"></script>
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/contrib/auto-render.min.js"
        onload="renderMathInElement(document.body, {
          delimiters: [
            {left: '$$', right: '$$', display: true},
            {left: '$', right: '$', display: false}
          ]
        });">
</script>

💡 이 스크립트는 $...$ 또는 $$...$$로 감싼 수식을 자동으로 감지하고 렌더링해줍니다.


✍️ 수식 입력 예시

▶ 인라인 수식 (본문 중간에 넣는 방식)

$E = mc^2$

결과:
👉 E = mc²


▶ 디스플레이 수식 (가운데 정렬되는 블록 형태)

$$
d(x, y) = \sqrt{\sum_{i=1}^{n}(x_i - y_i)^2}
$$

결과:

👉

d(x,y)=∑i=1n(xi−yi)2d(x, y) = \sqrt{\sum_{i=1}^{n}(x_i - y_i)^2}


📌 주의사항

  • 미리보기에서는 수식이 제대로 보이지 않을 수 있습니다.
    → 실제 블로그 포스트로 발행 후 확인하세요.
  • 티스토리 에디터에서는 HTML/텍스트 모드를 사용하는 것이 안전합니다.
  • 글에 수식이 많은 경우 페이지 로딩이 살짝 느려질 수 있으니 중요한 수식만 표시하는 것도 팁!

✅ 마무리 요약

항목설명
렌더링 도구 KaTeX
설정 위치 HTML/CSS 편집 > </head> 바로 위
인라인 수식 $ 수식 $
블록 수식 $$ 수식 $$
미리보기 발행 후 확인 필수

🔗 참고 링크

 

KaTeX – The fastest math typesetting library for the web

Simple API, no dependencies – yet super fast on all major browsers.

katex.org

 

728x90
반응형
반응형

데이터를 자동으로 분류할 수 있는 클러스터링 알고리즘 중 가장 널리 사용되는 K-means Clustering!
이번 포스트에서는 이론적인 배경부터, 저사양 CPU에서도 무리 없이 돌릴 수 있는 실습 코드까지 깔끔하게 정리해볼게요.

목차

  1. K-means Clustering이란?
  2. 작동 원리 (알고리즘 흐름)
  3. 수학적 개념 정리
  4. 장점과 단점
  5. 실행 가능한 예제 코드 (CPU 저사양 OK!)
  6. 마무리 요약

1.  K-means Clustering 이란?

K-means는 데이터를 **K개의 클러스터(군집)**로 나누는 대표적인 비지도 학습(Unsupervised Learning) 알고리즘입니다.
각 클러스터는 중심점(centroid)을 가지며, 데이터는 가장 가까운 중심점에 소속됩니다.

📌 예를 들어, 고객을 3개의 소비 성향 그룹으로 나누고 싶을 때 사용할 수 있어요.


2.  작동 원리

K-means는 아래 4단계를 반복하며 군집을 형성합니다.

  1. 초기 중심점 설정 (보통 랜덤 또는 K-means++ 방식)
  2. 데이터 포인트를 가장 가까운 중심점에 할당
  3. 각 클러스터의 평균으로 중심점 업데이트
  4. 중심점 변화가 없으면 종료 (또는 max 반복 횟수까지)

3.  수학적으로 살펴보기

 유클리드 거리

데이터 간의 거리는 보통 **유클리드 거리(Euclidean Distance)**로 계산합니다:

 최적화 목표 (Objective)

K-means는 Within-Cluster Sum of Squares (WCSS) 를 최소화하는 것이 목표입니다:

$$J = \sum_{i=1}^{k} \sum_{x \in C_i} \|x - \mu_i\|^2$$

  • $C_i$: i번째 클러스터
  • $\mu_i$: 클러스터 중심점

4.  장점과 단점

장점

  • 구현이 매우 간단하고 빠름
  • 대용량 데이터에서도 확장 가능
  • 널리 사용됨

단점

  • K를 미리 알아야 함
  • 이상치(outlier)에 민감
  • 구형(원형)이 아닌 클러스터에 부적합

5.  실습 코드: 저사양 CPU에서도 OK!

아래 코드는 scikit-learn을 이용한 간단한 2D 데이터 클러스터링 예제입니다.
저사양 환경(CPU 1코어, 1GB RAM 정도)에서도 무리 없이 실행됩니다.

필요한 라이브러리 설치

pip install numpy matplotlib scikit-learn

 

전체 코드

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans

# 1. 2D 클러스터 데이터 생성
X, y_true = make_blobs(n_samples=300, centers=3, cluster_std=0.60, random_state=0)

# 2. K-means 모델 학습
kmeans = KMeans(n_clusters=3, random_state=0, n_init='auto')
kmeans.fit(X)

# 3. 클러스터 예측 결과
y_kmeans = kmeans.predict(X)

# 4. 시각화
plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=40, cmap='viridis')

# 중심점 시각화
centers = kmeans.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.5, marker='X')
plt.title("K-means Clustering 결과")
plt.xlabel("X1")
plt.ylabel("X2")
plt.show()

결과

  • 3개의 색깔로 나뉜 점들이 각각 클러스터
  • 빨간 X는 각 클러스터의 중심점

마무리 요약

항목설명
알고리즘 종류 비지도 학습 (Unsupervised)
사용 목적 자동으로 데이터 분류
주요 개념 중심점, 유클리드 거리, WCSS 최소화
실습 환경 저사양 CPU에서도 실행 가능

🔗 참고 자료

 

https://matplotlib.org/stable/tutorials/introductory/pyplot.html

 

matplotlib.org

 

 

make_blobs

Gallery examples: Release Highlights for scikit-learn 1.1 Release Highlights for scikit-learn 0.23 Probability Calibration for 3-class classification Probability calibration of classifiers Normal, ...

scikit-learn.org

 

 

KMeans

Gallery examples: Release Highlights for scikit-learn 1.1 Release Highlights for scikit-learn 0.23 A demo of K-Means clustering on the handwritten digits data Bisecting K-Means and Regular K-Means ...

scikit-learn.org

 

728x90
반응형

+ Recent posts