五、逻辑回归实验分析

所有代码块都是在Jupyter Notebook下进行调试运行,前后之间都相互关联。
文中所有代码块所涉及到的函数里面的详细参数均可通过scikit-learn官网API文档进行查阅,这里我只写下每行代码所实现的功能,参数的调整读者可以多进行试验调试。多动手!!!

一、简介

线性回归是回归问题,可以得到一个具体的回归值;而逻辑回归是分类问题,可以得到将两种类别物体分类。
逻辑回归借助sigmoid函数进行了数值映射,将求出的值转换为0-1之间的概率,通过比较相关概率从而实现分类任务。

导包

import numpy as np
import os
%matplotlib inline
import matplotlib
import matplotlib.pyplot as plt
plt.rcParams['axes.labelsize'] = 14
plt.rcParams['xtick.labelsize'] = 12
plt.rcParams['ytick.labelsize'] = 12
import warnings
warnings.filterwarnings('ignore')
np.random.seed(42)

二、sigmoid函数

t = np.linspace(-10, 10, 100)
sig = 1 / (1 + np.exp(-t))
plt.figure(figsize=(9, 3))
plt.plot([-10, 10], [0, 0], "k-")
plt.plot([-10, 10], [0.5, 0.5], "k:")
plt.plot([-10, 10], [1, 1], "k:")
plt.plot([0, 0], [-1.1, 1.1], "k-")
plt.plot(t, sig, "b-", linewidth=2, label=r"$\sigma(t) = \frac{1}{1 + e^{-t}}$")
plt.xlabel("t")
plt.legend(loc="upper left", fontsize=20)
plt.axis([-10, 10, -0.1, 1.1])
plt.title('Figure 4-21. Logistic function')
plt.show()

在这里插入图片描述
其对应的相关推导公式如下:在这里插入图片描述

三、鸢尾花数据集

这个鸢尾花数据集是sklearn库里面自带的数据集,主要由三个类别的花,每种类别的花都有四个特征参数。
逻辑回归可以实现二分类问题,对于三分类问题,只需要将剩余其他两种类别的花当成一种(当成其他即可),依次分别进行三次二分类就可以实现三分类的任务。

Ⅰ,加载iris(鸢尾花)数据集

from sklearn import datasets
iris = datasets.load_iris()
list(iris.keys())#查看数据集中都有哪些属性可以调用,这里主要使用data---x,target---y
"""
['data','target','frame','target_names','DESCR','feature_names','filename']
"""

Ⅱ,查看iris数据集的详细信息描述

print (iris.DESCR)#当前iris鸢尾花数据集的所有信息的描述
"""
.. _iris_dataset:Iris plants dataset
--------------------**Data Set Characteristics:**:Number of Instances: 150 (50 in each of three classes):Number of Attributes: 4 numeric, predictive attributes and the class:Attribute Information:- sepal length in cm- sepal width in cm- petal length in cm- petal width in cm- class:- Iris-Setosa- Iris-Versicolour- Iris-Virginica:Summary Statistics:============== ==== ==== ======= ===== ====================Min  Max   Mean    SD   Class Correlation============== ==== ==== ======= ===== ====================sepal length:   4.3  7.9   5.84   0.83    0.7826sepal width:    2.0  4.4   3.05   0.43   -0.4194petal length:   1.0  6.9   3.76   1.76    0.9490  (high!)petal width:    0.1  2.5   1.20   0.76    0.9565  (high!)============== ==== ==== ======= ===== ====================:Missing Attribute Values: None:Class Distribution: 33.3% for each of 3 classes.:Creator: R.A. Fisher:Donor: Michael Marshall (MARSHALL%PLU@io.arc.nasa.gov):Date: July, 1988The famous Iris database, first used by Sir R.A. Fisher. The dataset is taken
from Fisher's paper. Note that it's the same as in R, but not as in the UCI
Machine Learning Repository, which has two wrong data points.This is perhaps the best known database to be found in the
pattern recognition literature.  Fisher's paper is a classic in the field and
is referenced frequently to this day.  (See Duda & Hart, for example.)  The
data set contains 3 classes of 50 instances each, where each class refers to a
type of iris plant.  One class is linearly separable from the other 2; the
latter are NOT linearly separable from each other... topic:: References- Fisher, R.A. "The use of multiple measurements in taxonomic problems"Annual Eugenics, 7, Part II, 179-188 (1936); also in "Contributions toMathematical Statistics" (John Wiley, NY, 1950).- Duda, R.O., & Hart, P.E. (1973) Pattern Classification and Scene Analysis.(Q327.D83) John Wiley & Sons.  ISBN 0-471-22361-1.  See page 218.- Dasarathy, B.V. (1980) "Nosing Around the Neighborhood: A New SystemStructure and Classification Rule for Recognition in Partially ExposedEnvironments".  IEEE Transactions on Pattern Analysis and MachineIntelligence, Vol. PAMI-2, No. 1, 67-71.- Gates, G.W. (1972) "The Reduced Nearest Neighbor Rule".  IEEE Transactionson Information Theory, May 1972, 431-433.- See also: 1988 MLC Proceedings, 54-64.  Cheeseman et al"s AUTOCLASS IIconceptual clustering system finds 3 classes in the data.- Many, many more ..."""

