机器学习(1)线性回归与多项式拟合

​转载至https://zhuanlan.zhihu.com/p/80969579

一 线性回归
线性回归,顾名思义是利用线性模型对数据点进行拟合的,常见的广义线性模型如下:
f(x)=w_1 x_1+w_2 x_2+⋯+w_d x_d+b
将上面的广义向量模型用向量的形式表示出来如下:
f(x)=w^TX+b
其中 w 为向量。
最简单也是最常见的线性回归是最小二乘法
1.最小二乘法
最小二乘法是以均方误差为回归任务的性能度量,衡量预测值 f(x) 和真实值 y 之间的差值。优化问题就可以用下式表示出来:
(w^*,b^* )=arg⁡min\sum_{i=1}^{m}{(f(x_i )-y_i)^2}
从字面上理解最小二乘法就是试图找到一条直线,使所有样本到直线上的欧几里得距离之和最小。
这里有两个参数需要我们求解 w^*b^* ,其中 b^* 为标量称为偏置, w^* 为向量,其维数对应数据的维数(即大数据中的特征个数)。求解这两个参数的方法是对其求偏导。
\frac{\partial E(w, b)}{\partial w}=2\left(w \sum_{i=1}^{m} x_{i}^{2}-\sum_{i=1}^{m}\left(y_{i}-b\right) x_{i}\right)\frac{\partial E(w, b)}{\partial b}=2\left(m b-\sum_{i=1}^{m}\left(y_{i}-w x_{i}\right)\right)
令上式等于0得到w和b的最优解。
\mathrm{w}=\frac{\sum_{i=1}^{m} y_{i}\left(x_{i}-\overline{x}\right)}{\sum_{i=1}^{m} x_{i}^{2}-\frac{1}{m}\left(\sum_{i=1}^{m} x_{i}\right)^{2}}\mathrm{b}=\frac{1}{m} \sum_{i=1}^{m}\left(y_{i}-w x_{i}\right)
代码实现:
(1)matlab代码
一般的这类问题的求解思路就是找出损失函数,这里我们考虑一般的情况,一般情况下的损失函数为:
J(w^*,b^* )=arg⁡min\frac{1}{2m}\sum_{i=1}^{m}{(f(x_i )-y_i)^2} \\=argmin\frac{1}{2m}\sum_{i=1}^{m}({f^2(x_i)+y_i^2-2f(x_i)y_i})
再求出梯度(即一阶偏导),对于大多数问题是不能直接求出最大小值的,所以一般会用梯度下降法来求解,设置学习率 \alpha 进行更新。
权重w 的梯度:
\frac{\partial(J(w^*,b^*))}{\partial(w)}=\frac{1}{2m}\sum_{i=1}^{m}{(2f(x_i)\partial(f(x_i))-2y_i\partial(f(x_i)))}\\=\frac{1}{m}\sum_{i=1}^{m}{(w^Tx_ix_i^T-(y_i-b)x_i^T)}
偏置 b 的梯度:
\frac{\partial(J(w^*,b^*))}{\partial(b)}=\frac{1}{2m}\sum_{i=1}^{m}{(2f(x_i)\partial(f(x_i))-2y_i\partial(f(x_i)))}\\=\frac{1}{m}\sum_{i=1}^{m}{(w^Tx_i-y_i+b)}
得到了权重w和偏置b的梯度就可以用梯度下降法来求出合适的w和b了。更新公式如下:
一般初始化w和b全为1,
w=w-\alpha*(\frac{1}{m}\sum_{i=1}^{m}{(w^Tx_ix_i^T-(y_i-b)x_i^T)})
b=b-\alpha*(\frac{1}{m}\sum_{i=1}^{m}{(w^Tx_i-y_i+b)})
matlab代码如下:

%随机生成数据clear all

x(:,1)=rand(100,1);

x(:,2)=x(:,1);

[n,~]=size(x);

r=randn(n,1);

for i=1:n
y(i)=3x(i,1)+4x(i,2)+5+r(i);

end

y=y’;

plot3(x(:,1),x(:,2),y,”b“)

grid on

function [w,b]=line_regress(x,y)

[m,n]=size(x);

w=zeros(n,1);

b=1;

alpha=0.07;

MAX_DD=1500;

for i=1:MAX_DD
h=x
w;

w=w-alpha(1/m)x’(h+b-y);

b=b-alpha(b+sum(h-y)/m);

end

(2)python—mxnet库的常规实现

