文章目录

  • 前言
    • 二分类问题——乳腺癌分类
      • 问题概述及数据导入
      • 模型分析
      • 具体代码
    • 三分类问题——鸢尾花分类
      • 问题概述及数据导入
      • 模型分析
      • 具体代码
  • 后记

前言

前面一段时间是真的忙,10月20几号才开始准备软考(好家伙,我以为是12月份考试,结果是11月7号考试),半个月的时间学完差不多大学四年的课程,每天除了上课就是盯着软考书看和刷软考通了,但是我们俱乐部每周还是会安排时间给我们培训机器学习、深度学习方面的知识,中间一个月没有写博客了,很多学到的知识当时虽然是搞明白了,由于事后没有总结和回顾,好多都慢慢遗忘了,这也就是为什么我要坚持写博客的原因,虽说有的时候一两个月都不见得更新一次,但是只要学习了新的我感兴趣的技术我都会写下来。好记性不如烂笔头,建议大家也有一个好的习惯,不说每个人都要写个博客,起码事后能翻一翻看一看回顾一下,这对你记住乃至于以后运用这个知识是非常有帮助的。

好了,废话不多说。这篇文章的主要内容是讲机器学习中的分类问题,目前我学的比较基础,没有用到一些高深的算法,相信有一定编程和数学基础的同学是都能看懂的。
机器学习概述和波士顿房价问题这个回归问题模型可以看我前面写的博客:机器学习学习笔记——以波士顿房价问题为例

二分类问题——乳腺癌分类

问题概述及数据导入

我们一般接触到的分类问题是属于二分类,非此即彼。像乳腺癌分类问题就是一个二分类问题,给定一组数据判断她是否会得乳腺癌。

对于乳腺癌分类问题,首先我们还是从sk-learn中导入数据集,可以发现影响是否患有乳腺癌的因素有30个,整个数据集中有569条数据。

模型分析

首先对于乳腺癌分类问题来说,我们的变量有30种,不再是之前讲道德线性回归问题当中的一种,所以我们再用线性函数去模拟数据是行不通的,当有多个变量时,我们可以选择将直线变弯的方式来拟合我们的数据,即将线性函数变弯曲,通过某个函数加上线性函数的方式拟合数据,这里就是我们说到的激活函数。激活函数的目的就是将线性函数引入非线性特征,使得我们得到的模型能够拟合任意的非线性函数。
从上面的数据导入部分可以看到,我们的结果y值是0或1,此时我们就会想,有没有一个函数能将我们一堆x的值映射到0-1这个区间之内呢?为此我们引入sigmoid()函数:


sigmoid()函数的代码表示:

def sigmoid(x):return 1 / (1 + np.exp(-1*x))

sigmoid()函数能将我们的输入值映射到0-1这个区间内,这样的话我们通过输出值来判断他是0还是1,比如我们给定一个规则:如果输出的值是在[0,0.5]那么代表判断结果是0,输出的值是在(0.5,1]那么代表判断结果是1。这样我们就将一个分类问题变成了一个形式上的回归问题,便于理解判断。
有了以上的分析基础,我们可以简单的得到基于这个二分类问题的模型估计函数:
估计函数:y^=sigmoid(WX+b)\hat{y} = sigmoid(WX + b) y^​=sigmoid(WX+b)
损失函数:Loss=−(ylog⁡y^+(1−y)log⁡(1−y^))Loss = -(y\log{\hat{y}} + (1-y)\log{(1-\hat{y})}) Loss=−(ylogy^​+(1−y)log(1−y^​))
求偏导:δLossδW=δLossδy^δy^δsigmoidδsigmoidδW\frac{\delta{Loss}}{\delta{W}} = \frac{\delta{Loss}}{\delta{\hat{y}}} \frac{\delta{\hat{y}}}{\delta{sigmoid}} \frac{\delta{sigmoid}}{\delta{W}} δWδLoss​=δy^​δLoss​δsigmoidδy^​​δWδsigmoid​

具体代码