Ⅲ,选出其中一种类别的花,将其余两种花分为一类

X = iris['data'][:,3:]#选出所有数据中的其中一个特征
y = (iris['target'] == 2).astype(np.int)#将这种花设定为1,剩下的两种花设定为0
y#很显然,前面的0为其余两种花,后面的1是当前这种花
"""
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1])
"""

Ⅳ,训练模型及展示

①模型训练
from sklearn.linear_model import LogisticRegression#导入逻辑回归包
log_res = LogisticRegression()#实例化
log_res.fit(X,y)#传入参数训练模型
"""
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,intercept_scaling=1, max_iter=100, multi_class='warn',n_jobs=None, penalty='l2', random_state=None, solver='warn',tol=0.0001, verbose=0, warm_start=False)
"""
X_new = np.linspace(0,3,1000).reshape(-1,1)#从0-3取1000个数
y_proba = log_res.predict_proba(X_new)#得出预测结果
y_proba#得出1000个样本通过模型得出的概率值,左边表示属于当前类别的概率,右边表示不属于当前类别的概率
"""
array([[0.98554411, 0.01445589],[0.98543168, 0.01456832],[0.98531838, 0.01468162],...,[0.02618938, 0.97381062],[0.02598963, 0.97401037],[0.02579136, 0.97420864]])
"""
②可视化展示
plt.figure(figsize=(12,5))#整个一张图绘制
decision_boundary = X_new[y_proba[:,1]>=0.5][0]#指定决策边界所处的位置
plt.plot([decision_boundary,decision_boundary],[-1,2],'k:',linewidth = 2)#将边界从上往下绘制
plt.plot(X_new,y_proba[:,1],'g-',label = 'Iris-Virginica')#是当前类别的花
plt.plot(X_new,y_proba[:,0],'b--',label = 'Not Iris-Virginica')#不是当前类别的花
plt.arrow(decision_boundary,0.08,-0.3,0,head_width = 0.05,head_length=0.1,fc='b',ec='b')#指定箭头
plt.arrow(decision_boundary,0.92,0.3,0,head_width = 0.05,head_length=0.1,fc='g',ec='g')
plt.text(decision_boundary+0.02,0.15,'Decision Boundary',fontsize = 16,color = 'k',ha='center')#添加字符串指定决策边界
plt.xlabel('Peta width(cm)',fontsize = 16)#x轴标签,花瓣宽度
plt.ylabel('y_proba',fontsize = 16)#y轴标签,最终预测的概率值
plt.axis([0,3,-0.02,1.02])#设置x和y轴的取值范围
plt.legend(loc = 'center left',fontsize = 16)#显示标签,放在中间偏左位置

在这里插入图片描述
遇到不太熟悉的函数,比如画箭头arrow,可以通过查阅帮助文档进行解决

