一. 讲座心得
刘洋师兄的讲座深入浅出,用通俗的语言给我们介绍了Computer Vision这个领域的相关知识。
开篇先介绍了几个很有意思的应用,印象最深刻的是速度与激情的视频,能够在如此快的速度下精确地识别到各个特征目标,很强势!接着向我们解释了一些基本的概念:监督学习&非监督学习、欠拟合&过拟合等等,之前有看过一点机器学习的入门视频,对这些概念有了一些基本的认识,要进一步理解的话还需要更多的应用实践。
对于如何学好Computer Vision,师兄给了很系统的建议,不管是技能要求还是学习资料都很详细的列举了出来。看着这么多东西有点鸭梨山大,感觉前路漫漫,要学的东西好多,不过有这么多小伙伴一起学习,也有了前进的动力。
How to learn CV(入门):
编程要求:matlab、python、C/C++
数学基础:微积分、矩阵、数理统计、优化理论
技能储备:C++教程(http://www.chinesemooc.org/mooc/4387)
python教程(https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000)
git教程(https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000)
学习资料:CS231N、CS229 阅读中文讲义,完成编程作业(http://blog.csdn.net/ccq976586618/article/details/52159655?locationNum=2&fps=1)
机器学习工程师——吴恩达(http://mooc.study.163.com/smartSpec/detail/1001319001.htm)
二. 作业小结
题目:
课后的编程小作业,让我对梯度下降算法有了更进一步的理解。对于凸函数f(x,y),求解minf,可利用:
x-= a*df/dx
y-= a*df/dy
分别用matlab和c语言进行了编程:
1. matlab拥有便捷的画图功能,结果直观可见,先画出函数在题目制定区间的三维图形,Hold on
clear all;
clc;
xa = -5:0.1:0;
ya = -5:0.1:0;
[x,y] = meshgrid(xa,ya);
z = func(x,y);
mesh(x,y,z)
hold on;
其中func为定义的函数:
function [ Fc ] = func(x,y)
a = 1-cos(x);
b = 1-sin(y);
c = x-y;
Fc = sin(y).* exp(a.*a)+cos(x).*exp(b.*b)+c.*c;
end
输入指定点(x0,y0)以及解算的步长a=0.0001,求解在这一点的两个偏导值,然后代入上面的梯度下降公式,运行次数一万次:
x0 = -3;
y0 = -4;
a = 0.0001;
i = 0;
while i <= 1000
i = i+1;
x0 = x0 + a*fnc_dzdx(x0,y0);
y0 = y0 + a*fnc_dzdy(x0,y0);
z0 = func(x0,y0);
plot3(x0,y0,z0,'.r');
end
其中求函数偏导直接利用matlab中的diff功能,然后带入(x0,y0)求解:
function [ dzdy_num1 ] = fnc_dzdy( x_num,y_num )
syms x y
z = func(x,y);
dzdy = diff(z,y);
dzdy_num = subs (dzdy,'x',x_num);
dzdy_num = subs(dzdy_num,'y',y_num);
dzdy_num1 = eval(dzdy_num);
end
运行结果如下:
可见,算法能够在一万次内求解到(x0,y0)附近的局部极大值。
2. c语言程序与matlab程序原理相同,代码如下:
#include
#include
#include
using namespace std;
double Func(double x, double y)
{
double cosx = cos(x), siny = sin(y);
double a = 1 - cosx, b = 1 - siny, c = x - y;
return siny*exp(a*a) + cosx*exp(b*b) + c*c;
}
double Dfx(double x, double y)
{
double dfx;
dfx = 2 * x - 2 * y - exp((sin(y) - 1)*(sin(y) - 1))*sin(x) - 2 * exp((cos(x) - 1)*(cos(x) - 1))*sin(x)*sin(y)*(cos(x) - 1);
return dfx;
}
double Dfy(double x, double y)
{
double dfy;
dfy = 2 * y - 2 * x + exp((cos(x) - 1)*(cos(x) - 1))*cos(y) + 2 * exp((sin(y) - 1)*(sin(y) - 1))*cos(x)*cos(y)*(sin(y) - 1);
return dfy;
}
double Constrain(double x )
{
if (x > 0)
x = 0;
else if (x < -5)
x = -5;
return x;
}
void main()
{
double x, y, i,f, step = 0.0001;
double dfx, dfy;
cout << "请输入x y\n";
cin >> x >> y;
cout << "\n输入的坐标为:x=" << x << " y=" << y << "\n\n";
x = Constrain(x);
y = Constrain(y);
for (i = 0;i < 10000;i++)
{
dfx = Dfx(x, y);
dfy = Dfy(x, y);
if (abs(dfx) < 0.001&&abs(dfy) < 0.001)
break;
x = x + step*Dfx(x, y);
y = y + step*Dfy(x, y);
x = Constrain(x);
y = Constrain(y);
f = Func(x, y);
}
cout << "极大值点的坐标为:" << "x =" << x << " y=" << y << "\n\n极大值点函数值为:f=" << f <<"\n";
}
运行界面如下: