目录

Logistic 回归

本章内容

  • Sigmoid 函数和 Logistic 回归分类器
  • 最优化理论初步
  • 梯度下降最优化算法
  • 数据中的缺失项处理

回归算法

  • 回归算法:假设现在有一些数据点,我们用一条直线对这些点进行拟合(该线称为最佳拟合直线),这个拟合过程就称作回归。与分类算法一样同属于监督学习。

Logistic 回归的一般过程

  1. 收集数据:采用任意方法收集数据。
  2. 准备数据:由于需要进行距离计算,因此要求数据类型为数值型。
  3. 分析数据:采用任意方法对数据进行分析。
  4. 训练算法:大部分时间讲用于训练,训练的目的是为了找到最佳的分类回归系数。
  5. 测试算法:一旦训练步骤完成,分类将会很快。
  6. 使用算法:基于训练好的回归系数对这些数值进行简单的回归计算,判定他们属于哪个类别,在此基础上做一些其他分析工作。

Logistic的优缺点

  • 优点:计算代价不高,易于理解和实现。
  • 缺点:容易欠拟合,分类精度可能不高。
  • 适用数据类型:数值型和标称型。

基于 Logistic 回归和 Sigmoid 函数的分类

Sigmoid 函数

  • 海维赛德阶跃函数(单位阶跃函数):输出只有0或1的函数,并且0到1的过程属于跳跃过程,即非0即1。
  • Sigmoid 函数:x=0时,sigmoid 值为0.5;随着 x 的增大,对应值将逼近1;随着 x 的减小,对应值将逼近0。
  • Sigmoid 函数公式:\(\sigma(z)={\frac{1}{1+e^{-z}}}\)。

Logistic 回归分类器

  • Logistic 回归分类器:我们在每个特征上都乘以一个回归系数 之后详细介绍,然后把所有的结果值相加,将这个总和代入 sigmoid 函数,进而得到一个范围在0~1之间的数值。大于0.5的数据被分入1类,小于0.5即被归入0类。

图5-1 两种坐标尺度下的 Sigmoid 函数图

  • 通过图5-1 下面一张图可以看出,如果横坐标的尺度足够大,在 x=0出 sigmoid 函数看起来很像阶跃函数。

基于最优化方法的最佳回归系数确定

  • Sigmoid函数的输入记为 z,可由该公式得出:\(z=w_0x_0+w_1x_1+w_2x_2+\cdots+w_nx_n\)。
  • 上述公式向量写法:\(z=w^Tx\) 向量 x 是分类器的输入数据,向量 w 是我们需要找的最佳参数(系数)

梯度上升法

  • 梯度上升法:沿着函数的梯度方向探寻某函数的最大值。即求函数的最大值。
  • 如果梯度记为\(\nabla\),则函数\(f(x,y)\)的梯度公式:\(\nabla f(x,y)=\begin{pmatrix} {\frac{\part f(x,y)}{\part x}} \\ {\frac{\part f(x,y)}{\part y}} \\ \end{pmatrix}\)。
  • \({\frac{\part f(x,y)}{\part x}}\):沿 x 的方向移动\({\frac{\part f(x,y)}{\part x}}\),函数\(f(x,y)\)必须要在待计算的点上有定义并且可微。
  • \({\frac{\part f(x,y)}{\part y}}\):沿 x 的方向移动\({\frac{\part f(x,y)}{\part y}}\),函数\(f(x,y)\)必须要在待计算的点上有定义并且可微。

图5-2 梯度上升图

  • 通过图5-2 可以看出梯度上升算法到达每个点后都会重新估计移动的方向。
  • 梯度上升算法的迭代公式:\(w:=w+\alpha \nabla_wf(w)\),该公式将一直被迭代执行,直至达到某个停止条件为止。
  • \(\alpha\):移动量的大小,称为步长。

梯度下降算法

  • 梯度下降算法:沿着函数的梯度方向探寻某函数的最小值。即求函数的最小值。
  • 梯度下降算法的迭代公式:\(w:=w-\alpha \nabla_wf(w)\)

训练算法:使用梯度上升找到最佳参数

图5-3 数据集图

  • 图5-3中有100个样本点,每个点包含两个数值型特征 X1和X2。