# 导入各种库
from sklearn.datasets import load_breast_cancer
import numpy as np
import matplotlib.pyplot as plt
import numpy.random as rd
data = load_breast_cancer()
print(data['feature_names'])X, y = data['data'], data['target']
# x是569*30
test_num = 100
# 划分训练集和测试集
X_train, X_test = X[test_num:], X[:test_num]
y_train, y_test = y[test_num:], y[:test_num]
learning_rate = 0.0000001
epoch = 20000
min_loss = float('inf')
best_w0, best_w1 = 0, 0
# sigmoid函数
def sigmoid(x):return 1 / (1 + np.exp(-1*x))
# 损失函数
def cross_entropy(y, y_hat):return -1 * (y * np.log(y_hat) + (1-y) * np.log(1-y_hat))# mean()函数功能:求取均值
# axis = 0:压缩行,对各列求均值,返回 1* n 矩阵
# axis =1 :压缩列,对各行求均值,返回 m *1 矩阵
# axis 不设置值,对 m*n 个数求均值,返回一个实数
mean_x = np.mean(X_train, axis=0)
# axis=0计算每一列的标准差
std_x = np.std(X_train, axis=0)
# 对x进行这种处理之后得到的值更普遍具有代表性
X_train = (X_train - mean_x) / std_x
# 返回来一个给定形状和类型的用0填充的数组
w0, w1 = np.zeros(1), rd.normal(size=(30,)) * 0.0001
# print(np.dot(X, w1) + w0)
for e in range(epoch):# 计算预测的y值,dot表示求两个矩阵的乘积y_hat = sigmoid(np.dot(X_train, w1) + w0)  # (569, )# 总的loss值loss = np.mean(cross_entropy(y_train, y_hat))# d_w0是线性函数截距之差d_w0 = np.mean(y_hat - y_train)d_w1 = np.dot(X_train.T, (y_hat - y_train))w0 = w0 + (-1) * d_w0 * learning_ratew1 = w1 + (-1) * d_w1 * learning_rateif loss < min_loss:min_loss = lossbest_w0, best_w1 = w0, w1print("Loss updated to {} at the {}th epoch.".format(loss, e))plt.scatter([i for i in range(y_test.shape[0])], y_test)
plt.show()
mean_x_test = np.mean(X_test, axis=0)
std_x_test = np.std(X_test, axis=0)
X_test = (X_test - mean_x_test) / std_x_test
y_hat_test = sigmoid(np.dot(X_test, best_w1) + best_w0) > 0.5
plt.scatter([i for i in range(y_test.shape[0])], y_hat_test)
plt.show()

结果loss值:

代码的注释写的很清楚了,这里我就不再赘述了。

三分类问题——鸢尾花分类

问题概述及数据导入

首先我们来了解鸢尾花分类问题的数据集:


data域是一个150x4的二维数组,target域则是150x1的数组,也就是说我们的鸢尾花数据集有四个变量分别是花萼长、花萼宽、花瓣长、花瓣宽,得到的target是表示这个鸢尾花属于哪一类,数据上共有0、1、2这三类。三分类问题不同于二分类,sigmoid()只能将值映射到0-1,无法将得到的值分成三类。为此我们有softmax()这个激活函数:

softmax()函数的值域是[0,1],输出是概率值,所以加和为1。用指数的形式是为了使大的值更大,同时也为了求导方便。
softmax()函数代码表示:

def softmax(x):return np.exp(x) / np.sum(np.exp(x))

模型分析

首先我们的x是150x4的数据集,y是150x1的数据集,但是我们可以把y变成150x3,这样的好处是我们不再是0、1、2表示三个分类了,而仍然用0和1表示,我们的表示方法是用[1,0,0]表示第一类、[0,1,0]表示第二类、[0,0,1]表示第三类。这样的话我们就可以将x的数据映射到150x3的矩阵上,这里的3就是有三类,我们得到的值分别表示每一类的概率,哪一组哪个位置上的概率值最大,那么就把他归为这一类。x是150x4的矩阵,将y变成150x3的矩阵,我们总体上还是用softmax函数加上一个线性函数这样来模拟,那么线性函数的参数w就要是一个4x3的矩阵,这样才能乘出来是一个150x3的矩阵。

