You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

Logistic_regression.py 4.8 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. # -*- coding: utf-8 -*-
  2. # ---
  3. # jupyter:
  4. # jupytext_format_version: '1.2'
  5. # kernelspec:
  6. # display_name: Python 3
  7. # language: python
  8. # name: python3
  9. # language_info:
  10. # codemirror_mode:
  11. # name: ipython
  12. # version: 3
  13. # file_extension: .py
  14. # mimetype: text/x-python
  15. # name: python
  16. # nbconvert_exporter: python
  17. # pygments_lexer: ipython3
  18. # version: 3.5.2
  19. # ---
  20. # # Logistic Regression
  21. #
  22. # 逻辑回归(Logistic Regression, LR)模型其实仅在线性回归的基础上,套用了一个逻辑函数,但也就由于这个逻辑函数,使得逻辑回归模型成为了机器学习领域一颗耀眼的明星,更是计算广告学的核心。本节主要详述逻辑回归模型的基础。
  23. #
  24. #
  25. # ## 1 逻辑回归模型
  26. # 回归是一种比较容易理解的模型,就相当于$y=f(x)$,表明自变量$x$与因变量$y$的关系。最常见问题有如医生治病时的望、闻、问、切,之后判定病人是否生病或生了什么病,其中的望闻问切就是获取自变量$x$,即特征数据,判断是否生病就相当于获取因变量$y$,即预测分类。
  27. #
  28. # 最简单的回归是线性回归,在此借用Andrew NG的讲义,有如图所示,$X$为数据点——肿瘤的大小,$Y$为观测值——是否是恶性肿瘤。通过构建线性回归模型,如$h_\theta(x)$所示,构建线性回归模型后,即可以根据肿瘤大小,预测是否为恶性肿瘤$h_\theta(x)) \ge 0.5$为恶性,$h_\theta(x) \lt 0.5$为良性。
  29. #
  30. # ![LinearRegression](images/fig1.gif)
  31. #
  32. # 然而线性回归的鲁棒性很差,例如在上图的数据集上建立回归,因最右边噪点的存在,使回归模型在训练集上表现都很差。这主要是由于线性回归在整个实数域内敏感度一致,而分类范围,需要在$[0,1]$。
  33. #
  34. # 逻辑回归就是一种减小预测范围,将预测值限定为$[0,1]$间的一种回归模型,其回归方程与回归曲线如图2所示。逻辑曲线在$z=0$时,十分敏感,在$z>>0$或$z<<0$处,都不敏感,将预测值限定为$(0,1)$。
  35. #
  36. # ![LogisticFunction](images/fig2.gif)
  37. #
  38. #
  39. # +
  40. # %matplotlib inline
  41. from __future__ import division
  42. import numpy as np
  43. import sklearn.datasets
  44. import matplotlib.pyplot as plt
  45. np.random.seed(0)
  46. # +
  47. # load sample data
  48. data, label = sklearn.datasets.make_moons(200, noise=0.30)
  49. print("data = ", data[:10, :])
  50. print("label = ", label[:10])
  51. plt.scatter(data[:,0], data[:,1], c=label)
  52. plt.title("Original Data")
  53. # +
  54. def plot_decision_boundary(predict_func, data, label):
  55. """画出结果图
  56. Args:
  57. pred_func (callable): 预测函数
  58. data (numpy.ndarray): 训练数据集合
  59. label (numpy.ndarray): 训练数据标签
  60. """
  61. x_min, x_max = data[:, 0].min() - .5, data[:, 0].max() + .5
  62. y_min, y_max = data[:, 1].min() - .5, data[:, 1].max() + .5
  63. h = 0.01
  64. xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
  65. Z = predict_func(np.c_[xx.ravel(), yy.ravel()])
  66. Z = Z.reshape(xx.shape)
  67. plt.contourf(xx, yy, Z, cmap=plt.cm.Spectral)
  68. plt.scatter(data[:, 0], data[:, 1], c=label, cmap=plt.cm.Spectral)
  69. plt.show()
  70. # +
  71. def sigmoid(x):
  72. return 1.0 / (1 + np.exp(-x))
  73. class Logistic(object):
  74. """logistic回归模型"""
  75. def __init__(self, data, label):
  76. self.data = data
  77. self.label = label
  78. self.data_num, n = np.shape(data)
  79. self.weights = np.ones(n)
  80. self.b = 1
  81. def train(self, num_iteration=150):
  82. """随机梯度上升算法
  83. Args:
  84. data (numpy.ndarray): 训练数据集
  85. labels (numpy.ndarray): 训练标签
  86. num_iteration (int): 迭代次数
  87. """
  88. for j in range(num_iteration):
  89. data_index = list(range(self.data_num))
  90. for i in range(self.data_num):
  91. # 学习速率
  92. alpha = 0.01
  93. rand_index = int(np.random.uniform(0, len(data_index)))
  94. error = self.label[rand_index] - sigmoid(sum(self.data[rand_index] * self.weights + self.b))
  95. self.weights += alpha * error * self.data[rand_index]
  96. self.b += alpha * error
  97. del(data_index[rand_index])
  98. def predict(self, predict_data):
  99. """预测函数"""
  100. result = list(map(lambda x: 1 if sum(self.weights * x + self.b) > 0 else 0,
  101. predict_data))
  102. return np.array(result)
  103. # -
  104. logistic = Logistic(data, label)
  105. logistic.train(200)
  106. plot_decision_boundary(lambda x: logistic.predict(x), data, label)
  107. # ## References
  108. #
  109. # * [逻辑回归模型(Logistic Regression, LR)基础](https://www.cnblogs.com/sparkwen/p/3441197.html)
  110. # * [逻辑回归(Logistic Regression)](http://www.cnblogs.com/BYRans/p/4713624.html)

机器学习越来越多应用到飞行器、机器人等领域,其目的是利用计算机实现类似人类的智能,从而实现装备的智能化与无人化。本课程旨在引导学生掌握机器学习的基本知识、典型方法与技术,通过具体的应用案例激发学生对该学科的兴趣,鼓励学生能够从人工智能的角度来分析、解决飞行器、机器人所面临的问题和挑战。本课程主要内容包括Python编程基础,机器学习模型,无监督学习、监督学习、深度学习基础知识与实现,并学习如何利用机器学习解决实际问题,从而全面提升自我的《综合能力》。

Contributors (1)