2012-08-31 41 views
23

Trong python, tôi có một hàm có nhiều tham số. Tôi muốn phù hợp với chức năng này với một tập dữ liệu, nhưng chỉ sử dụng một tham số, phần còn lại của các thông số mà tôi muốn tự cung cấp. Dưới đây là một ví dụ:Chỉ lắp một tham số của một hàm có nhiều tham số trong python

def func(x,a,b): 
    return a*x*x + b 

for b in xrange(10): 
    popt,pcov = curve_fit(func,x1,x2) 

Trong này tôi muốn rằng phù hợp được thực hiện chỉ dành cho a và tham số b mất giá trị của biến vòng lặp. Điều này có thể giải quyết như thế nào?

+0

Bạn nên xem http://en.wikipedia.org/wiki/Curve_fitting – ninjagecko

+0

Có những cách vô hạn để xác định ý nghĩa của việc "phù hợp" một đường cong và cho từng phương pháp, nhiều cách để thực hiện nó. Loại đường cong phù hợp bạn muốn thường phụ thuộc vào vấn đề bạn đang cố gắng giải quyết. Giả sử bạn không quan tâm, một cách đơn giản được gọi là hình vuông nhỏ nhất, giúp giảm thiểu tổng số ô vuông của các lỗi. Đây là thư viện được tạo sẵn để tính toán giải pháp cho một hình vuông nhỏ nhất "được giảm bớt": http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.curve_fit.html Câu hỏi chưa đầy đủ; Tôi đề nghị đóng và mở lại với một câu hỏi cụ thể về đường cong. – ninjagecko

+5

Tôi không quan tâm đến thuật toán, tôi sẽ chỉ sử dụng curve_fit từ scipy.optimize. Những gì tôi không thể hiểu được là nơi mà tôi nên xác định rằng một trong những tham số nên có giá trị của tôi và tham số nào nó nên phù hợp? – lovespeed

Trả lời

31

Bạn có thể quấn func trong một lambda, như sau:

def func(x,a,b): 
    return a*x*x + b 

for b in xrange(10): 
    popt,pcov = curve_fit(lambda x, a: func(x, a, b), x1, x2) 

Một lambda là một chức năng ẩn danh, mà trong Python chỉ có thể được sử dụng cho các chức năng một dòng đơn giản. Về cơ bản, nó thường được sử dụng để giảm số lượng mã khi không cần phải gán tên cho hàm. Mô tả chi tiết hơn được đưa ra trong tài liệu chính thức: http://docs.python.org/tutorial/controlflow.html#lambda-forms

Trong trường hợp này, lambda được sử dụng để sửa một trong các đối số của func. Hàm mới được tạo chỉ chấp nhận hai đối số: xa, trong khi b được cố định với giá trị được lấy từ biến số b cục bộ. Hàm mới này sau đó được chuyển thành curve_fit làm đối số.

+0

Bạn có thể vui lòng xây dựng? Lambda là gì? – lovespeed

+0

Tôi đã thêm chi tiết vào câu trả lời. –

0

Có một tùy chọn đơn giản hơn nếu bạn sẵn sàng/có thể chỉnh sửa chức năng gốc.

Xác định lại chức năng của bạn như:

def func(x,a): 
    return a*x*x + b 

Sau đó, bạn có thể chỉ cần đặt nó trong vòng lặp của bạn cho tham số b:

for b in xrange(10): 
    popt,pcov = curve_fit(func, x1, x2) 

Nên biết trước: các chức năng cần phải được xác định trong cùng một kịch bản trong đó nó được gọi là để làm việc này.

Các vấn đề liên quan