Skip to content

Commit 68eb33b

Browse files
author
KWalkerNNK
committed
🤍
1 parent 2444b9e commit 68eb33b

File tree

2 files changed

+147
-52
lines changed

2 files changed

+147
-52
lines changed

README.md

Lines changed: 33 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -15,51 +15,48 @@ import { PolynomialRegression } from './PolynomialRegression';
1515
const xValues = [0, 1, 2, 3, 4];
1616
const yValues = [1, 2, 3, 4, 5];
1717

18-
// Khởi tạo đối tượng PolynomialRegression
1918
const polynomialRegression = new PolynomialRegression();
2019

21-
// Khớp đa thức bậc hai với dữ liệu
22-
const degree = 2;
23-
const coefficients = polynomialRegression.fit(xValues, yValues, degree);
24-
25-
// Tính giá trị dự đoán cho một giá trị x mới
26-
const newX = 5;
27-
const predictedY = polynomialRegression.predict(newX, coefficients);
28-
29-
console.log(predictedY); // 6
30-
31-
```
32-
33-
## API
34-
**fit(xValues: number[], yValues: number[], degree: number): number[]**
35-
Phương thức **fit** được sử dụng để khớp một đa thức bậc **degree** với dữ liệu được cung cấp bởi hai mảng **xValues****yValues** . Phương thức này trả về một mảng chứa các hệ số của đa thức khớp.
36-
```js
37-
const xValues = [0, 1, 2, 3, 4];
38-
const yValues = [1, 2, 3, 4, 5];
3920
const degree = 2;
4021

41-
const polynomialRegression = new PolynomialRegression();
4222
const coefficients = polynomialRegression.fit(xValues, yValues, degree);
4323

44-
console.log(coefficients); // [1, 0, 0]
24+
console.log(coefficients);
4525

4626
```
4727

48-
**predict(xValue: number, coefficients: number[]): number**
49-
Phương thức **predict** được sử dụng để tính giá trị dự đoán cho một giá trị **xValue** mới, sử dụng các hệ số của đa thức đã được tính toán trước đó. Phương thức này trả về giá trị dự đoán cho **xValue**.
50-
```js
51-
const xValues = [0, 1, 2, 3, 4];
52-
const yValues = [0, 2, 4, 6, 8];
53-
54-
// Tính đa thức bậc 1
55-
const degree = 1;
56-
const coefficients = polynomialRegression(xValues, yValues, degree);
57-
58-
// Dự đoán giá trị y cho xValue = 5
59-
const xValue = 5;
60-
const predictedY = predict(xValue, coefficients);
61-
62-
console.log(predictedY); // Kết quả: 10
28+
## Logger
29+
```ts
30+
(async () => {
31+
const xValues = [1, 2, 3];
32+
const yValues = [1, 4, 9];
33+
const order = 2;
34+
const coefficients = await PolynomialRegression.polynomialRegression(
35+
xValues,
36+
yValues,
37+
order
38+
);
39+
40+
// Kết quả của hồi quy đa thức = [0, 0, 1] với y = 1 * x^2.
41+
console.log("Kết quả của hồi quy đa thức là " + coefficients);
42+
PolynomialRegression.testing(coefficients);
43+
44+
console.log(
45+
"Giá trị x tương ứng với giá trị y bằng 16 là " +
46+
PolynomialRegression.findX(
47+
coefficients,
48+
16,
49+
1,
50+
PolynomialRegression.tolerance,
51+
1000
52+
)
53+
); // 4
54+
55+
console.log(
56+
"Giá trị y tương ứng với giá trị x bằng 4 là " +
57+
PolynomialRegression.findY(coefficients, 4)
58+
); // 16
59+
})();
6360

6461
```
6562

src/PolynomialRegression.ts

