فهرست مقاله
آموزش numpy.linalg.lstsq برای کالیبراسیون حسگر با کد کامل، خروجی اجراشده، کنترل رتبه و پاسخ تمرین تبدیل واحد.
این آموزش با دادهٔ مصنوعی و مثال تألیفی تهیه شده است. تصاویر، تصویرسازی مفهومیاند و شاهد عملکرد یک دستگاه واقعی نیستند. پاسخ تمرینها در متن آمده است. تاریخ بازبینی: ۲۲ مهر ۱۴۰۵؛ مبنای ساعت انتشار، تهران است.
۱. از دادهٔ حسگر تا مسئلهٔ کمترین مربعات
یک مدل پایهٔ قابل توضیح، شروع مناسبی برای یادگیری ماشین روی دادهٔ مهندسی است. در این مثال ولتاژ حسگر فشار را از فشار مرجع تخمین میزنیم. دادهها همان مقادیر مصنوعی آموزش کالیبراسیون در متلب هستند تا مقایسهٔ زبانها به تغییر داده وابسته نشود. مدل دو پارامتر دارد: عرض از مبدأ با واحد ولت و بهره با واحد ولت بر بار. خروجی مورد نظر یک مقدار پیوسته است و مسئله، طبقهبندی نیست.

برازش خط، همهٔ مسائل حسگر را حل نمیکند. باید بدانیم فشار مرجع چگونه تهیه شده، خطای مرجع چقدر است و آیا رابطه در شرایط دمایی متفاوت باقی میماند. در این درس دادهٔ واقعی جمعآوری نمیشود و هدف، فهم محاسبات است. ابزار مناسب از اندازهٔ مسئله و قرارداد داده پیروی میکند؛ برای شش نقطه و دو پارامتر، شبکهٔ عمیق پیچیدگی اضافه میآورد. با نامگذاری متغیرها بر اساس واحد، نتیجهٔ ولتاژ و فشار را از هم جدا نگه میداریم.
۲. شکل آرایه و تفاوت اندیس پایتون و متلب
در NumPy اندیس نخست صفر است. بنابراین نقاطی که در متلب با شمارههای یک، دو، چهار و شش انتخاب میشدند، اینجا با صفر، یک، سه و پنج انتخاب میشوند. این تفاوت باید در مقایسهٔ دو پیادهسازی روشن باشد. ستون یکها و ستون فشار را با column_stack کنار هم میگذاریم؛ ماتریس آموزشی چهار در دو و بردار هدف چهارعضوی است. علامت @ ضرب ماتریسی است؛ علامت * روی آرایههای NumPy ضرب عضو به عضو انجام میدهد.

دو نقطهٔ آزمون از ابتدا کنار گذاشته میشوند و در محاسبهٔ پارامتر شرکت ندارند. این مثال آزمون درون بازه را نشان میدهد، چون فشار دو و چهار میان حدود آموزشیاند. استفاده از مدل برای فشار ده بار، با این آزمون توجیه نمیشود. پیش از محاسبه، تعداد سطرهای ورودی و هدف، وجود مقدار نامتناهی یا تهی و واحد هر ستون را بررسی کنید. خطای شکل آرایه گاهی بدون استثنا اجرا میشود و خروجی ناخواسته تولید میکند؛ بررسی ابعاد بخشی از بررسی علمی است.
۳. کد کامل NumPy و کنترل رتبه
مثال زیر در Python 3.14 با NumPy 2.5.4 اجرا شده است. همهٔ دادهها در متن کد هستند و فایل، حساب کاربری یا سرویس بیرونی لازم نیست. مرجع رسمی numpy.linalg.lstsq خروجی پارامترها، باقیمانده، رتبه و مقادیر منفرد را شرح میدهد. آرایهٔ residuals در بعضی وضعیتها خالی است؛ برای گزارش آزمون، خطا را از اختلاف پیشبینی و هدف مستقل محاسبه میکنیم و فرض نمیکنیم residuals همیشه یک عدد دارد.

