逻辑回归 — Sigmoid函数 —预测是否出现过交通事故

目录

1. 数据的种类

2. Sigmoid函数

3. 案列 :预测是否会发送交通事故

4. 总结


逻辑回归模型是离散数据(二次分布)

1. 数据的种类

连续性数据:给定一个区间,可以取区间内任意一实数——工资(连续)

离散型数据:给定一个区间,只能取区间有限的实数值——性别(男女)

正太线性模型(基于正太分布,连续分布),只能对连续性数据响应,不能对离散的数据响应。

2. Sigmoid函数

Sigmoid函数常被用作神经网络的阈值函数,将变量(z)映射到0,1之间。

Sigmoid函数的图像:

 

3. 案列 :预测是否会发送交通事故

文件内容

我们收集了一组交通事故的统计文件,其中:

1age(年龄 数值型)

2vision(视力状况,分类型,1表示好,0表示有问题)

3drive(驾车教育,分类型,1表示参加过驾车教育,0表示没有)

4accident(去年是否出过事故,1表示出过事故,0表示没有)

第4列是因变量,其它3列是特征。

age vision drive accident
17      1         1        1
44      0         0        1
48      1         0        1
55      0         0        1
75      1         1        1
35      0         1        0
42      1         1        0
57      0         0        0
28      0         1        0
20      0         1        0
38      1         0        0
45      0         1        0
47      1         1        0
52      0         0        0
55      0         1        0
68      1         0        1
18      1         0        1
68      0         0        1
48      1         1        1
17      0         0        1

代码实现

package com.lj.logistic

import org.apache.spark.mllib.classification.{LogisticRegressionWithLBFGS, LogisticRegressionWithSGD}
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.mllib.regression.{LabeledPoint, LinearRegressionWithSGD}

object Driver {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setMaster("local").setAppName("logistic")
    val sc = new SparkContext(conf)
    val data = sc.textFile("e://data/logistic.txt")
    //--为了满足Spark建模要求,RDD[String]->RDD[LabeledPoint]
    val r1 = data.map { line =>
      val info = line.split("\t")
      //--获取因变量
      val Y = info.last.toDouble
      //--获取自变量数组
      val arr = info.dropRight(1).map { num => num.toDouble }
      LabeledPoint(Y, Vectors.dense(arr))
    }
    //--建立逻辑回归模型,底层用梯度下降法来求解系数
    //val model=LogisticRegressionWithSGD.train(r1, 50,0.03)

    //--建立逻辑回归模型,底层用的是拟牛顿法来求解系数
    val model = new LogisticRegressionWithLBFGS().run(r1)
    val coef = model.weights  //--获取模型的系数
    val intercept = model.intercept  //--获取模型的截距项系数
    val predictResult = model.predict(r1.map { lp => lp.features })
    //--现在给定一组数据:age:48  vision:1  drive:1  问:是否出现交通事故
    val v1 = Vectors.dense(15, 0, 0)
    val testRDD = sc.makeRDD(List(v1))
    val predictTest = model.predict(testRDD)
    println(coef)
    predictResult.foreach {println}
    predictTest.foreach {println}
  }
}

结果

[0.005592043370818867,1.9116578171473715,-2.23353961580022]

预测:15, 0, 0  结果是1.0

4. 总结

本例是通过逻辑回归,判断一个人是否出现过交通事故(0 or 1) 离散型
知识点
1.逻辑回归模型的目标函数是 Sigmoid函数
2.Sigmoid函数的作用:将连续型数据离散化 0 or 1
3.所以逻辑回归,如果单从回归来看,是预测数据,但是逻辑回归解决的是 二分类问题(不是预测)
4.解逻辑回归模型的系数,可以用随机梯度下降法来解,也可以用拟牛顿法来解
5.当步长不好选取时,可以考虑用拟牛顿法来处理

拟牛顿法也是一种迭代算法,通过数值解方式逼近真实解
优点:用很少的迭代次数就可以收敛,而且不需要选取步长,所以针对调节步长有困难的场景,可以用这个算法
缺点:计算代价更高


如果您看到这了,请点个赞为自己的努力加油!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值