梯度上升算法的伪代码

  1. 每个回归系数初始化为1
  2. 重复 R 次:
  3. 计算整个数据集的梯度
  4. 使用 alpha*gradient 更新回归系数的向量
  5. 返回回归系数

程序5-1 Logistic 回归梯度上升优化算法

  1. import os
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. from path_settings import machine_learning_PATH
  5. data_set_path = os.path.join(machine_learning_PATH, '第五章/data-set')
  6. testSet_path = os.path.join(data_set_path, 'testSet.txt')
  7. horseColicTraining_path = os.path.join(data_set_path, 'horseColicTraining.txt')
  8. horseColicTest_path = os.path.join(data_set_path, 'horseColicTest.txt')
  9. def load_data_set():
  10. """导入数据集"""
  11. data_mat = []
  12. label_mat = []
  13. # 循环导入.txt文本数据构造成列表
  14. fr = open(testSet_path)
  15. for line in fr.readlines():
  16. line_arr = line.strip().split()
  17. data_mat.append([1, float(line_arr[0]), float(line_arr[1])])
  18. label_mat.append(int(line_arr[2]))
  19. return data_mat, label_mat
  20. def sigmoid(in_x):
  21. return 1 / (1 + np.exp(-in_x))
  22. def grad_ascent(data_mat_in, class_labels):
  23. # 生成特征矩阵
  24. data_matrix = np.mat(data_mat_in)
  25. # 生成标记矩阵并反置
  26. label_mat = np.mat(class_labels).transpose()
  27. # 计算data_matrix的行列
  28. m, n = np.shape(data_matrix)
  29. # 设置移动的步长为0.001
  30. alpha = 0.001
  31. # 设置最大递归次数500次
  32. max_cycles = 500
  33. # 初始化系数为1*3的元素全为1的矩阵
  34. weights = np.ones((n, 1))
  35. # 循环迭代梯度上升算法
  36. for k in range(max_cycles):
  37. # 计算真实类别与预测类别的差值
  38. h = sigmoid(data_matrix * weights)
  39. error = (label_mat - h)
  40. # 调整回归系数
  41. weights = weights + alpha * data_matrix.transpose() * error
  42. return weights
  43. def test_grad_ascent():
  44. data_mat, label_mat = load_data_set()
  45. weights = grad_ascent(data_mat, label_mat)
  46. print(weights)
  47. """
  48. [[ 4.12414349]
  49. [ 0.48007329]
  50. [-0.6168482 ]]
  51. """
  52. if __name__ == '__main__':
  53. test_grad_ascent()

分析数据:画出决策边界

  • 该节将通过代码画出决策边界

程序5-2 画出数据集和 Logistic 回归最佳拟合直线的函数

  1. def plot_best_fit(wei):
  2. # getA==np.asarrayz(self)
  3. # 使用__class__.__name__为了判断是梯度上升和随机梯度上升
  4. if wei.__class__.__name__ == 'matrix':
  5. weights = wei.getA()
  6. elif wei.__class__.__name__ == 'ndarray':
  7. weights = wei
  8. else:
  9. weights = wei
  10. data_mat, label_mat = load_data_set()
  11. # 把特征集转换成数组
  12. data_arr = np.array(data_mat)
  13. n = np.shape(data_arr)[0]
  14. # 循环数据集分类
  15. xcord1 = []
  16. ycord1 = []
  17. xcord2 = []
  18. ycord2 = []
  19. for i in range(n):
  20. if int(label_mat[i]) == 1:
  21. xcord1.append(data_arr[i, 1])
  22. ycord1.append(data_arr[i, 2])
  23. else:
  24. xcord2.append(data_arr[i, 1])
  25. ycord2.append(data_arr[i, 2])
  26. fig = plt.figure()
  27. ax = fig.add_subplot(111)
  28. ax.scatter(xcord1, ycord1, s=30, c='red', marker='s')
  29. ax.scatter(xcord2, ycord2, s=30, c='green')
  30. # 0.1是步长
  31. x = np.arange(-3, 3, 0.1)
  32. # 假设 sigmoid 函数为0,并且这里的 x,y 相当于上述的 x1和x2即可得出 y 的公式
  33. y = (-weights[0] - weights[1] * x) / weights[2]
  34. ax.plot(x, y)
  35. plt.xlabel('X1')
  36. plt.ylabel('X2')
  37. plt.show()
  38. def test_plot_best_fit():
  39. data_mat, label_mat = load_data_set()
  40. weights = grad_ascent(data_mat, label_mat)
  41. plot_best_fit(weights)
  42. if __name__ == '__main__':
  43. # test_grad_ascent()
  44. test_plot_best_fit()

