이번 포스트에서는
- AI 기반 인체 및 질병 이해를 위한 첫걸음인 데이터 처리의 기본이 되는 선형대수학 개념과
NumPy를 활용한 가중합 계산 방법을 다루어보겠습니다.
- 벡터, 행렬, 전치, 내적 등의 개념을 학습하고 실제 데이터에 적용하는 방법을 다루겠습니다.
AI와 언어, 선형대수
인공지능(AI)와 자연어 처리(NLP)
AI는 수많은 단어와 문장을 숫자로 바꿔서 이해하려고 합니다.
이렇게 언어를 숫자로 바꾸는 것을 '임베딩(embedding) 이라고 하는데,
이 과정에서 선형대수 라는 수학 도구가 아주 중요하게 쓰입니다.
예를 들어, '사과'라는 단어는 [1,0,0] 벡터로, '바나나'는 [0,1,0] 벡터로 표현하는 식입니다.
실제로는 더 복잡한 숫자들이 사용디지만 이렇게 숫자로 표현된 단어들을 가지고 AI는 단어들 간의 관계를 파악하고,
문장의 의미를 이해하게 됩니다. 선형대수는 이 숫자들을 효율적으로 다루고 계산하는 방법을 제공하는 것입니다.
언어(Language)와 벡터
: 언어 데이터를 벡터로 표현하여 컴퓨터가 처리할 수 있도록 합니다.
- 원-핫 인코딩(One-Hot Encoding)
: 단어를 고차원 벡터로 표현하는 방법으로, 해당 언어만 1이고 나머지는 0인 형태로 표현합니다.
예시로 '사과','바나나','딸기'가 있을 때 '사과'는 [1,0,0]으로 표현됩니다.
- 단어 임베딩(Word Embedding)
: 단어의 의미를 다차원 공간의 한 점(벡터)로 표현하여 단어 간의 유사성을 거리로 나타냅니다.
예시로 '왕'-'남자'+'여자'='여왕' 같은 연산이 가능해집니다.
- 데이터 타입:
◦ 문자열(string): 텍스트 데이터 (예: "안녕하세요")
◦ 정수(int): 소수점이 없는 숫자(예: 10)
◦ 실수(float): 소수점이 있는 숫자 (예: 3.14)
◦ 참/거짓(boolean): True 또는 False
* 컴퓨터는 "10"과 10을 다르게 보는 점을 주의해야 합니다.
"10"은 문자열이고, 10은 정수입니다. 문자열"10"으로는 더하기 빼기를 할 수 없지만 정수 10으로는 할 수 있습니다.
데이터 타입을 정확히 아는 것이 중요합니다!
선형대수(Linear Algebra)와 행렬
선형대수는 벡터와 행렬을 다루는 수학 분야로 AI에서 데이터 표현과 계산의 핵심 역할을 합니다.
AI가 데이터를 처리하고 학습하는데 가장 기본이 되는 수학분야로, 필수적입니다.
- 스칼라(scalar): 하나의 숫자 값
그냥 하나의 숫자라고 생각하면 됩니다. 온도를 나타내는 25'C나, 개수를 나타내는 3 같은겁니다.
** 피쳐(Feature) 와는 다른 것을 알아야 합니다.
피쳐는 데이터에서 특성 또는 속성으로,
AI 모델이 예측이나 분류를 수행할 때 입력으로 사용하는 개별적인 정보를 말합니다.
각 피쳐는 일반적으로 하나의 스칼라 값으로 표현됩니다.
예를 들어
한 환자의 다양한 건강 정보(예: 운동 시간. 최대 심박수, 체중, 나이) 각각이 피쳐이며
이 피쳐들을 모아 [60분, 146bpm, 77.4kg, 32세] 와 같은 벡터로 표현할 수 있습니다.
여기서 60, 146, 77.4, 32 각각은 스칼라입니다.
쉽게 말하면 피쳐는 키, 나이, 체중, 혈압 처럼 데이터의 항목 이름이고
스칼라는 그 각각의 항목에 들어가는 실제 하나의 숫자 값 (170, 30, 75.2, 120/80등) 입니다. **
- 벡터(vector): 여러 숫자가 나열된 1차원 배열
여러 숫자가 한줄로 늘어서있는 거라고 생각하면 됩니다.
예를 들어 운동선수의 기록(키, 몸무게, 달리기 기록)을 한 줄로 묶어놓은 것과 같습니다. : [170, 65, 10.5]
- 행렬(matrix): 여러 벡터가 쌓여있는 2차원 배열
위의 벡터들이 여러개 쌓여서 표처럼 되어 있는 겁니다. 여러 운동 선수들의 기록을 모아놓으면 행렬이 됩니다.
[170 65 10.5]
[180 70 9.8]
[165 58 11.2]
- 전치(transpose): 행렬의 행과 열을 바꾸는 연산
위의 행렬을 눕히거나 세우는 것과 같습니다.
행과 열을 서로 바꾸는 것으로 표의 가로줄과 세로줄을 바꾸는 것과 같습니다.
- 내적(dot product): 두 벡터를 곱하여 하나의 스칼라 값을 얻는 연산. 벡터의 유사성을 측정하는데 사용
두 벡터가 얼마나 비슷한 방향을 가리키는지, 얼마나 관련이 있는지를 하나의 숫자로 나타내줍니다.
AI에서는 입력 데이터와 가중치(중요도) 벡터의 내적을 계산해서 얼마나 중요한 정보인지 판단하는데 사용됩니다.
- 행렬 곱셈(matrix multiplication): 두 행렬을 곱하여 새로운 행렬을 만듦. 각 결과 칸은 두 벡터의 내적을 통해 계산됨.
여러번의 내적을 통해 새로운 행렬을 만드는 복잡한 연산입니다.
마치 여러 운동선수들의 기록(행렬A)과 각 기록의 중요도(행렬B)를 곱해서,
최종 점수(새로운 행렬 C)를 계산하는 것과 비슷합니다.
이 과정은 AI 모델이 여러 입력값을 동시에 처리하고 복잡한 패턴을 학습하는데 핵심적으로 사용됩니다.
* AI 모델은 수많은 숫자 데이터를 벡터와 행렬 형태로 표현하고, 이들을 선형대수 연산으로 처리하며 학습합니다.
예를 들어, 사진 속 강아지의 특징(귀 모양, 털 색깔 등)들을 숫자로 바꿔서 벡터로 만들고, 이 벡터들을 조합하고 연산하면서
강아지인지 아닌지를 판단하는 겁니다. 이 모든 과정에 스칼라, 벡터, 행렬, 내적/행렬 곱셈이 기본으로 깔려 있습니다.

