机器学习课程的一个实验,整理出来共享。

原理很简单,优化方法是用的梯度下降。后面有测试结果。

  1. # coding=utf-8
  2. from math import exp
  3. import matplotlib.pyplot as plt
  4. import numpy as np
  5. from sklearn.datasets.samples_generator import make_blobs
  6. def sigmoid(num):
  7. '''
  8. :param num: 待计算的x
  9. :return: sigmoid之后的数值
  10. '''
  11. if type(num) == int or type(num) == float:
  12. return 1.0 / (1 + exp(-1 * num))
  13. else:
  14. raise ValueError, 'only int or float data can compute sigmoid'
  15. class logistic():
  16. def __init__(self, x, y):
  17. if type(x) == type(y) == list:
  18. self.x = np.array(x)
  19. self.y = np.array(y)
  20. elif type(x) == type(y) == np.ndarray:
  21. self.x = x
  22. self.y = y
  23. else:
  24. raise ValueError, 'input data error'
  25. def sigmoid(self, x):
  26. '''
  27. :param x: 输入向量
  28. :return: 对输入向量整体进行simgoid计算后的向量结果
  29. '''
  30. s = np.frompyfunc(lambda x: sigmoid(x), 1, 1)
  31. return s(x)
  32. def train_with_punish(self, alpha, errors, punish=0.0001):
  33. '''
  34. :param alpha: alpha为学习速率
  35. :param errors: 误差小于多少时停止迭代的阈值
  36. :param punish: 惩罚系数
  37. :param times: 最大迭代次数
  38. :return:
  39. '''
  40. self.punish = punish
  41. dimension = self.x.shape[1]
  42. self.theta = np.random.random(dimension)
  43. compute_error = 100000000
  44. times = 0
  45. while compute_error > errors:
  46. res = np.dot(self.x, self.theta)
  47. delta = self.sigmoid(res) - self.y
  48. self.theta = self.theta - alpha * np.dot(self.x.T, delta) - punish * self.theta # 带惩罚的梯度下降方法
  49. compute_error = np.sum(delta)
  50. times += 1
  51. def predict(self, x):
  52. '''
  53. :param x: 给入新的未标注的向量
  54. :return: 按照计算出的参数返回判定的类别
  55. '''
  56. x = np.array(x)
  57. if self.sigmoid(np.dot(x, self.theta)) > 0.5:
  58. return 1
  59. else:
  60. return 0
  61. def test1():
  62. '''
  63. 用来进行测试和画图,展现效果
  64. :return:
  65. '''
  66. x, y = make_blobs(n_samples=200, centers=2, n_features=2, random_state=0, center_box=(10, 20))
  67. x1 = []
  68. y1 = []
  69. x2 = []
  70. y2 = []
  71. for i in range(len(y)):
  72. if y[i] == 0:
  73. x1.append(x[i][0])
  74. y1.append(x[i][1])
  75. elif y[i] == 1:
  76. x2.append(x[i][0])
  77. y2.append(x[i][1])
  78. # 以上均为处理数据,生成出两类数据
  79. p = logistic(x, y)
  80. p.train_with_punish(alpha=0.00001, errors=0.005, punish=0.01) # 步长是0.00001,最大允许误差是0.005,惩罚系数是0.01
  81. x_test = np.arange(10, 20, 0.01)
  82. y_test = (-1 * p.theta[0] / p.theta[1]) * x_test
  83. plt.plot(x_test, y_test, c='g', label='logistic_line')
  84. plt.scatter(x1, y1, c='r', label='positive')
  85. plt.scatter(x2, y2, c='b', label='negative')
  86. plt.legend(loc=2)
  87. plt.title('punish value = ' + p.punish.__str__())
  88. plt.show()
  89. if __name__ == '__main__':
  90. test1()

运行结果如下图

博客首页