具体代码

from sklearn.datasets import load_iris  # 导入鸢尾花数据集
import numpy as npiris = load_iris()  # 载入数据集X, y = iris.data, iris.target# 将y值转化为向量
def create_y_labels(y):new_y = []for sample in y:if sample == 0:new_y.append([1, 0, 0])elif sample == 1:new_y.append([0, 1, 0])else:new_y.append([0, 0, 1])return np.array(new_y)
y = create_y_labels(y)
def softmax(x):return np.exp(x) / np.tile(np.sum(np.exp(x), axis=1).reshape(150, 1), 3)
def cross_entropy(y, y_hat):return -1 * np.sum(y * np.log(y_hat))epoch = 50000
learning_rate = 0.0001
# 通过本函数可以返回一个或一组服从“0~1”均匀分布的随机样本值。随机样本取值范围是[0,1),不包括1。
# 返回的是一个4×3的矩阵,矩阵中每个元素的值在(0,1)
W, b = np.random.rand(4, 3), 0
loss_items = []
min_loss = float('inf')
for e in range(epoch):# np.dot()函数用于求两个矩阵的乘积y_hat = softmax(np.dot(X, W) + b)  # x是150×4的矩阵,得到的y_hat是150*3的矩阵loss = np.mean(cross_entropy(y, y_hat))loss_c = y_hat - yd_b = np.mean(loss_c)#     print('db: {}'.format(d_b.shape))d_w = np.dot(X.T, loss_c)  # 4, 3#     print('dw: {}'.format(d_w.shape))W = W + (-1) * d_w * learning_rateb = b + (-1) * d_b * learning_rateloss_items.append(loss)if loss < min_loss:min_loss = lossbest_W, best_b = W, bprint("Loss updated to {} at the {}th epoch.".format(loss, e))
yy_hat = softmax(np.dot(X, W) + b)
print(yy_hat)# 用于找到二维数组中每一行元素的最大值索引并输出
idx = np.argmax(yy_hat, axis=1)
pro = np.amax(yy_hat, axis=1)
print(idx)
import matplotlib.pyplot as plt
flag = 0
for i in range(150):if idx[i] == iris.target[i]:flag += 1print(flag)
print("预测率:", flag/150)plt.plot(loss_items)
plt.show()

以上就是整个分类代码的具体实现,中间主体部分是用来训练参数用的,得到一个较好的w,b值之后带入进行分类。

最后我们可以看到预测率有96.7%,还是比较好的。

后记

算是入门了机器学习这个头秃的家伙,没有点好的高数线代基础学的真的是脑壳大(猛男落泪)。想想就后悔当初上课没有好好听。我会努力的,冲冲冲!!!