图5-4 梯度上升算法500次迭代后的结果

  • 通过图5-4 可以看出我们只分错了2-4个点。

训练算法:随机梯度上升

  • 梯度上升法每次更新回归系数时都需要遍历整个数据集,如果样本或者特征数过多就应该考虑使用随机梯度上升算法。
  • 随机梯度上升:一次仅用一个样本点来更新回归系数,不需要重新读取整个数据集。

随机梯度上升算法伪代码

  1. 所有回归系数初始化为1
  2. 对数据集中每个样本
  3. 计算该样本的梯度
  4. 使用 alpha*gradient 更新回归系数值
  5. 返回回归系数值

程序5-3 随机梯度上升算法

  1. def stoc_grad_ascent0(data_matrix, class_labels):
  2. """随机梯度上升算法"""
  3. m, n = np.shape(data_matrix)
  4. alpha = 0.01
  5. weights = np.ones(n)
  6. for i in range(m):
  7. # 使用 sum 函数得出一个值,只用计算一次
  8. h = sigmoid(sum(data_matrix[i] * weights))
  9. error = class_labels[i] - h
  10. weights = weights + alpha * error * data_matrix[i]
  11. return weights
  12. def test_stoc_grad_ascent0():
  13. data_arr, label_mat = load_data_set()
  14. weights = stoc_grad_ascent0(np.array(data_arr), label_mat)
  15. plot_best_fit(weights)
  16. if __name__ == '__main__':
  17. # test_grad_ascent()
  18. # test_plot_best_fit()
  19. test_stoc_grad_ascent0()
  • 梯度上升和随机梯度上升:从代码中我们可以看到前者变量 h 和误差 error 都是向量,而后者全是数值;前者是矩阵转换,后者则是 numpy 数组。

图5-5 随机梯度上升算法图

  • 图5-5可以看出随机梯度上升算法的最佳拟合直线并非最佳分类线

程序5-4 改进的随机梯度上升算法

  1. def stoc_grad_ascent1(data_matrix, class_labels, num_iter=150):
  2. """改进随机梯度上升算法,默认迭代150次"""
  3. m, n = np.shape(data_matrix)
  4. weights = np.ones(n)
  5. for j in range(num_iter):
  6. data_index = list(range(m))
  7. for i in range(m):
  8. # 每次迭代减小 alpha 的值,但最小为0.01,确保新数据依然有影响。缓解系数波动的情况
  9. alpha = 4 / (1 + j + i) + 0.01
  10. # 随机选取值进行更新
  11. rand_index = int(np.random.uniform(0, len(data_index)))
  12. h = sigmoid(sum(data_matrix[rand_index] * weights))
  13. error = class_labels[rand_index] - h
  14. weights = weights + alpha * error * data_matrix[rand_index]
  15. # 删除更新后的值
  16. del (data_index[rand_index])
  17. return weights
  18. def test_stoc_grad_ascent1():
  19. data_arr, label_mat = load_data_set()
  20. weights = stoc_grad_ascent1(np.array(data_arr), label_mat)
  21. plot_best_fit(weights)
  22. if __name__ == '__main__':
  23. # test_grad_ascent()
  24. # test_plot_best_fit()
  25. # test_stoc_grad_ascent0()
  26. test_stoc_grad_ascent1()

图5-6 改进随机梯度上升算法图

  • 图5-6可以看出150次的跌打就能得到一条很好的分类线,而梯度上升算法需要迭代500次。

示例:从疝气病预测病马的死亡率

  • 疝气病:描述马胃肠痛的术语
  • 数据集中包含368个样本和28个特征,并且有30%的值是缺失的

示例:使用 Logistic 回归估计马疝病的死亡率

  1. 收集数据:给定数据文件
  2. 准备数据:用 Python 解析文本文件并填充缺失值
  3. 分析数据:可视化并观察数据
  4. 训练算法:使用优化算法,找到最佳的系数
  5. 测试算法:观察错误率,根据错误率决定是否会退到训练阶段;改变迭代的次数和步长等参数来得到更好的回归系数
  6. 使用算法:实现一个简单的程序来手机马的症状并输出预测结果