用python实现逻辑回归的更多相关文章

  1. 机器学习_线性回归和逻辑回归_案例实战:Python实现逻辑回归与梯度下降策略_项目实战:使用逻辑回归判断信用卡欺诈检测

    线性回归: 注:为偏置项,这一项的x的值假设为[1,1,1,1,1....] 注:为使似然函数越大,则需要最小二乘法函数越小越好 线性回归中为什么选用平方和作为误差函数?假设模型结果与测量值 误差满足 ...

  2. 机器学习之使用Python完成逻辑回归

    一.任务基础 我们将建立一个逻辑回归模型来预测一个学生是否被大学录取.假设你是一个大学系的管理员,你想根据两次考试的结果来决定每个申请人的录取机会.你有以前的申请人的历史数据,你可以用它作为逻辑回归的 ...

  3. 吴裕雄 python 机器学习——逻辑回归

    import numpy as np import matplotlib.pyplot as plt from matplotlib import cm from mpl_toolkits.mplot ...

  4. Python之逻辑回归模型来预测

    建立一个逻辑回归模型来预测一个学生是否被录取. import numpy as np import pandas as pd import matplotlib.pyplot as plt impor ...

  5. python机器学习-逻辑回归

    1.逻辑函数 假设数据集有n个独立的特征,x1到xn为样本的n个特征.常规的回归算法的目标是拟合出一个多项式函数,使得预测值与真实值的误差最小: 而我们希望这样的f(x)能够具有很好的逻辑判断性质,最 ...

  6. python机器学习——逻辑回归

    我们知道感知器算法对于不能完全线性分割的数据是无能为力的,在这一篇将会介绍另一种非常有效的二分类模型--逻辑回归.在分类任务中,它被广泛使用 逻辑回归是一个分类模型,在实现之前我们先介绍几个概念: 几 ...

  7. python实现逻辑回归

    首先得明确逻辑回归与线性回归不同,它是一种分类模型.而且是一种二分类模型. 首先我们需要知道sigmoid函数,其公式表达如下: 其函数曲线如下: sigmoid函数有什么性质呢? 1.关于(0,0. ...

  8. Python使用逻辑回归估算OR值

    第一种是统计学方法,需要用到 statsmodels包 statsmodels是统计和计量经济学的package,包含了用于参数评估和统计测试的实用工具 第二种是机器学习,需要使用sklearn中的L ...

  9. Python之逻辑回归

    代码: import numpy as np from sklearn import datasets from sklearn.linear_model import LogisticRegress ...

随机推荐

  1. TypeScript为Zepto编写LazyLoad插件

    平时项目中使用的全部是jQuery框架,但是对于做webapp来说jQuery太过于庞大,当然你可以选择jQuery 2.*针对移动端的版本. 这里我采用移动端使用率比较多的zepto框架,他跟jqu ...

  2. 深入研究Visual studio 2017 RC新特性

    在[Xamarin+Prism开发详解三:Visual studio 2017 RC初体验]中分享了Visual studio 2017RC的大致情况,同时也发现大家对新的Visual Studio很 ...

  3. submit text3常用快捷键

    在网上找了一些submit text的快捷键: Ctrl+D 选词 (反复按快捷键,即可继续向下同时选中下一个相同的文本进行同时编辑)Ctrl+G 跳转到相应的行Ctrl+J 合并行(已选择需要合并的 ...

  4. Ubuntu1604下安装Liggghts及CFDEM Coupling

    部分内容参考http://www.linuxdiyf.com/linux/16315.html LIGGGHTS是一款开源的DEM软件,来自于著名的分子动力学软件LAMMPS,目前借助于CFDEM C ...

  5. BZOJ 4199: [Noi2015]品酒大会 [后缀数组 带权并查集]

    4199: [Noi2015]品酒大会 UOJ:http://uoj.ac/problem/131 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品 ...

  6. 一个无限加载瀑布流jquery实现

    实现大概是下面的效果,写了比较详细的注释 <!DOCTYPE html><html> <head> <meta charset="UTF-8&quo ...

  7. Openfire集群源码分析

    如果用户量增加后为了解决吞吐量问题,需要引入集群,在openfire中提供了集群的支持,另外也实现了两个集群插件:hazelcast和clustering.为了了解情况集群的工作原理,我就沿着open ...

  8. Maven入门详解

    什么是Maven Maven,鼎鼎大名,在今天之前,我对于它一直是处于一种"只闻其名不见其人"的状态.之所以说"只闻其名",是因为Maven太有名了,它是Apa ...

  9. MyBatis3:SQL映射

    前言 前面学习了config.xml,下面就要进入MyBatis的核心SQL映射了,第一篇文章的时候,student.xml里面是这么写的: <?xml version="1.0&qu ...

  10. C#将Word转换成PDF方法总结(基于Office和WPS两种方案)

    有时候,我们需要在线上预览word文档,当然我们可以用NPOI抽出Word中的文字和表格,然后显示到网页上面,但是这样会丢失掉Word中原有的格式和图片.一个比较好的办法就是将word转换成pdf,然 ...