from mxnet import ndimport mxnet.autograd as agfrom IPython import displayimport matplotlib.pyplot as pltimport random#定义样本和特征数量num_sample=1000num_feature=2weight=[2,-3.4]b_true=4.3#生成随机数据feature=nd.random.normal(scale=1,shape=(num_sample,num_feature))label=weight[0]*feature[:,0]+weight[1]*feature[:,1]+b_truelabel+=nd.random.normal(scale=0.01,shape=label.shape)def svg_fig():   # display.set_matplotlib_formats('svg')  display.display_svg()def setfig_size(figsize=(3.5,2.5)):    svg_fig()    plt.rcParams["figure.figsize"]=figsizesetfig_size()plt.scatter(feature[:,1].asnumpy(),label.asnumpy(),1)#plt.show()w=nd.random.normal(scale=0.01,shape=(num_feature,1))b=nd.zeros(shape=(1,))w.attach_grad()b.attach_grad()def Linreg(x,w,b):    return nd.dot(x,w)+bdef squared_loss(y_hat, y):  # 本函数已保存在d2lzh包中方便以后使用    return (y_hat - y.reshape(y_hat.shape)) ** 2 / 2def sgd(params, lr, batch_size):  # 本函数已保存在d2lzh包中方便以后使用    for param in params:        param[:] = param - lr * param.grad / batch_sizealpha=0.03epochs=1000for i in range(epochs):    with ag.record():        l=squared_loss(Linreg(feature,w,b),label)    l.backward()    sgd([w,b],alpha,num_sample)print(w,b)

(3)python —mxnet库的简单实现

from mxnet import ndimport mxnet.autograd as agfrom IPython import displayimport matplotlib.pyplot as pltimport random#定义样本和特征数量num_inputs = 2num_feature = 1000true_w = [2, -3.4]true_b = 4.2feature = nd.random.normal(scale=1, shape=(num_feature, num_inputs))label = true_w[0] * feature[:, 0] + true_w[1] * feature[:, 1] + true_blabel += nd.random.normal(scale=0.01, shape=label.shape)#线性回归简洁实现#1.数据处理from mxnet.gluon import data as gdatadata=gdata.ArrayDataset(feature,label)#2.定义模型from mxnet.gluon import nnnet=nn.Sequential()net.add(nn.Dense(1))from mxnet import initnet.initialize(init.Normal(sigma=0.01))#3.定义损失函数from mxnet.gluon import loss as glossloss=gloss.L2Loss()#4.定义训练器from mxnet import gluontrainer=gluon.Trainer(net.collect_params(),'sgd',{'learning_rate':0.03})epchos=1000for i in range(epchos):    with ag.record():       l=loss(net(feature),label)    l.backward()    trainer.step(num_feature)dense=net[0]w=dense.weight.data()b=dense.bias.data()print(w,b)

二 多项式拟合
前面的线性回归是一种多元回归问题,每个样本对应于多个特征,在前面的例子中,特征之前的值相差不大,所以没有做特征缩放,实际上严格的执行是需要特征缩放的因为有些特征值之间的量纲不同差距很大,如吴恩达的机器学习系类视频中 的例子,假设房屋的价格和房屋的面积及房屋的卧室数量有关,但是这两个特征之间值相差很大,这个时候直接用上面的线性回归时,将出现问题,所以必须进行特征缩放,一般特征缩放有两种计算方式。
(1)Z-score normalization,量化后的特征将服从标准正态分布:
z = \frac{x_i-\mu}{\delta}
(2)Min-Max Scaling,特征量化:
z = \frac{x_i-min(x_i)}{max(x_i)-min(x_i)}
在大部分的机器学习中用的比较多的时第一种量化方法。
多项式拟合是一种典型的需要特征缩放的例子,一般解决的是一元多项式的数据拟合问题,形如:
y=w_0+w_1*x+w_2*x^2+…+w_n*x^n
多项式拟合也可以看成一种多元线性拟合,将其看为有n个特征的多元线性拟合, x 为一个特征, x^2 -为一个特征……。
x\in[1,1000] 时, x^2\in[1,1000,1000] , x^3\in[1,1000,000,000]
对其进行缩放后利用线性拟合一样的方法就能求出拟合曲线,matlab代码如下:

function [w]=ploy_regression() 
   num_input=1;
    num_ploy=3;
    num_feature=100;
    x=randn(100,1); 
   x=sort(x);
    y=sin(x);
    w=randn(num_ploy,num_input);
    b=0;
    X=ones(num_feature,num_ploy);
    for i=1:num_ploy        if i==1
           X(:,i)=x;
        else
           X(:,i)=X(:,i-1).*x;
        end
    end
    for i=1:num_ploy%
         maxnum=max(X(:,i));%
         minnum=min(X(:,i));
        meannum=mean(X(:,i));
        X(:,i)=(X(:,i)-meannum)/(std(X(:,i)));
    end
    epochs=1000;
    alpha=0.01;
    lamda=0.1;
    for i=1:epochs        H=X*w+b;
        dw=X'*(H-y)*(1/num_feature)+(1/num_feature)*lamda*w;
        db=sum(H-y)*(1/num_feature);
        w=w-alpha*dw;
        b=b-alpha*db;
    end
    y1=X*w+b;
    p=polyfit(x,y,3);
    y2=polyval(p,x); 
   plot(x,y,"r*",x,y1,"b-",x,y2,"g-")
end

​转载至https://zhuanlan.zhihu.com/p/80969579

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容