import numpy as np
pressure_bar = np.arange(6, dtype=float)
noise_V = np.array([0.01, -0.01, 0.015, 0.005, -0.02, -0.005])
voltage_V = 1.0 + 0.6 * pressure_bar + noise_V
train_idx = np.array([0, 1, 3, 5])
test_idx = np.array([2, 4])
Xtrain = np.column_stack([np.ones(4), pressure_bar[train_idx]])
beta, residuals, rank, singular_values = np.linalg.lstsq(
Xtrain, voltage_V[train_idx], rcond=None
)
assert rank == 2 and beta[1] > 0
Xtest = np.column_stack([np.ones(2), pressure_bar[test_idx]])
pred_V = Xtest @ beta
rmse_V = np.sqrt(np.mean((pred_V - voltage_V[test_idx]) ** 2))
recovered_bar = (voltage_V[test_idx] - beta[0]) / beta[1]
print(f"offset = {beta[0]:.6f} V")
print(f"gain = {beta[1]:.6f} V/bar")
print(f"test RMSE = {rmse_V:.6f} V")
print("recovered pressure (bar):", np.round(recovered_bar, 6))
assert np.isfinite(rmse_V) and 0 < rmse_V < 0.03
کنترل رتبه، قابل شناسایی بودن دو پارامتر را میسنجد. برای توضیح رتبهٔ عددی و اثر آستانه، مرجع matrix_rank را ببینید. در دادهٔ واقعی، تفاوت بسیار زیاد مقیاس ستونها میتواند به حساسیت عددی منجر شود. تبدیل مقیاس باید با تفسیر پارامترها هماهنگ باشد؛ تغییر واحد فشار، مقدار بهره را عوض میکند ولی نباید ولتاژ پیشبینیشده را تغییر دهد.
۴. خروجی واقعی و گزارش با واحد
خروجی این اجرا عبارت است از عرض از مبدأ ۱٫۰۰۳۰۵۱ ولت، بهرهٔ ۰٫۵۹۸۶۴۴ ولت بر بار و RMSE آزمون ۰٫۰۱۶۲۱۲ ولت. فشارهای بازیابیشده ۲٫۰۲۴۴۹۰ و ۳٫۹۷۰۵۵۵ بار هستند. این خروجی اجرای همین دادهٔ مصنوعی است و دقت صنعتی محسوب نمیشود. ارقام چاپشده تا شش رقم اعشار گرد شدهاند؛ تغییر جزئی در محاسبات کتابخانه یا محیط میتواند ارقام انتهایی را عوض کند، بنابراین مقایسهٔ نتیجه را با تلورانس انجام دهید.

برای گزارش، فشار مرجع، ولتاژ اندازهگیریشده، ولتاژ پیشبینیشده و باقیمانده را کنار هم نگه دارید. تنها چاپ یک RMSE کمک نمیکند بفهمیم خطا در کدام بخش بازه بیشتر است. تبدیل معکوس، اختلاف ولتاژ با offset را بر gain تقسیم میکند؛ اگر gain بسیار کوچک باشد، اغتشاش کوچک ولتاژ میتواند به خطای زیاد فشار تبدیل شود. این مشاهده از خود رابطه به دست میآید و با افزودن نمونههای تکراری در یک نقطه، الزاماً برطرف نمیشود.
۵. تمرین حلشده و انتقال به پروژهٔ یادگیری ماشین
تمرین: اگر واحد فشار را از بار به کیلوپاسکال عوض کنیم، چه اتفاقی برای بهره میافتد؟ پاسخ: هر بار صد کیلوپاسکال است، پس مقدار عددی بهرهٔ ولت بر کیلوپاسکال یکصدم مقدار ولت بر بار میشود؛ عرض از مبدأ همان ولتاژ قبلی است. تمرین دوم: چرا میانگین علامتدار خطا معیار کافی نیست؟ پاسخ: خطاهای مثبت و منفی میتوانند همدیگر را خنثی کنند. برای اندازهٔ خطا از معیار مناسب مانند RMSE یا میانگین قدر مطلق استفاده کنید و الگوی باقیمانده را نیز ببینید.

وقتی تعداد ویژگیها بیشتر شود، آمادهسازی داده و حفظ قرارداد پیشبینی پیچیدهتر خواهد شد. آموزش جلوگیری از نشت داده با Pipeline مرحلهٔ بعد را با مثال طبقهبندی نشان میدهد. پیش از تغییر مدل، نمونهٔ پایه، تقسیم داده، واحدها و نسخهٔ کتابخانه را ثبت کنید. این کار امکان بازبینی نتیجه را فراهم میکند و مانع میشود تفاوت زبان یا روش آمادهسازی، به اشتباه به برتری یک الگوریتم نسبت داده شود.
منابع و مطالعهٔ بیشتر
بررسی منابع: ۲۲ مهر ۱۴۰۵. تحلیلها و پیشنهادهای اجرایی، جمعبندی نویسندهاند.


