资源描述:
《梯度下降与最小二乘法》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、梯度下降与最小二乘法#include "stdafx.h"#include "cv.h"#include "cxcore.h"#include "highgui.h"#include #include #include #include #pragma comment(lib, "cv.lib")#pragma comment(lib, "cxcore.lib")#pragma comment(lib, "highgui.lib")using namespace std;double Comput
2、eGradient(vector pts, double theta0, double theta1, int index){ double retVal = 0; if(index == 0) { for(int i = 0; i < pts.size(); ++i) { retVal += ((theta0 + theta1*pts[i].x)-pts[i].y)*1; } } else { for(int i = 0; i
3、 < pts.size(); ++i) { retVal += ((theta0 + theta1*pts[i].x)-pts[i].y)*pts[i].x; } } return retVal;}int _tmain(int argc, _TCHAR* argv[]){ IplImage *img = cvCreateImage(cvSize(800, 600), 8, 3); cvZero(img); // create data vector pts
4、; srand(time(NULL)); for(int x = 0; x < img->width/4; x += 3) { double y = 2*x + rand()%50; CvPoint2D32f pt = cvPoint2D32f(x, y); pts.push_back(pt); } // gradient descent method double theta0 = 0.0, theta1 = 0.0; double alpha = 0.000001; cvNa
5、medWindow("disp", 1); for(int l = 0; l < 100; ++l) { cout << "(theta0, theta1): " << "(" << theta0 << ", " << theta1 << ")" << endl; double tempTheta0 = theta0 - alpha*ComputeGradient(pts, theta0, theta1, 0); double tempTheta1 = theta1 - alpha*ComputeGradient(
6、pts, theta0, theta1, 1); double eps = sqrt( (tempTheta0-theta0)*(tempTheta0-theta0) + (tempTheta1-theta1)*(tempTheta1-theta1)); if(eps < 0.001) break; else { theta0 = tempTheta0; theta1 = tempTheta1; } //
7、 update result cvZero(img); for(int i = 0; i < pts.size(); ++i) { cvDrawCircle(img, cvPoint(pts[i].x, pts[i].y), 2, CV_RGB(250, 0, 0), 2, CV_AA); } cvDrawLine(img, cvPoint(0, theta0), cvPoint(200, theta0+200*theta