准备数据:处理数据中的缺失值

  • 数据的获取是相当昂贵的,扔掉和重新获取都是不可取的
  • 以下几种方法可以解决数据的缺失的问题
  1. 使用可用特征的均值来填补缺失值
  2. 使用特殊值来填补缺失值
  3. 忽略有缺失值的样本
  4. 使用相似样本的均值填补缺失值
  5. 使用另外的机器学习算法预测缺失值
  • 预处理第一件事:用0替代所有的缺失值,因为缺失值为0时回归系数的更新公式不会更新并且 sigmoid(0)=0.5,他对结果的预测不具有任何倾向性
  • 预处理第二件事:对于数据标记缺失的数据舍弃,因为标记很难确定采用某个合适的值来替换。
  • 预处理后的文件:对于原始数据文件可以去 http://archive.ics.uci.edu/ml/datasets/Horse+Colic 获取,此处只提供预处理之后的文件

测试算法:用 Logistic 回归进行分类

  1. def classify_vector(in_x, weights):
  2. prob = sigmoid(sum(in_x * weights))
  3. if prob > 0.5:
  4. return 1
  5. else:
  6. return 0
  7. def colic_test():
  8. """马疝病造成马死亡概率预测"""
  9. fr_train = open(horseColicTraining_path)
  10. fr_test = open(horseColicTest_path)
  11. training_set = []
  12. training_labels = []
  13. for line in fr_train.readlines():
  14. # 切分所有特征并把特征加入 line_arr 列表中
  15. curr_line = line.strip().split('\t') # type:list
  16. line_arr = []
  17. for i in range(21):
  18. line_arr.append(float(curr_line[i]))
  19. # 分开处理特征和标记
  20. training_set.append(line_arr)
  21. training_labels.append(float(curr_line[21]))
  22. train_weights = stoc_grad_ascent1(np.array(training_set), training_labels, 500)
  23. print(train_weights)
  24. error_count = 0
  25. num_test_vec = 0
  26. for line in fr_test.readlines():
  27. num_test_vec += 1
  28. curr_line = line.strip().split('\t') # type:list
  29. line_arr = []
  30. for i in range(21):
  31. line_arr.append(float(curr_line[i]))
  32. # 通过比较样本标记与输入系数与特征相乘值 sigmoid 函数得到的标记判断是否预测失误
  33. if int(classify_vector(np.array(line_arr), train_weights)) != int(curr_line[21]):
  34. error_count += 1
  35. error_rate = (float(error_count) / num_test_vec)
  36. print('测试集的错误率: {}'.format(error_rate))
  37. # 测试集的错误率: 0.373134328358209
  38. return error_rate
  39. def multi_test():
  40. num_tests = 10
  41. error_sum = 0
  42. for k in range(num_tests):
  43. error_sum += colic_test()
  44. print('迭代 {} 次后平均错误率为: {}'.format(num_tests, error_sum / float(num_tests)))
  45. # 迭代 10 次后平均错误率为: 0.3656716417910448
  46. if __name__ == '__main__':
  47. # test_grad_ascent()
  48. # test_plot_best_fit()
  49. # test_stoc_grad_ascent0()
  50. # test_stoc_grad_ascent1()
  51. multi_test()

