Статья Автор: Деникина Н.В., Деникин А.В.

Предсказание сопротивления цепи

Сопротивление электрической цепи определяет, насколько сильно она препятствует току. Согласно закону Ома (\(R = \frac{V}{I} \)​), сопротивление зависит от свойств проводника: его длины, площади поперечного сечения и материала (удельного сопротивления). Например, длинный и тонкий провод имеет большее сопротивление, чем короткий и толстый.

Цель: Использовать машинное обучение, чтобы предсказать сопротивление проводника (в омах) на основе его длины, сечения и удельного сопротивления. Это задача регрессии, где мы предсказываем число (сопротивление).
 

Машинное обучение — это метод, который позволяет компьютеру находить закономерности в данных. В нашем случае:

  • Данные: Таблица с параметрами проводников (длина, сечение, удельное сопротивление) и их сопротивлением.
  • Задача: Научить модель предсказывать сопротивление проводника по его параметрам.
  • Этапы:
    1. Загрузка и обработка данных.
    2. Преобразование физических данных в числовые признаки.
    3. Обучение модели ML.
    4. Оценка модели и визуализация результатов.

Основные шаги

  1. Загрузка данных: Получаем таблицу с параметрами проводников и их сопротивлением.
  2. Предобработка: Преобразуем данные в числовой формат, подходящий для ML.
  3. Обучение модели: Используем алгоритм ML (например, линейную регрессию) для предсказания сопротивления.
  4. Визуализация: Строим графики, чтобы оценить точность модели.
  5. Анализ данных: Используем Pandas для исследования закономерностей.

Программа для предсказания сопротивления цепи:

Создадим программу на Python, которая:

  • Загружает синтетический датасет с параметрами проводников (длина, сечение, удельное сопротивление) и их сопротивлением.
  • Обучает модель линейной регрессии для предсказания сопротивления.
  • Визуализирует результаты с помощью Matplotlib.
  • Анализирует данные с помощью Pandas.

Для простоты мы создадим датасет внутри кода, имитирующий сопротивление проводников по формуле  \(R = \rho \frac{L}{A}​, где ρ\)— удельное сопротивление, L  — длина, A  — площадь сечения. В реальной задаче данные могут быть получены из экспериментов.

Этапы работы кода:

  1. Создание датасета:
    • Мы создали синтетический датасет с 10 проводниками. Для каждого указаны:
      • Длина проводника (Length, м).
      • Площадь поперечного сечения (Cross_Section, мм²).
      • Удельное сопротивление (Resistivity, Ом·мм²/м, например, для меди или алюминия).
      • Сопротивление (Resistance, Ом), рассчитанное по формуле \(R = \rho \frac{L}{A} \)​.
    • В реальной задаче данные могут быть получены из экспериментов или спецификаций материалов.
  2. Предобработка:
    • Создаём новый признак \( \frac{L}{A} \)​, который физически связан с сопротивлением.
    • Выбираем числовые признаки для модели ML.
  3. Разделение данных:
    • Делим данные на обучающую (70%) и тестовую (30%) выборки, чтобы проверить модель.
  4. Обучение модели:
    • Используем линейную регрессию — простой алгоритм ML для предсказания чисел (сопротивления).
  5. Оценка модели:
    • Считаем среднеквадратичную ошибку (MSE) — меру, насколько предсказания отличаются от истины.
    • Считаем R² — показатель, насколько модель объясняет данные (чем ближе к 1, тем лучше).
  6. Визуализация:
    • Сравнение предсказаний: Точечный график, показывающий истинные и предсказанные сопротивления.
    • Важность признаков: Гистограмма, показывающая, как длина, сечение и удельное сопротивление влияют на результат.
    • Зависимость сопротивления: График, показывающий, как сопротивление зависит от длины, с цветом по сечению.
    • Матрица корреляции: Тепловая карта, показывающая связи между признаками и сопротивлением.
  7. Анализ данных:
    • Считаем средние значения признаков и корреляцию между ними с помощью Pandas.

Вывод:

  • Файл resistance_prediction.png: График, сравнивающий истинные и предсказанные сопротивления.
  • Файл feature_importance.png: Гистограмма, показывающая важность длины, сечения и удельного сопротивления.
  • Файл resistance_vs_length.png: График зависимости сопротивления от длины.
  • Файл correlation_matrix.png: Тепловая карта корреляции между признаками.
  • Вывод в консоли: Ошибка модели, R², средние значения признаков и корреляционная матрица.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score