NumPy 라이브러리 활용
Python의 NumPy는 과학 계산용 패키지로, 빠르고 효율적인 다차원 배열(벡터, 행렬) 처리를 담당합니다.
Python으로 AI나 데이터 분석을 할 때 수많은 숫자를 다루는 일이 많은데, 이 때 NumPy는 이 숫자들을 빠르고
효율적으로 계산할 수 있도록 도와주는 도구입니다.
특히 벡터나 행렬처럼 여러 숫자가 모여있는 배열을 다루는데에 특화되어 있습니다.
- np.array() : 리스트를 NumPy 배열로 변환
- np.dot() : 두 배열의 내적을 계산
- reshape() : 배열의 차원을 변경
- transpose() : 배열의 전치를 수행
| 용어 | NumPy 표현 예시 | 설명 |
| 스칼라 | np.array(5) | 하나의 숫자 값 |
| 벡터 | np.array([1, 2, 3]) | 여러 숫자가 나열된 1차원 배열 |
| 행렬 | np.array([[1, 2], [3, 4]]) | 여러 벡터가 쌓여있는 2차원 배열 |
| 전치 | matrix.T | 행렬의 행과 열을 바꿈 |
| 내적 | np.dot(vector1, vector2) | 두 벡터를 곱해 하나의 스칼라 값을 얻음 |
| 행렬 곱셈 | np.dot(matrix1, matrix2) | 두 행렬을 곱해 새로운 행렬을 만듦 |
* 만약 헬스장 앱에서 운동 기록을 관리한다고 생각해본다면,
운동 시간, 최대 심박수, 체중, 나이 같은 데이터는 각각의 숫자들입니다.
이 숫자들을 np.array([60, 146, 77.1, 43]) 처럼 벡터로 만들 수 있습니다.
만약 이 데이터들을 중요도에 따라 다르게 계산하고 싶다면
'가중치(weights)'라는 또 다른 벡터를 만들어서 (예: [0.5, 0.3, 0.1, 0.1]) np.dot() 함수로 내적 계산할 수 있습니다.
np.dot(운동데이터, 가중치)를 하면 각 요소가 곱해지고 모두 더해져서 하나의 '건강 점수' 같은 것을 얻을 수 있습니다.
예측의 시작, 가중합 계산
가중치(Weight)와 편향(Bias)
AI 모델은 입력 데이터에 가중치를 곱하고 편향을 더하여 예측을 수행합니다.
가중치는 각 입력 특성의 중요도를 나타내고, 편향은 모델의 기본적인 경향을 조절합니다.
- 가중치(Weight):
각 입력 데이터가 결과에 미치는 영향력 또는 중요도를 나타내는 값
예를 들어 점심 메뉴를 고를 때 "맛있으면, 값이 싸면, 메뉴가 빨리 나오면" 등의 기준을 세우고
각 기준에 따라 점수를 매겨서 최종 메뉴를 고른다고 가정할 때 AI의 예측도 비슷하다고 생각하면 됩니다.
여기서 맛있으면 = 5점, 값이 싸면 = 3점, 메뉴가 빨리 나오면 = 2점 이라고 했을 때
이 5, 3, 2가 '가중치' 입니다. 즉 어떤 기준이 더 중요한지를 나타내는 중요도 라고 생각할 수 있습니다.
◦ 양의 가중치: 해당 특성이 증가할수록 결과도 증가
(예: 운동을 많이 할 수록 건강 점수가 올라간다-> 운동 시간에 양의 가중치)
◦ 음의 가중치: 해당 특성이 증가할수록 결과는 감소
(예: 흡연량이 많을수록 건강 점수가 내려간다 -> 흡연량에 음의 가중치)
◦ 절댓값이 큰 가중치: 해당 특성이 결과에 큰 영향
(예: 수능 점수가 대학 합격에 가장 중요하다 -> 수능 점수에 큰 가중치)
- 편향(Bias):
입력 특성와 상관없이 결과에 일정하게 더해지는 값으로, 모델의 기본 예측값을 조정
위와 같이 다시 예를 들 때 점심 메뉴를 고르면서 어떤 메뉴를 골라도 기본적으로 맛이 보장되는 집이라면
'기본 점수'를 깔고 가는 것과 같습니다. 편향은 이런 '기본 점수'역할을 합니다.
입력값(운동 시간 등)이 0일 때도 모델이 어떤 값을 출력할지 결정해주는 기준점이라고 이해하면 됩니다.
가중합(Weighted Sum) 공식
가중합은 각 입력 특성(xi)에 해당 가중치(wi)를 곱하고, 그 결과들을 모두 더한 후 편향(b)을 더하는 방식입니다.
여기서 d는 특성의 개수 입니다.

