• 机器学习实战-Logistics回归


    Logistics回归:实战,有两个特征X0,X1.100个样本,进行Logistics回归

    1.导入数据

     1 def load_data_set():
     2     """
     3     加载数据集
     4     :return:返回两个数组,普通数组
     5         data_arr -- 原始数据的特征
     6         label_arr -- 原始数据的标签,也就是每条样本对应的类别
     7     """
     8     data_arr=[]
     9     label_arr=[]
    10     f=open('TestSet.txt','r')
    11     for line in f.readlines():
    12         line_arr=line.strip().split()
    13         #为了方便计算,我们将x0的值设为1.0,也就是在每一行的开头添加一个1.0,作为x0
    14         data_arr.append([1.0,np.float(line_arr[0]),np.float(line_arr[1])])
    15         label_arr.append(int(line_arr[2]))
    16     return data_arr,label_arr

    2. Logistics回归梯度上升优化算法

     1 def sigmoid(x):
     2     return 1.0/(1+np.exp(-x))
     3 
     4 def grad_ascent(data_arr,class_labels):
     5     """
     6     梯度上升法,其实就是因为使用了极大似然估计,这个大家有必要去看推导,只看代码感觉不太够
     7     :param data_arr: 传入的就是一个普通的数组,当然你传入一个二维的ndarray也行
     8     :param class_labels: class_labels 是类别标签,它是一个 1*100 的行向量。
     9                     为了便于矩阵计算,需要将该行向量转换为列向量,做法是将原向量转置,再将它赋值给label_mat
    10     :return:
    11     """
    12     data_mat=np.mat(data_arr)
    13     #变成矩阵之后进行转置
    14     label_mat=np.mat(class_labels).transpose()
    15     #获得数据的样本量和特征维度数
    16     m,n=np.shape(data_mat)
    17     #学习率
    18     alpha=0.001
    19     #最大迭代次数
    20     max_cycles=500
    21     # 生成一个长度和特征数相同的矩阵,此处n为3 -> [[1],[1],[1]]
    22     # weights 代表回归系数, 此处的 ones((n,1)) 创建一个长度和特征数相同的矩阵,其中的数全部都是 1
    23     weights=np.ones((n,1))
    24     for k in range(max_cycles):
    25         h=sigmoid(data_mat*weights)
    26         error=label_mat-h
    27         weights=weights+alpha*data_mat.transpose()*error
    28     return weights

    3. 画出决策边界,即画出数据集合Logistics回归最佳拟合直接的函数

     1 def plot_best_fit(weights):
     2     """
     3     可视化
     4     :param weights:
     5     :return:
     6     """
     7     import matplotlib.pyplot as plt
     8     data_mat, label_mat = load_data_set()
     9     data_arr = np.array(data_mat)
    10     n = np.shape(data_mat)[0]
    11     x_cord1 = []
    12     y_cord1 = []
    13     x_cord2 = []
    14     y_cord2 = []
    15     for i in range(n):
    16         if int(label_mat[i]) == 1:
    17             x_cord1.append(data_arr[i, 1])
    18             y_cord1.append(data_arr[i, 2])
    19         else:
    20             x_cord2.append(data_arr[i, 1])
    21             y_cord2.append(data_arr[i, 2])
    22     fig = plt.figure()
    23     ax = fig.add_subplot(111)
    24     ax.scatter(x_cord1, y_cord1, s=30, color='k', marker='^')
    25     ax.scatter(x_cord2, y_cord2, s=30, color='red', marker='s')
    26     x = np.arange(-3.0, 3.0, 0.1)
    27     y = (-weights[0] - weights[1] * x) / weights[2]
    28     """
    29     y的由来,卧槽,是不是没看懂?
    30     首先理论上是这个样子的。
    31     dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])
    32     w0*x0+w1*x1+w2*x2=f(x)
    33     x0最开始就设置为1叻, x2就是我们画图的y值,而f(x)被我们磨合误差给算到w0,w1,w2身上去了
    34     所以: w0+w1*x+w2*y=0 => y = (-w0-w1*x)/w2   
    35     """
    36     ax.plot(x, y)
    37     plt.xlabel('x1')
    38     plt.ylabel('y1')
    39     plt.show()

    4. 测试数据,画图

     1 def test():
     2     """
     3     这个函数只要就是对上面的几个算法的测试,这样就不用每次都在power shell 里面操作,不然麻烦死了
     4     :return:
     5     """
     6     data_arr, class_labels = load_data_set()
     7     # 注意,这里的grad_ascent返回的是一个 matrix, 所以要使用getA方法变成ndarray类型
     8     weights = grad_ascent(data_arr, class_labels).getA()
     9     # weights = stoc_grad_ascent0(np.array(data_arr), class_labels)
    10     #weights = stoc_grad_ascent1(np.array(data_arr), class_labels)
    11     plot_best_fit(weights)
    12 
    13 if __name__ == '__main__':
    14     test()

    5. 结果如下

     另外,还有

    真实训练数据和测试数据-------从疝气病症预测病马的死亡率------
    如何预测的代码也附加~
    github实现地址:https://github.com/CynthiaWendy/Machine-Learning-in-Action-Logistics
  • 相关阅读:
    cocos2d-x C++ 判断当前平台宏定义大全
    cocos2d-x JS 纯代码加载播放plist与png动画
    cocos2d-x JS 加载播放Studio帧动画的两种方法
    iOS开发小技巧总结
    cocos2d-x C++ (Android)集成第三方微信分享
    cocos2d-x C++ (iOS)集成第三方微信分享
    cocos2d-x JS 获取当前系统时间(解决屏幕双击点击事件)
    (已解决) eclipse提示报错"serializing cdt project settings"解决方案
    cocos2dx
    cocos2d-X JS 获取cocostudio中的UI组件
  • 原文地址:https://www.cnblogs.com/CynthiaWendy/p/11217272.html
Copyright © 2020-2023  润新知