import seaborn as sns

# 1. Создаем синтетический датасет
# Признаки: длина проводника (Length, м), площадь сечения (Cross_Section, мм²), удельное сопротивление (Resistivity, Ом·мм²/м)
# Целевая переменная: сопротивление (Resistance, Ом)
# Формула: R = ρ * L / A
data = {
    'Length': [1.0, 2.0, 1.5, 3.0, 0.5, 2.5, 1.2, 1.8, 2.2, 0.8],
    'Cross_Section': [1.0, 0.5, 2.0, 1.5, 0.8, 1.2, 1.0, 0.6, 1.8, 2.5],
    'Resistivity': [0.017, 0.028, 0.017, 0.028, 0.017, 0.028, 0.017, 0.028, 0.017, 0.028],  # Пример: медь и алюминий
    'Resistance': [
        rho * L / A for rho, L, A in zip(
            [0.017, 0.028, 0.017, 0.028, 0.017, 0.028, 0.017, 0.028, 0.017, 0.028],
            [1.0, 2.0, 1.5, 3.0, 0.5, 2.5, 1.2, 1.8, 2.2, 0.8],
            [1.0, 0.5, 2.0, 1.5, 0.8, 1.2, 1.0, 0.6, 1.8, 2.5]
        )
    ]
}
df = pd.DataFrame(data)

# 2. Предобработка
# Создаем новый признак: L/A (физически связан с сопротивлением)
df['Length_over_Section'] = df['Length'] / df['Cross_Section']
features = df[['Length', 'Cross_Section', 'Resistivity', 'Length_over_Section']]
target = df['Resistance']

# 3. Разделение данных на обучающую и тестовую выборки
X_train, X_test, y_train, y_test = train_test_split(features, target, test_size=0.3, random_state=42)

# 4. Обучение модели линейной регрессии
model = LinearRegression()
model.fit(X_train, y_train)

# 5. Предсказание и оценка
y_pred = model.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f"Mean Squared Error (MSE): {mse:.4f}")
print(f"R^2 Score: {r2:.2f}")

# 6. Визуализация: сравнение предсказанных и истинных значений
plt.figure(figsize=(6, 4))
plt.scatter(y_test, y_pred, color='blue', s=100)
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'r--', lw=2)
plt.xlabel('True Resistance (Ω)')
plt.ylabel('Predicted Resistance (Ω)')
plt.title('True vs Predicted Resistance')
plt.savefig('resistance_prediction.png')
plt.close()

# Визуализация: важность признаков
feature_importance = pd.Series(model.coef_, index=features.columns)
plt.figure(figsize=(6, 4))
feature_importance.plot(kind='bar', color='skyblue')
plt.xlabel('Feature')
plt.ylabel('Coefficient (Importance)')
plt.title('Feature Importance for Resistance Prediction')
plt.savefig('feature_importance.png')
plt.close()

# Визуализация: зависимость сопротивления от длины
plt.figure(figsize=(8, 6))
scatter = plt.scatter(df['Length'], df['Resistance'], c=df['Cross_Section'], cmap='viridis', s=100)
plt.colorbar(scatter, label='Cross Section (mm²)')
plt.xlabel('Length (m)')
plt.ylabel('Resistance (Ω)')
plt.title('Resistance vs Length (Colored by Cross Section)')
plt.savefig('resistance_vs_length.png')
plt.close()

# 7. Анализ данных с Pandas
# Средние значения признаков
print("\nAverage values of features:")
print(df[['Length', 'Cross_Section', 'Resistivity']].mean())

# Корреляция между признаками и сопротивлением
correlation = df[['Length', 'Cross_Section', 'Resistivity', 'Resistance']].corr()
print("\nCorrelation matrix:")
print(correlation)

# Визуализация корреляции
plt.figure(figsize=(6, 4))
sns.heatmap(correlation, annot=True, cmap='coolwarm', vmin=-1, vmax=1)
plt.title('Correlation Matrix')
plt.savefig('correlation_matrix.png')
plt.close()
 

Задания для практики

  1. Добавьте в датасет ещё один признак, например, температуру проводника, и проверьте, как это влияет на точность.
  2. Постройте график зависимости сопротивления от площади сечения (аналогично resistance_vs_length.png).
  3. Попробуйте другой алгоритм ML, например, RandomForestRegressor из sklearn, и сравните результаты.
Печать