【机器学习实战】Logistic回归(二)

回顾

Logistic回归(一)中最后提到的Logistic回归核心代码如下:

def gradAscent(dataMatIn,classLabels):
    dataMatrix = mat(dataMatIn)
    labelMat = mat(classLabels).transpose()
    m,n = shape(dataMatrix)
    alpha = 0.001
    maxCycles = 500
    weights = ones((n,1))
    for k in range(maxCycles):
        h = sigmoid(dataMatrix*weights)
        error = labelMat - h
        weights = weights + alpha * dataMatrix.transpose() * error
    return weights

优化


思路

  从中可以发现,每一次迭代都会对所有样本进行计算,也就是说每一次运算量 = 特征数\times样本数。当样本数或特征较多的时候,计算量会十分巨大,这时候就会尝试去减少每一次参与运算的样本数,肯定不能减少特征。这就是作者想要说的随机梯度上升算法。


这里作者提到了两个概念

在线学习算法:在新样本到来的时候对分类器进行增量式更新,随机梯度上升算法就属于这一类
批处理算法:一次性处理所有数据

第一次优化

def stocGradAscent0(dataMatrix,classLabels):
    m,n = shape(dataMatrix)
    alpha = 0.01
    weights = ones(n)
    for i in range(m):
        h = sigmoid(sum(dataMatrix[i] * weights))
        error = classLabels[i] - h
        weights = weights + alpha * error * dataMatrix[i]
    return weights

分析

 这个算法比较简单明了,仅仅是按顺序将每一个样本带入计算了一次。由于梯度下降需要大量样本不断重复强化某一个特征的属性,该特征的参数才会逐渐收敛,所以很明显这样结果不会很理想的。


第二次优化


书中程序:

def stocGradAscent1(dataMatrix,classLabels,numIter = 150):
    m,n = shape(dataMatrix)
    weights = ones(n)
    for j in range(numIter):
        dataIndex = range(m)
         for i in range(m):
        alpha = 0.1/(1.0 + j + i) 
        randIndex = int(random.uniform(0,len(dataIndex)))
        # randIndex = random.choice(dataIndex)
        h = sigmoid(sum(dataMatrix[randIndex] * weights))
        error = classLabels[randIndex] - h
        weights = weights + alpha * error * dataMatrix[randIndex]
        del(dataIndex[randIndex])
    return weights

由于作者是用的是python2,而我用的是python3,所以其中会有一些不兼容的地方,之后会做出改动。
分析
 比较启发人的一点是:步长不是一个定值,而是一个不断减小的值,我们都知道,随着代价函数的优化,当距离最优解比较近的时候,原来的步长会限制进一步靠近最优解,这时候只能靠限制迭代次数来结束程序,但是这样也有可能在后面的迭代过程中并没有得到优化,而步长是一个变值便解决了这一问题。
但是在这个里面,我不太懂:

for j in range(numIter):

按这个来说,j反映的是迭代的变化,

for i in range(m):

i呢?意思是说每一次迭代运算i次?
 先不说python3中del()无法使用的问题,i每次是要把样本全部遍历一次的!del()这个不会把样本全部删除吗?这个随机生成便没有意义了呀?每一次迭代必然会把所有样本遍历一次,这样的话和未优化版本的区别只在于那个是矩阵运算,这个才分开来,这样效率反而会更低吧?

 我实在搞不懂这个地方,再加上版本不兼容问题,自己改进了一下,企图改进这个问题,程序如下:

def stocGradAscent1(dataMatrix,classLabels,numIter = 50):
    m,n = shape(dataMatrix)
    weights = ones(n)
    dataIndex = list(range(m))
    for j in range(numIter):
        alpha = 0.1/(1.0 + j ) 
        rand = int(random.uniform(0,len(dataIndex)))
        randIndex = dataIndex.pop(rand)
        #测试代码
        # if dataIndex:
        #  randIndex = dataIndex.pop(rand)
        # else:
        #     print("The list is empty {}".format(j))
        # randIndex = random.choice(dataIndex)
        h = sigmoid(sum(dataMatrix[randIndex] * weights))
        error = classLabels[randIndex] - h
        weights = weights + alpha * error * dataMatrix[randIndex]
    return weights

思路
 我把dataIndex转换成List进行运算,每次随机pop( \ \ )出一个随机数,这样也会满足功能需要。除此之外,改为单个循环结构进行循环,没有什么可说的,仅仅是按我的理解写的这个随机梯度上升(下降)而已。

至于作者最后写的实际的例子,便先不做分析,因为只是利用python在进行数据处理,主要是看编程的熟练度了

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