机器学习笔记——乳腺癌鸢尾花分类问题详解(没有直接调包)相关推荐

  1. 鸢尾花分类——神经网络详解

    神经元的广泛互联与并行工作必然使整个网络呈现出高度的非线性特点.在客观世界中,许多系统的输入与输出之间存在着复杂的非线性关系,对于这类系统,往往很难用传统的数理方法建立其数学模型.设计合理地神经网络通 ...

  2. kmeans python interation flag_机器学习经典算法-logistic回归代码详解

    一.算法简要 我们希望有这么一种函数:接受输入然后预测出类别,这样用于分类.这里,用到了数学中的sigmoid函数,sigmoid函数的具体表达式和函数图象如下: 可以较为清楚的看到,当输入的x小于0 ...

  3. IP地址和子网划分学习笔记之《IP地址详解》

    在学习IP地址和子网划分前,必须对进制计数有一定了解,尤其是二进制和十进制之间的相互转换,对于我们掌握IP地址和子网的划分非常有帮助,可参看如下目录详文. IP地址和子网划分学习笔记相关篇章: 1.I ...

  4. Android进阶笔记:Messenger源码详解

    Messenger可以理解为一个是用于发送消息的一个类用法也很多,这里主要分析一下再跨进程的情况下Messenger的实现流程与源码分析.相信结合前面两篇关于aidl解析文章能够更好的对aidl有一个 ...

  5. 数学建模_随机森林分类模型详解Python代码

    数学建模_随机森林分类模型详解Python代码 随机森林需要调整的参数有: (1) 决策树的个数 (2) 特征属性的个数 (3) 递归次数(即决策树的深度)''' from numpy import ...

  6. 2接口详解_TS入门笔记2——TS接口进阶详解

    TS入门笔记--TS接口进阶详解 一.为什么需要接口? let obj:object; // 定义了一个只能保存对象的变量 // obj = 1; // obj = "123"; ...

  7. JDBC学习笔记02【ResultSet类详解、JDBC登录案例练习、PreparedStatement类详解】

    黑马程序员-JDBC文档(腾讯微云)JDBC笔记.pdf:https://share.weiyun.com/Kxy7LmRm JDBC学习笔记01[JDBC快速入门.JDBC各个类详解.JDBC之CR ...

  8. php mysql无限_php+mysql实现无限分类实例详解

    php+mysql实现无限分类实例详解 fenlei($arr[$i][0]);   //$arr[$i][1]表示第$i+1个分类的id的值.进行递归,也就是把自己的id作为f_id参数把自己的子类 ...

  9. ROS入门笔记(七):详解ROS文件系统

    ROS入门笔记(七):详解ROS文件系统 文章目录 01 Catkin编译系统 1.1 Catkin特点 1.2 Catkin工作原理 1.3 使用`catkin_make`进行编译 02 Catki ...

  10. 信号与系统考研复习例题详解_小语种日语日本文学复习考研资料加藤周一《日本文学史序说(上)》笔记和考研真题详解...

    加藤周一<日本文学史序说(上)>笔记和考研真题详解 目录 序章 日本文学的特征 0.1 复习笔记 第一章 <万叶集>的时代 1.1 复习笔记 1.2 考研真题与典型题详解 第二 ...

最新文章

  1. zend framework php编码规范,Zend Framework常用校验器详解
  2. Exception in thread http-bio-80exec-1 java.lang.OutOfMemoryError: PermGen s解决方案
  3. python笔试知识点_python知识点及面试面试大集合
  4. scheduling java_JAVA定时任务实现的几种方式
  5. python3的格式化用法_浅析python3字符串格式化format()函数的简单用法
  6. DataSnap服务器从xe2升级到xe5报错的处理
  7. 【Graph Embedding】node2vec:算法原理,实现和应用
  8. oracle怎么删除.dat,oracle 手工删库
  9. DC入门(二)综合脚本
  10. 智能世界的罗马是怎样建成的?
  11. SCI、EI、ISTP国际三大检索分别指的是什么?
  12. 侣吵架脱光衣服路人震惊 盘点那些行为出格的情侣(组图
  13. 高仿英雄联盟游戏网页制作作业 英雄联盟LOL游戏HTML网页设计模板 简单学生网页设计 静态HTML CSS网站制作成品
  14. HTML+CSS伸缩式导航栏
  15. 测试中常用的正则表达式你知道哪些?
  16. Linux内核设计与实现 第18章 调试
  17. Python 数据库连接方法和数据库连接池
  18. 内网渗透之CFS三层靶机搭建
  19. 筹资与投资循环审计案例
  20. 最优化理论——可行方向法

热门文章

  1. TM4C123-使用ROM中的函数库
  2. Java中使用isAlphabetic()办法无法解决判断一个char是英文字母,该用别的方法解决
  3. 精益产品开发—精益思想
  4. 某站的视频下载与合并,m4s的处理。
  5. 安卓手机设置指定文件夹下的图片、视频不被相册读取到
  6. WIN7 IE8假死现象解决方法
  7. 云知声终止IPO:持续亏损7.9亿、毛利率低于行业均值、市场份额被指“造假”
  8. G盘格式化了,要怎样恢复文件
  9. java 中 isb啥意思_isb官网-新版下载
  10. 中华名将索引 - 第一批:白起