print (help(plt.arrow))
"""
Help on function arrow in module matplotlib.pyplot:arrow(x, y, dx, dy, **kwargs)Add an arrow to the axes.This draws an arrow from ``(x, y)`` to ``(x+dx, y+dy)``.Parameters----------x, y : floatThe x/y-coordinate of the arrow base.dx, dy : floatThe length of the arrow along x/y-direction.Returns-------arrow : `.FancyArrow`The created `.FancyArrow` object.Other Parameters----------------**kwargsOptional kwargs (inherited from `.FancyArrow` patch) control thearrow construction and properties:Constructor arguments*width*: float (default: 0.001)width of full arrow tail*length_includes_head*: bool (default: False)True if head is to be counted in calculating the length.*head_width*: float or None (default: 3*width)total width of the full arrow head*head_length*: float or None (default: 1.5 * head_width)length of arrow head*shape*: ['full', 'left', 'right'] (default: 'full')draw the left-half, right-half, or full arrow*overhang*: float (default: 0)fraction that the arrow is swept back (0 overhang meanstriangular shape). Can be negative or greater than one.*head_starts_at_zero*: bool (default: False)if True, the head starts being drawn at coordinate 0instead of ending at coordinate 0.Other valid kwargs (inherited from :class:`Patch`) are:agg_filter: a filter function, which takes a (m, n, 3) float array and a dpi value, and returns a (m, n, 3) array alpha: float or Noneanimated: boolantialiased: unknowncapstyle: {'butt', 'round', 'projecting'}clip_box: `.Bbox`clip_on: boolclip_path: [(`~matplotlib.path.Path`, `.Transform`) | `.Patch` | None] color: colorcontains: callableedgecolor: color or None or 'auto'facecolor: color or Nonefigure: `.Figure`fill: boolgid: strhatch: {'/', '\\', '|', '-', '+', 'x', 'o', 'O', '.', '*'}in_layout: booljoinstyle: {'miter', 'round', 'bevel'}label: objectlinestyle: {'-', '--', '-.', ':', '', (offset, on-off-seq), ...}linewidth: float or None for default path_effects: `.AbstractPathEffect`picker: None or bool or float or callablerasterized: bool or Nonesketch_params: (scale: float, length: float, randomness: float) snap: bool or Nonetransform: `.Transform`url: strvisible: boolzorder: floatNotes-----The resulting arrow is affected by the axes aspect ratio and limits.This may produce an arrow whose head is not square with its stem. Tocreate an arrow whose head is square with its stem,use :meth:`annotate` for example:>>> ax.annotate("", xy=(0.5, 0.5), xytext=(0, 0),...             arrowprops=dict(arrowstyle="->"))None
"""

Ⅴ,笛卡尔积(棋盘操作)样例

x0,x1 = np.meshgrid(np.linspace(1,2,2).reshape(-1,1),np.linspace(10,20,3).reshape(-1,1))#笛卡尔积
x0
"""
array([[1., 2.],[1., 2.],[1., 2.]])
"""
x1
"""
array([[10., 10.],[15., 15.],[20., 20.]])
"""
np.c_[x0.ravel(),x1.ravel()]#拼接
"""
array([[ 1., 10.],[ 2., 10.],[ 1., 15.],[ 2., 15.],[ 1., 20.],[ 2., 20.]])
"""

从运行结果也不难看出,笛卡尔积的操作就类似一个棋盘,(1,2,2)也就是从1-2之间选取2个数赋值给x0,(10,20,3)从10到20之间选取3个数赋值给x1。
拼接之后即可得到这几个数的全部的排列组合情况。

Ⅵ,分类决策边界

X[:,0].min(),X[:,0].max()#获取标签为0的数据的大致范围为后续的画图做参考
"""
(1.0, 6.9)
"""
X[:,1].min(),X[:,1].max()#获取标签为1的数据的大致范围为后续的画图做参考
"""
(0.1, 2.5)
"""
x0,x1 = np.meshgrid(np.linspace(2.9,7,500).reshape(-1,1),np.linspace(0.8,2.7,200).reshape(-1,1))
X_new = np.c_[x0.ravel(),x1.ravel()]#拼接
X_new#获得测试数据
"""
array([[2.9       , 0.8       ],[2.90821643, 0.8       ],[2.91643287, 0.8       ],...,[6.98356713, 2.7       ],[6.99178357, 2.7       ],[7.        , 2.7       ]])
"""
X_new.shape#100000=500*200
"""
(100000, 2)
"""
y_proba = log_res.predict_proba(X_new)#通过训练好的模型去预测测试数据的概率值
x0.shape#维度参数得与后续z轴一致
"""
(200, 500)
"""
x1.shape#维度参数得与后续z轴一致
"""
(200, 500)
"""
plt.figure(figsize=(10,4))#绘制图片的框架大小
plt.plot(X[y==0,0],X[y==0,1],'bs')#展示数据点
plt.plot(X[y==1,0],X[y==1,1],'g^')#展示数据点zz = y_proba[:,1].reshape(x0.shape)#绘制z轴
contour = plt.contour(x0,x1,zz,cmap=plt.cm.brg)#绘制等高线
plt.clabel(contour,inline = 1)#等高线上添加概率值
plt.axis([2.9,7,0.8,2.7])#限制x和y轴的取值范围
plt.text(3.5,1.5,'NOT Vir',fontsize = 16,color = 'b')#展示标签
plt.text(6.5,2.3,'Vir',fontsize = 16,color = 'g')#展示标签