完整代码logRegres.py

  1. import os
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. from path_settings import machine_learning_PATH
  5. data_set_path = os.path.join(machine_learning_PATH, '第五章/data-set')
  6. testSet_path = os.path.join(data_set_path, 'testSet.txt')
  7. horseColicTraining_path = os.path.join(data_set_path, 'horseColicTraining.txt')
  8. horseColicTest_path = os.path.join(data_set_path, 'horseColicTest.txt')
  9. def load_data_set():
  10. """导入数据集"""
  11. data_mat = []
  12. label_mat = []
  13. # 循环导入.txt文本数据构造成列表
  14. fr = open(testSet_path)
  15. for line in fr.readlines():
  16. line_arr = line.strip().split()
  17. data_mat.append([1, float(line_arr[0]), float(line_arr[1])])
  18. label_mat.append(int(line_arr[2]))
  19. return data_mat, label_mat
  20. def sigmoid(in_x):
  21. """构造 sigmoid 函数"""
  22. return 1 / (1 + np.exp(-in_x))
  23. def grad_ascent(data_mat_in, class_labels):
  24. """梯度上升算法"""
  25. # 生成特征矩阵
  26. data_matrix = np.mat(data_mat_in)
  27. # 生成标记矩阵并反置
  28. label_mat = np.mat(class_labels).transpose()
  29. # 计算data_matrix的行列
  30. m, n = np.shape(data_matrix)
  31. # 设置移动的步长为0.001
  32. alpha = 0.001
  33. # 设置最大递归次数500次
  34. max_cycles = 500
  35. # 初始化系数为1*3的元素全为1的矩阵
  36. weights = np.ones((n, 1))
  37. # 循环迭代梯度上升算法
  38. for k in range(max_cycles):
  39. # 计算真实类别与预测类别的差值
  40. h = sigmoid(data_matrix * weights)
  41. error = (label_mat - h)
  42. # 调整回归系数
  43. weights = weights + alpha * data_matrix.transpose() * error
  44. return weights
  45. def test_grad_ascent():
  46. data_mat, label_mat = load_data_set()
  47. weights = grad_ascent(data_mat, label_mat)
  48. print(weights)
  49. """
  50. [[ 4.12414349]
  51. [ 0.48007329]
  52. [-0.6168482 ]]
  53. """
  54. def plot_best_fit(wei):
  55. """画出被分割的数据集"""
  56. # getA==np.asarrayz(self)
  57. # 使用__class__.__name__为了判断是梯度上升和随机梯度上升
  58. if wei.__class__.__name__ == 'matrix':
  59. weights = wei.getA()
  60. elif wei.__class__.__name__ == 'ndarray':
  61. weights = wei
  62. else:
  63. weights = wei
  64. data_mat, label_mat = load_data_set()
  65. # 把特征集转换成数组
  66. data_arr = np.array(data_mat)
  67. n = np.shape(data_arr)[0]
  68. # 循环数据集分类
  69. xcord1 = []
  70. ycord1 = []
  71. xcord2 = []
  72. ycord2 = []
  73. for i in range(n):
  74. if int(label_mat[i]) == 1:
  75. xcord1.append(data_arr[i, 1])
  76. ycord1.append(data_arr[i, 2])
  77. else:
  78. xcord2.append(data_arr[i, 1])
  79. ycord2.append(data_arr[i, 2])
  80. fig = plt.figure()
  81. ax = fig.add_subplot(111)
  82. ax.scatter(xcord1, ycord1, s=30, c='red', marker='s')
  83. ax.scatter(xcord2, ycord2, s=30, c='green')
  84. # 0.1是步长
  85. x = np.arange(-3, 3, 0.1)
  86. # 假设 sigmoid 函数为0,并且这里的 x,y 相当于上述的 x1和x2即可得出 y 的公式
  87. y = (-weights[0] - weights[1] * x) / weights[2]
  88. ax.plot(x, y)
  89. plt.xlabel('X1')
  90. plt.ylabel('X2')
  91. plt.show()
  92. def test_plot_best_fit():
  93. data_mat, label_mat = load_data_set()
  94. weights = grad_ascent(data_mat, label_mat)
  95. plot_best_fit(weights)
  96. def stoc_grad_ascent0(data_matrix, class_labels):
  97. """随机梯度上升算法"""
  98. m, n = np.shape(data_matrix)
  99. alpha = 0.01
  100. weights = np.ones(n)
  101. for i in range(m):
  102. # 使用 sum 函数得出一个值,只用计算一次
  103. h = sigmoid(sum(data_matrix[i] * weights))
  104. error = class_labels[i] - h
  105. weights = weights + alpha * error * data_matrix[i]
  106. return weights
  107. def test_stoc_grad_ascent0():
  108. data_arr, label_mat = load_data_set()
  109. weights = stoc_grad_ascent0(np.array(data_arr), label_mat)
  110. plot_best_fit(weights)
  111. def stoc_grad_ascent1(data_matrix, class_labels, num_iter=150):
  112. """改进随机梯度上升算法,默认迭代150次"""
  113. m, n = np.shape(data_matrix)
  114. weights = np.ones(n)
  115. for j in range(num_iter):
  116. data_index = list(range(m))
  117. for i in range(m):
  118. # 每次迭代减小 alpha 的值,但最小为0.01,确保新数据依然有影响。缓解系数波动的情况
  119. alpha = 4 / (1 + j + i) + 0.01
  120. # 随机选取值进行更新
  121. rand_index = int(np.random.uniform(0, len(data_index)))
  122. h = sigmoid(sum(data_matrix[rand_index] * weights))
  123. error = class_labels[rand_index] - h
  124. weights = weights + alpha * error * data_matrix[rand_index]
  125. # 删除更新后的值
  126. del (data_index[rand_index])
  127. return weights
  128. def test_stoc_grad_ascent1():
  129. data_arr, label_mat = load_data_set()
  130. weights = stoc_grad_ascent1(np.array(data_arr), label_mat)
  131. plot_best_fit(weights)
  132. def classify_vector(in_x, weights):
  133. prob = sigmoid(sum(in_x * weights))
  134. if prob > 0.5:
  135. return 1
  136. else:
  137. return 0
  138. def colic_test():
  139. """马疝病造成马死亡概率预测"""
  140. fr_train = open(horseColicTraining_path)
  141. fr_test = open(horseColicTest_path)
  142. training_set = []
  143. training_labels = []
  144. for line in fr_train.readlines():
  145. # 切分所有特征并把特征加入 line_arr 列表中
  146. curr_line = line.strip().split('\t') # type:list
  147. line_arr = []
  148. for i in range(21):
  149. line_arr.append(float(curr_line[i]))
  150. # 分开处理特征和标记
  151. training_set.append(line_arr)
  152. training_labels.append(float(curr_line[21]))
  153. train_weights = stoc_grad_ascent1(np.array(training_set), training_labels, 500)
  154. print(train_weights)
  155. error_count = 0
  156. num_test_vec = 0
  157. for line in fr_test.readlines():
  158. num_test_vec += 1
  159. curr_line = line.strip().split('\t') # type:list
  160. line_arr = []
  161. for i in range(21):
  162. line_arr.append(float(curr_line[i]))
  163. # 通过比较样本标记与输入系数与特征相乘值 sigmoid 函数得到的标记判断是否预测失误
  164. if int(classify_vector(np.array(line_arr), train_weights)) != int(curr_line[21]):
  165. error_count += 1
  166. error_rate = (float(error_count) / num_test_vec)
  167. print('测试集的错误率: {}'.format(error_rate))
  168. # 测试集的错误率: 0.373134328358209
  169. return error_rate
  170. def multi_test():
  171. num_tests = 10
  172. error_sum = 0
  173. for k in range(num_tests):
  174. error_sum += colic_test()
  175. print('迭代 {} 次后平均错误率为: {}'.format(num_tests, error_sum / float(num_tests)))
  176. # 迭代 10 次后平均错误率为: 0.3656716417910448
  177. if __name__ == '__main__':
  178. # test_grad_ascent()
  179. # test_plot_best_fit()
  180. # test_stoc_grad_ascent0()
  181. # test_stoc_grad_ascent1()
  182. multi_test()