* 위에서 말한 "기준에 따라 점수를 매겨서 최종 메뉴를 고르는" 과정이 바로 가중합입니다.
(맛있는 정도 x 5점) + (가격 저렴한 정도 x 3점) + (나오는 속도 x 2점) + (기본 점수)
이런식으로 각 기준에 점수를 곱해서 더하고, 기본 점수까지 더하면 최종 점수가 나옵니다.
AI의 예측 과정도 비슷합니다.
* AI 모델이 학습하는 과정은 결국 이 가중치와 편향을 최적의 값으로 찾아가는 과정과 같습니다.
가중치와 편향을 잘 조절해야 모델이 더 정확하게 예측할 수 있게 됩니다.
파이썬 및 NumPy를 활용한 가중합 구현
실제 데이터를 기반으로 가중합을 계산해보겠습니다.
- 환자 데이터(특성): 운동 시간. 최대 심박수, 나이 등의 정보를 벡터로 표현합니다.
예시: patient_data = np.array([60, 146, 77.1, 43]) (운동 시간, 최대 심박수, 체중, 나이)
- 가중치: 각 특성에 대한 중요도
예시: weights = np.array([0.5, 0.3, 0.1, 0.1]) (운동 시간이 가장 중요하고, 나이는 덜 중요)
- 가중합 계산: NumPy의 np.dot() 함수를 사용해 특성 벡터와 가중치 벡터의 내적을 계산합니다.
import numpy as np
patient_data = np.array([60, 146, 77.1, 43]) # 운동시간, 최대심박수, 체중, 나이
weights = np.array([0.5, 0.3, 0.1, 0.1]) # 각 특성의 가중치
bias = 10 # 편향
weighted_sum = np.dot(patient_data, weights) + bias
print(weighted_sum) # 예시: 120.31
이 예시에서 120.31 이라는 가중합 값은 해당 환자의 건강 점수나 질병 위험도 등을 나타낼 수 있습니다.
점수가 높으면 건강하다고 예측하거나, 낮으면 질병 위험이 높다고 예측하는 식으로 활용됩니다.
* 만약 환자가 100명이라면 이 계산을 일일이 손으로 하거나 일반 파이썬 리스트로 했을 경우 매우 번거롭고 느릴 수 있습니다.
하지만 NumPy는 이런 배열 계산에 최적화되어 있기 떄문에 빠르고 효율적으로 진행할 수 있습니다!
'[오즈코딩스쿨] AI 헬스케어 > ➕ 기초 수학과 통계' 카테고리의 다른 글
| [기초 수학과 통계] 함수와 그래프 (0) | 2025.10.16 |
|---|---|
| [기초 수학과 통계] 평균, 중앙값, 표준편차, 히스토그램 (1) | 2025.10.16 |