티스토리 뷰
[개요]
배터리 용량에 대한 충전 전압과 전류, 방전 전압과 전류 측정치를 이용하여
테스트 전압과 전류값에 대한 용량을 추정하는 문제
[Python Codes]
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neural_network import MLPRegressor
from sklearn.metrics import mean_squared_error, r2_score
import matplotlib.pyplot as plt
# 데이터 생성
np.random.seed(42)
n_samples = 500
# 입력 데이터: 충전 전압/전류, 방전 전압/전류
charge_voltage = np.random.uniform(4.8, 24.0, n_samples)
charge_current = np.random.uniform(0.1, 5.0, n_samples)
discharge_voltage = np.random.uniform(4.8, 24.0, n_samples)
discharge_current = np.random.uniform(0.1, 5.0, n_samples)
# 기준 용량 계산 (예제 데이터, 실제로는 측정 데이터 사용)
true_capacity = (
0.5 * charge_voltage +
0.3 * charge_current +
0.2 * discharge_voltage -
0.1 * discharge_current +
np.random.normal(0, 0.5, n_samples) # 노이즈 추가
)
# 데이터프레임 생성
data = pd.DataFrame({
"charge_voltage": charge_voltage,
"charge_current": charge_current,
"discharge_voltage": discharge_voltage,
"discharge_current": discharge_current,
"capacity": true_capacity
})
# 독립 변수 (X)와 종속 변수 (y) 분리
X = data[["charge_voltage", "charge_current", "discharge_voltage", "discharge_current"]]
y = data["capacity"]
# 데이터 분할 (훈련 데이터와 테스트 데이터)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 데이터 정규화
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# 모델 생성 및 학습
model = MLPRegressor(hidden_layer_sizes=(32, 16), activation='relu', solver='adam', max_iter=500, random_state=42)
model.fit(X_train_scaled, y_train)
# 예측
y_train_pred = model.predict(X_train_scaled)
y_test_pred = model.predict(X_test_scaled)
# 모델 성능 평가
mse_train = mean_squared_error(y_train, y_train_pred)
mse_test = mean_squared_error(y_test, y_test_pred)
r2_train = r2_score(y_train, y_train_pred)
r2_test = r2_score(y_test, y_test_pred)
# 결과 출력
print("다층 신경망 회귀 모델 성능")
print(f"훈련 데이터 MSE: {mse_train:.4f}, R^2: {r2_train:.4f}")
print(f"테스트 데이터 MSE: {mse_test:.4f}, R^2: {r2_test:.4f}")
# 시각화: 실제 값과 예측 값 비교
plt.figure(figsize=(10, 5))
plt.scatter(y_test, y_test_pred, alpha=0.7)
plt.plot([min(y_test), max(y_test)], [min(y_test), max(y_test)], color="red", linestyle="--", label="Ideal Fit")
plt.title("Actual vs Predicted Capacity")
plt.xlabel("Actual Capacity")
plt.ylabel("Predicted Capacity")
plt.legend()
plt.show()
[결과]
다층 신경망 회귀 모델 성능
훈련 데이터 MSE: 0.3370, R^2: 0.9683
테스트 데이터 MSE: 0.5042, R^2: 0.9450
[테스트 배터리에 대한 용량 추정 코드]
# 새로운 측정값 입력 및 기준 용량 추정
# 실제 측정값 예제: 충전 전압, 충전 전류, 방전 전압, 방전 전류
new_data = pd.DataFrame({
"charge_voltage": [12.0, 18.0, 6.5], # 측정된 충전 전압
"charge_current": [2.5, 3.0, 1.2], # 측정된 충전 전류
"discharge_voltage": [11.8, 17.5, 6.0], # 측정된 방전 전압
"discharge_current": [1.8, 2.5, 0.8] # 측정된 방전 전류
})
# 입력 데이터 정규화 (훈련 데이터와 동일한 스케일 사용)
new_data_scaled = scaler.transform(new_data)
# 기준 용량 추정
predicted_capacity = model.predict(new_data_scaled)
# 결과 출력
for i, capacity in enumerate(predicted_capacity):
print(f"측정값 {i + 1} - 추정 기준 용량: {capacity:.2f}")
반응형
'SWDesk > ArtificialIntelligence' 카테고리의 다른 글
제조업에 적용된 인공지능 기술 사례 10선 (2) | 2024.12.14 |
---|---|
제조업장 내 목적별 사용가능한 인공지능 알고리즘 예시 (5) | 2024.12.03 |
선형회귀 알고리즘과 동일한 기능을 수행하는 신경망 예시 코드 (0) | 2024.11.29 |
CNN 계층 설정 사례 (0) | 2024.11.28 |
신경망에서 이용되는 활성화 함수 종류 및 특징 (0) | 2024.11.27 |
반응형
250x250
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 배프
- 전압전류모니터링
- Innovations&Hurdles
- 혁신
- ServantClock
- DYOV
- Video
- 치매방지
- 전압
- Decorator
- bilient
- arduino
- image
- 치매
- 아두이노
- badp
- 심심풀이
- BSC
- 허들
- Hurdles
- 혁신과허들
- 빌리언트
- 티스토리챌린지
- 전류
- 심심풀이치매방지기
- 둎
- 절연형
- Innovation&Hurdles
- Innovations
- 오블완
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함