总结

  • Logistic 回归:寻找一个非线性函数 Sigmoid 的最佳拟合参数。
  • 求解过程:通过最优化算法(常用的梯度上升算法),通过简化梯度上升算法得到随机梯度上升算法
  • 对缺失数据的处理:机器学习中最后只能更要的问题之一,主要还是取决于实际应用中的需求。

《机器学习实战》-逻辑(Logistic)回归的更多相关文章

  1. 机器学习实战之Logistic回归

    Logistic回归一.概述 1. Logistic Regression 1.1 线性回归 1.2 Sigmoid函数 1.3 逻辑回归 1.4 LR 与线性回归的区别 2. LR的损失函数 3. ...

  2. 05机器学习实战之Logistic 回归

    Logistic 回归 概述 Logistic 回归 或者叫逻辑回归 虽然名字有回归,但是它是用来做分类的.其主要思想是: 根据现有数据对分类边界线(Decision Boundary)建立回归公式, ...

  3. 机器学习入门-逻辑(Logistic)回归(1)

    原文地址:http://www.bugingcode.com/machine_learning/ex3.html 关于机器学习的教程确实是太多了,处于这种变革的时代,出去不说点机器学习的东西,都觉得自 ...

  4. 《机器学习实战》Logistic回归

    注释:Ng的视频有完整的推到步骤,不过理论和实践还是有很大差别的,代码实现还得完成 1.Logistic回归理论 http://www.cnblogs.com/wjy-lulu/p/7759515.h ...

  5. 机器学习实战之logistic回归分类

    利用logistic回归进行分类的主要思想:根据现有数据对分类边界建立回归公式,并以此进行分类. logistic优缺点: 优点:计算代价不高,易于理解和实现.缺点:容易欠拟合,分类精度可能不高. . ...

  6. 05机器学习实战之Logistic 回归scikit-learn实现

    https://blog.csdn.net/zengxiantao1994/article/details/72787849似然函数 原理:极大似然估计是建立在极大似然原理的基础上的一个统计方法,是概 ...

  7. 机器学习入门 - 逻辑(Logistic)回归(5)

    原文地址:http://www.bugingcode.com/machine_learning/ex7.html 把所有的问题都转换为程序问题,可以通过程序来就问题进行求解了. 这里的模拟问题来之于C ...

  8. 机器学习(4)之Logistic回归

    机器学习(4)之Logistic回归 1. 算法推导 与之前学过的梯度下降等不同,Logistic回归是一类分类问题,而前者是回归问题.回归问题中,尝试预测的变量y是连续的变量,而在分类问题中,y是一 ...

  9. 机器学习实战3:逻辑logistic回归+在线学习+病马实例

    本文介绍logistic回归,和改进算法随机logistic回归,及一个病马是否可以治愈的案例.例子中涉及了数据清洗工作,缺失值的处理. 一 引言 1 sigmoid函数,这个非线性函数十分重要,f( ...

随机推荐

  1. 11.2NOIP模拟赛

    /* 根右左遍历后最长上升子序列 */ #include<iostream> #include<cstdio> #include<cstring> #include ...

  2. 洛谷P4331 [BOI2004]Sequence 数字序列(左偏树)

    传送门 感觉……不是很看得懂题解在说什么? 我们先把原数列$a_i-=i$,那么本来要求递增序列,现在只需要求一个非严格递增的就行了(可以看做最后每个$b_i+=i$,那么非严格递增会变为递增) 如果 ...

  3. Educational Codeforces Round 52 (Rated for Div. 2) F. Up and Down the Tree 树型DP

    题面 题意:给你一棵树,你起点在1,1也是根节点,你每次可以选择去你子树的某个叶子节点,也可以选择,从叶子节点返回距离不超过k的一个根, 也就是说,你从1开始,向下跳,选择一个叶子(就是没有子树的节点 ...

  4. mac下配置nginx php

    修改 php-fpm 文件 1.执行命令: sudo cp /private/etc/php-fpm.conf.default /private/etc/php-fpm.conf 2.找到目录下的 p ...

  5. Unix\Linux | 总结笔记 |文件系统_shell重定向

    输入重定向< 从文件中获得命令需要的输入数据,适合数据源已经定义好,可重复使用 #显示文件test.txt的内容 cat < tesxt.txt #统计文件test.txt中的行数 单词数 ...

  6. mariadb+centos7+主从复制

    MYSQL(mariadb) MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可.开发这个分支的原因之一是:甲骨文公司收购了MySQL后,有将MySQL闭源的 ...

  7. _bzoj1009 [HNOI2008]GT考试【矩阵加速dp】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1009 比较不错的一道题,令f(i, j)表示考号匹配到i位,后j位为不吉利串的前j位,那么对 ...

  8. 228 Summary Ranges 汇总区间

    给定一个无重复元素的有序整数数组,返回数组中区间范围的汇总. 示例 1: 输入: [0,1,2,4,5,7]输出: ["0->2","4->5",& ...

  9. 转】Mahout构建图书推荐系统

    原博文出自于: http://blog.fens.me/hadoop-mahout-recommend-book/ 感谢! Mahout构建图书推荐系统 Hadoop家族系列文章,主要介绍Hadoop ...

  10. 实现php间隔一段时间执行一次某段代码

    <?php ignore_user_abort(); //即使Client断开(如关掉浏览器),PHP脚本也可以继续执行.  set_time_limit(0); // 执行时间为无限制,php ...