在这里插入图片描述

四、Softmax

如何实现之间对多列别进行分类,这里Softmax就派上用场了。
在这里插入图片描述
由公式很明显可知,softmax实际上就是先对数据求指数,然后目的就是为了拉大差距,之后再进行归一化操作。
损失函数也就是对数,0-1之间联想下对数函数。

X = iris['data'][:,(2,3)]#获取数据
y = iris['target']#获取标签
softmax_reg = LogisticRegression(multi_class = 'multinomial',solver='lbfgs')#指定多分类,指定求解的方法
softmax_reg.fit(X,y)#训练
"""
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,intercept_scaling=1, max_iter=100, multi_class='multinomial',n_jobs=None, penalty='l2', random_state=None, solver='lbfgs',tol=0.0001, verbose=0, warm_start=False)
"""
softmax_reg.predict([[5,2]])#二维数据
"""
array([2])
"""
softmax_reg.predict_proba([[5,2]])#预测看看有几个概率值,也就是分成了几类,也就证实了这是个多分类的任务
"""
array([[2.43559894e-04, 2.14859516e-01, 7.84896924e-01]])
"""
#绘制等高线
x0, x1 = np.meshgrid(np.linspace(0, 8, 500).reshape(-1, 1),np.linspace(0, 3.5, 200).reshape(-1, 1),)
X_new = np.c_[x0.ravel(), x1.ravel()]y_proba = softmax_reg.predict_proba(X_new)
y_predict = softmax_reg.predict(X_new)zz1 = y_proba[:, 1].reshape(x0.shape)
zz = y_predict.reshape(x0.shape)plt.figure(figsize=(10, 4))
plt.plot(X[y==2, 0], X[y==2, 1], "g^", label="Iris-Virginica")
plt.plot(X[y==1, 0], X[y==1, 1], "bs", label="Iris-Versicolor")
plt.plot(X[y==0, 0], X[y==0, 1], "yo", label="Iris-Setosa")from matplotlib.colors import ListedColormap
custom_cmap = ListedColormap(['#fafab0','#9898ff','#a0faa0'])plt.contourf(x0, x1, zz, cmap=custom_cmap)
contour = plt.contour(x0, x1, zz1, cmap=plt.cm.brg)
plt.clabel(contour, inline=1, fontsize=12)
plt.xlabel("Petal length", fontsize=14)
plt.ylabel("Petal width", fontsize=14)
plt.legend(loc="center left", fontsize=14)
plt.axis([0, 7, 0, 3.5])
plt.show()

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/377907.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二叉搜索树的插入、删除、修剪、构造操作(leetcode701、450、669、108)

目录1、leetcode 701. 二叉搜索树中的插入操作1、题目2、递归法3、迭代法2、leetcode 450. 二叉搜索树中的插入操作1、题目2、思路递归法3、迭代法4、删除结点的两个方法以及注意点3、leetcode 669. 修剪二叉搜索树1、题目2、思考与递归3、迭代法4、leetcode 108. 将有序数组转…

模拟退火算法解决np_P和NP问题与解决方案| 演算法

模拟退火算法解决npP问题 (P Problems) P is the set of all the decision problems solvable by deterministic algorithms in polynomial time. P是多项式时间内确定性算法可解决的所有决策问题的集合。 NP问题 (NP Problems) NP is the set of all the decision problems t…

POJ2251Dungeon Master

http://poj.org/problem?id2251 题意 : 就是迷宫升级版,从以前的一个矩阵也就是一层,变为现在的L层," . "是可以走,但是“#”不可以走,从S走到E,求最短的路径,若是找不到…

六、聚类算法

一、聚类概念 1,通俗易懂而言,聚类主要运用于无监督学习中,也就是将没有标签的东西如何分为几堆儿。 2,无监督学习即没有标签,不知道这些玩意到底是啥。当然,有监督学习就是由标签,我们是提前知…

【C++grammar】string类和array类

目录1、C11的string类1、创建 string 对象2、追加字符串append函数3、为字符串赋值assign函数4、at, clear, erase, and empty函数5、比较字符串compare()6、获取子串at() 、substr()函数7、搜索字符串find()8、插入和替换字符串insert() 、replace()9、字符串运算符10、string…

六、聚类算法实战

所有代码块都是在Jupyter Notebook下进行调试运行,前后之间都相互关联。 文中所有代码块所涉及到的函数里面的详细参数均可通过scikit-learn官网API文档进行查阅,这里我只写下每行代码所实现的功能,参数的调整读者可以多进行试验调试。多动手…

