LR回归

一、理论篇

LR回归包括两个:Linear

Regression(线性回归),Logistic Regression(逻辑回归)。对回归来说,梯度下降法是最基础的算法了:

选定损失函数(衡量回归效果的好坏值越小归回的越好),求偏导,梯度下降,迭代求得损失函数的极小值,就完成了回归。

梯度下降有个局限,只有凸函数才可以使用。

线性回归和逻辑回归的区别便是损失函数的选取不同,但它们的损失函数都是凸函数。

当然有个值得注意的地方,如果参数过多,可能会出现过拟合的情况,需要在损失函数后面加上一个正则项,控制参数的个数,然后回归曲线尽量光滑。


1.线性回归

线性回归比较简单,高中就学过用最小二乘法求解。

现在有工具了,可以利用计算机,当然不再像高中那般用笔算了。

线性回归的损失函数在这不做讨论,太简单。


对它求偏导J’,选定一个步长a


这样不断迭代,自然就走到最低点了。


2.逻辑回归

为什么要逻辑回归?

现实中有很多数据是只有两种情况的,要么0要么1.比如得还是不得癌症,比如淘宝上某个商品点击还是不点击。那这个时候我们要预测它是0还是1,就不能使用线性回归。我们需要的只是一个边界,边界的这边是0,那边是1.比如下图:


那么,怎样判定边界呢?

也可以像线性回归那样找一个损失函数,求损失函数的极小值就好了。


上上周看到的是这个版本,由于没有推到过程,虽然对它求导、梯度下降,结果也是一样的,但我必须要知道它是怎么来的!

于是又花了一周的时间去折腾。

以下是逻辑回归理论推导过程:


二、实现篇

'''

Created on 2017618

@author:fujianfei

'''

fromnumpyimport*

importmatplotlib.pyplotasplt

fromos.pathimportos

frommatplotlib.pyplotimportscatter,legend,show

fromsympy.solvers.solversimportsolve

#定义sigmoid函数

defsigmoid(inX):

return1.0/ (1+ exp(-inX))

#计算L的偏导

defLogDerivative(X,y,theta):

logD=sum((y-sigmoid(X.dot(theta)))*X,axis=0)#对列求和

logD=reshape(logD,(len(theta),1))

returnlogD

#梯度下降

defLogGradientDesc(X,y,theta=ones((3,1)),alpha=.001,iterations=200):

fornumberinrange(iterations):

theta = theta +alpha*LogDerivative(X,y,theta)

returntheta

#拟合效果,你拟合精度

deftestLogRegres(weights, test_x, test_y):

numSamples,numFeatures=shape(test_x)

matchCount =0

foriinrange(numSamples):

predict = sigmoid(test_x[i,:].dot(weights)) >0.5

ifpredict == bool(test_y[i,0]):

matchCount +=1

accuracy = float(matchCount) /numSamples

returnaccuracy

#画图

defshowLogRegres(weights, train_x, train_y):

numSamples, numFeatures =shape(train_x)

ifnumFeatures !=3:

print('Sorry! I can not draw because the dimension of your data is not 2!')

return1

foriinrange(numSamples):

ifint(train_y[i,0]) ==0:

plt.plot(train_x[i,1], train_x[i,2],'or')

elifint(train_y[i,0]) ==1:

plt.plot(train_x[i,1], train_x[i,2],'ob')

min_x = min(train_x[:,1])

max_x = max(train_x[:,1])

y_min_x = float(-weights[0] - weights[1] * min_x) / weights[2]

y_max_x = float(-weights[0] - weights[1] * max_x) / weights[2]

plt.plot([min_x, max_x], [y_min_x,y_max_x],'-g')

plt.xlabel('X1'); plt.ylabel('X2')

plt.show()

#实现

if__name__ =='__main__':

data_path = os.getcwd()+'\\data\\'

'''

逻辑斯特回归,线性决策边界

'''

#读取数据

print("step 1:

loading the data...")

logisticDate = loadtxt(data_path+'data1.txt',delimiter=',')

X=logisticDate[:,0:2]

mapped_fea=map_feature(X[:,0],X[:,1])

m,n=mapped_fea.shape

#meanVal=mean(X,axis=0)

#X=X-meanVal

xone=ones((len(X),1))

X=column_stack([xone,X])#在X上加一列常数,数值为1 theta0

y=logisticDate[:,2]

y=reshape(y,(len(y),1))

print("step 2:

training the data...")

theta=LogGradientDesc(X,y)

print(theta)

print("step 3:

testing the result...")

accuracy = testLogRegres(theta, X, y)

print(accuracy)

print("step 4:

show the result...")

showLogRegres(theta, X, y)

图1是一组原本就是零均值的数据的结果,也是我第一次做出来的效果,初始值1,步长0.01,迭代次数200:


换了一组不是零均值化的数据后,初始值1,步长0.01,迭代次数200,明显效果不对,初始值和步长都选错了:


然后我换了初始值和步长,初始值为10,步长0.00001,迭代20000:


最后我懒得猜初始值和步长了.直接零均值化,初始值1,步长0.01,迭代次数200:



三、问题篇

1.选步长和初始值很重要,为了好选,是否可以将数据进行零均值化?

2.以上分析都是线性决策边界,我试图做出非线性决策边界,将x1,x2以多项式组合起来,然后再加上不同的参数,结果并不理想,精度只有0.53,加上python技术有限,画不来这个多项式组合后的图形,看不见具体的效果,这个问题先留着,下次看到相关资料再细究。

#多项式特征组合

defmap_feature(x1,x2):

x1.shape = (x1.size,1)

x2.shape = (x2.size,1)

degree=6

mapped_fea = ones(shape=(x1[:,0].size,1))

foriinrange(degree +1):

forjinrange (i+1):

r=(x1 ** (i - j))*(x2 ** j)

mapped_fea = append(mapped_fea, r,axis=1)

returnmapped_fea

3.如果结束迭代的条件不是迭代次数,而是偏导值小于某个下限,是否也可以?为什么在网上没看见有人这样做过.

4.我用的是最笨的迭代方式,梯度下降,还有一些优化的迭代方式。

四、总结

逻辑回归原理:通过最大似然求出L,再对L求偏导,最后迭代。

真正开始搞逻辑回归是上周天,认真搞了一天,本周一到周五白天上班,晚上回来也就查个漏补个缺,本篇文章肯定漏洞百出,加之昨晚几乎没睡,如今没有精力去深究了,先往前看看,看的风景多了,自然就知道以前缺什么了。

参考:

http://blog.csdn.net/zouxy09/article/details/20319673

P`��?��

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

推荐阅读更多精彩内容