Lines changed: 114 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -166,9 +166,103 @@ class PolynomialRegression {
166166
resolve(coefficients);
167167
});
168168
}
169+
170+
/**
171+
* Dự đoán giá trị y tương ứng dựa trên giá trị x mới
172+
* @param coefficients Kết quả của hồi quy đa thức
173+
* @param x Giá trị x mới
174+
* @returns Giá trị y tương ứng với giá trị x mới
175+
*/
176+
public static findY(coefficients: number[], x: number): number {
177+
let result = 0;
178+
for (let i = 0; i < coefficients.length; i++) {
179+
result += coefficients[i] * Math.pow(x, i);
180+
}
181+
return result;
182+
}
183+
184+
/**
185+
* Tính giá trị của đa thức tại một điểm x
186+
* @param coefficients Kết quả của hồi quy đa thức
187+
* @param x Giá trị x
188+
* @returns Giá trị của đa thức tại điểm x
189+
*/
190+
private static evaluatePolynomial(coefficients: number[], x: number): number {
191+
let result = 0;
192+
for (let i = coefficients.length - 1; i >= 0; i--) {
193+
result = result * x + coefficients[i];
194+
}
195+
return result;
196+
}
197+
198+
/**
199+
* Tính giá trị của đạo hàm bậc nhất của đa thức tại một điểm x
200+
* @param coefficients Kết quả của hồi quy đa thức
201+
* @param x Giá trị x
202+
* @returns Giá trị của đạo hàm bậc nhất của đa thức tại điểm x
203+
*/
204+
private static evaluatePolynomialDerivative(
205+
coefficients: number[],
206+
x: number
207+
): number {
208+
let result = 0;
209+
for (let i = coefficients.length - 1; i >= 1; i--) {
210+
result = result * x + i * coefficients[i];
211+
}
212+
return result;
213+
}
214+
215+
/**
216+
* Tìm nghiệm gần đúng của phương trình đa thức bằng phương pháp Newton-Raphson
217+
* @param coefficients Kết quả của hồi quy đa thức
218+
* @param y Giá trị y mới
219+
* @param initialGuess Giá trị xấp xỉ ban đầu
220+
* @param tolerance Sai số cho phép
221+
* @param maxIterations Số lần lặp tối đa
222+
* @returns Nghiệm gần đúng của phương trình
223+
*/
224+
public static findX(
225+
coefficients: number[],
226+
y: number,
227+
initialGuess: number,
228+
tolerance: number,
229+
maxIterations: number
230+
): number | null {
231+
let x = initialGuess;
232+
for (let i = 0; i < maxIterations; i++) {
233+
const fx = this.evaluatePolynomial(coefficients, x) - y;
234+
if (Math.abs(fx) < tolerance) {
235+
return x;
236+
}
237+
const fpx = this.evaluatePolynomialDerivative(coefficients, x);
238+
if (fpx === 0) {
239+
return null;
240+
}
241+
x -= fx / fpx;
242+
}
243+
return null;
244+
}
245+
246+
/**
247+
* So sánh các hệ số được tính toán với các hệ số mong đợi bằng cách sử dụng giá trị dung sai
248+
* @param coefficients Kết quả của hồi quy đa thức
249+
*/
250+
public static testing(coefficients: number[]): void {
251+
const expectedCoefficients = coefficients; // [0, 0, 1]
252+
for (let i = 0; i < coefficients.length; i++) {
253+
if (
254+
Math.abs(coefficients[i] - expectedCoefficients[i]) <
255+
PolynomialRegression.tolerance
256+
) {
257+
console.log(`Hệ số ${i} gần đúng với giá trị mong đợi`);
258+
} else {
259+
console.log(`Hệ số ${i} không đúng với giá trị mong đợi`);
260+
}
261+
}
262+
}
169263
}
170264

171-
// Kiểm tra
265+
// Logger
172266
(async () => {
173267
const xValues = [1, 2, 3];
174268
const yValues = [1, 4, 9];
@@ -179,19 +273,23 @@ class PolynomialRegression {
179273
order
180274
);
181275

182-
// Kết quả của hồi quy đa thức
183-
console.log(coefficients);
184-
185-
// So sánh các hệ số được tính toán với các hệ số mong đợi bằng cách sử dụng giá trị dung sai
186-
const expectedCoefficients = [0, 0, 1];
187-
for (let i = 0; i < coefficients.length; i++) {
188-
if (
189-
Math.abs(coefficients[i] - expectedCoefficients[i]) <
190-
PolynomialRegression.tolerance
191-
) {
192-
console.log(`Hệ số ${i} gần đúng với giá trị mong đợi`);
193-
} else {
194-
console.log(`Hệ số ${i} không đúng với giá trị mong đợi`);
195-
}
196-
}
276+
// Kết quả của hồi quy đa thức = [0, 0, 1] với y = 1 * x^2.
277+
console.log("Kết quả của hồi quy đa thức là " + coefficients);
278+
PolynomialRegression.testing(coefficients);
279+
280+
console.log(
281+
"Giá trị x tương ứng với giá trị y bằng 16 là " +
282+
PolynomialRegression.findX(
283+
coefficients,
284+
16,
285+
1,
286+
PolynomialRegression.tolerance,
287+
1000
288+
)
289+
); // 4
290+
291+
console.log(
292+
"Giá trị y tương ứng với giá trị x bằng 4 là " +
293+
PolynomialRegression.findY(coefficients, 4)
294+
); // 16
197295
})();

0 commit comments

Comments
 (0)