超图软件试用许可操作步骤_软件中的操作步骤

超图软件试用许可操作步骤The software comprises of three things: Program code, Documentation, and the Operating Procedures. The Program code is the entire software code. The Documentation is produced while the development of the software itself for the time…

【嵌入式系统】STM32配置FreeRTOS以及利用多线程完成流水灯、按键、蜂鸣器、数码管工作

目录1、利用STM32CubeMX配置FreeRTOS2、完成流水灯、按键、蜂鸣器数码管工作1、在gpio.c和.h文件里面书写并声明按键扫描和led、数码管子程序2、在freertos.c文件里面设置全局变量并且在各自任务中载入程序3、关于FreeRTOS的注意事项1、利用STM32CubeMX配置FreeRTOS 假设我们之…

css模糊_如何使用CSS模糊图像?

css模糊Introduction: 介绍: Sometimes even the professional developers tend to forget the various basic properties which can be applied to solve very simple problems, therefore the fundamentals of developing a website or web page should be very …

七、决策树算法和集成算法

一、决策树算法 Ⅰ,树模型 决策树:从根节点开始一步步走到叶子节点(决策) 所有的数据最终都会落到叶子节点,既可以做分类也可以做回归 对于分类:是由众数决定的,例如爷爷奶奶妈妈都是负数&…

leetcode 538. 把二叉搜索树转换为累加树 思考分析

题目 给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。 提醒一下,二叉搜索树满足下列约束条件&…

SQL中GROUP BY语句与HAVING语句的使用

最近在学习SQL Server相关知识,一直不知道怎么使用GROUP BY语句,经过研究和练习,终于明白如何使用了,在此记录一下同时添加了一个自己举的小例子,通过写这篇文章来加深下自己学习的效果,还能和大家分享下&a…

八、决策树算法实验可视化展示

一、树模型的可视化展示 官网下载安装包 右击管理员身份运行,直接下一步即可。 配置环境变量: 将安装好的可视化软件的bin文件夹路径添加到系统环境变量Path下即可 打开cmd,输入dot -version,出现相关信息即安装成功 二、决策…

机器学习笔记:PCA的简单理解以及应用建议

用notability做的笔记,比较随意,对于第五点的PCA错误使用需要特别强调。 目录1、PCA与线性回归2、PCA主成分数量选择3、压缩重现4、PCA应用建议5、PCA的错误使用1、PCA与线性回归 2、PCA主成分数量选择 3、压缩重现 4、PCA应用建议 5、PCA的错误使用

一、信用卡卡号识别

一、思路分析 大体思路:首先拿到一张银行卡,我们得有银行卡号数字的0-9样式的模板,然后再通过不同数字的轮廓的外接矩形来进行匹配,最终识别出银行卡号所对应的数字。 银行卡数字模板: 银行卡信息: 拿到…

bootstrap网格系统_如何使用Bootstrap网格系统?

bootstrap网格系统In the last article, we learned how to create a simple page of Bootstrap? Now, we will learn what is "Grid System" in Bootstrap and how we can use or implement it in our bootstrap page? As you know bootstrap is a mobile-friendl…

回溯法初步

本文为参考公众号所做的笔记。 代码随想录原文 回溯法本质是穷举,穷举所有可能,然后选出我们想要的答案,所以它并不是一个高效的算法。但是由于有些问题本身能用暴力搜出来就不错了,所以回溯法也有很多的应用。 回溯法解决的问题…

二、文档扫描OCR

一、思路分析 首先,拿到一张文档,我们需要对文档进行预处理操作,再进行轮廓检测,因为就算拿到文档轮廓,但是这些轮廓也有可能是歪歪扭扭的,这时候需要通过一系列的透视变换操作,将文档摆正。通…

leetcode 77. 组合 思考分析

目录1、题目2、回溯法思路3、参考其他思路,更深入了解这个问题4、剪枝优化可能需要回顾到的知识文章:1、常用算法总结(穷举法、贪心算法、递归与分治算法、回溯算法、数值概率算法)2、回溯法初步删除vector容器中的对象元素的三种方法:pop_back, erase与…

三、全景拼接

一、项目所涉及到的一些知识点 Ⅰ,BF(Brute-Force)暴力匹配:把两张图像的特征点全部给算出来,然后使用归一化的欧氏距离比较这两张图像上特征点之间的大小关系,越小越相似。 SIFT算法 import cv2 import numpy as np import ma…