python 画出决策边界_Python3入门机器学习 - 逻辑回归与决策边界

logistic回归又称logistic回归分析,是一种广义的线性回归分析模型,以胃癌病情分析为例,选择两组人群,一组是胃癌组,一组是非胃癌组,两组人群必定具有不同的体征与生活方式等。因此因变量就为是否胃癌,值为“是”或“否”,自变量就可以包括很多了,如年龄、性别、饮食习惯、幽门螺杆菌感染等。

逻辑回归需要将原本线性回归结果的值域置于(0,1)之间,概率大于0.5看作结果为1

常使用sigmoid函数将结果变为(0,1)之间的值域

绘制sigmoid曲线def sigmoid(t):

return 1/(1+np.exp(-t))

x = np.linspace(-10,10,100)

y = sigmoid(x)

plt.plot(x,y)

逻辑回归的损失函数

该损失函数没有公式解,可以用梯度下降法求最优解

损失函数求导

封装Logistics模型我使用Logistics模型及鸢尾花数据集的前两列,可得到1.0准确率的预测精准度。# 代码与线性回归及其相似,只是推导公式不同# _*_ encoding:utf-8 _*_import numpy as np

from sklearn.metrics import r2_score

from metrics import accuracy_scoreclass LinearRegression:

def __init__(self):        self.coef_ = None        self.interception_ = None        self._theta = None    def _sigmoid(self,t):        return 1./(1.+ np.exp(-t))    def fit(self,X_train,y_train,eta=0.01,n_iters=1e6):        def J(theta,X_b,y):

y_hat = self._sigmoid(X_b.dot(theta))            try:

return -np.sum(y*np.log(y_hat)+(1-y)*np.log(1-y_hat))/len(y)            except:

return float("inf")        def dJ(theta,X_b,y):            # res = np.empty()

# res[0] = np.sum(X_b.dot(theta)-y)

# for i in range(1,len(theta)):

#     res[i] = (X_b.dot(theta)-y).dot(X_b[:,i])

# return res * 2 / len(X_b)

return X_b.T.dot(self._sigmoid(X_b.dot(theta))-y)/len(X_b)        def gradient_descent(X_b,y,initial_theta,eta,n_iters=1e6,epsilon=1e-8):

theta = initial_theta

cur_iter = 0

while cur_iter

gradient = dJ(theta,X_b,y)

last_theta = theta

theta = theta - eta * gradient                if (abs(J(theta,X_b,y) - J(last_theta,X_b,y)) 

cur_iter+=1

return theta

X_b = np.hstack([np.ones((len(X_train),1)),X_train])

initial_theta = np.zeros(X_b.shape[1])        self._theta = gradient_descent(X_b,y_train,initial_theta,eta,n_iters)        self.interception_ = self._theta[0]        self.coef_ = self._theta[1:        return self

def predict_proba(self,X_predict):

X_b = np.hstack([np.ones((len(X_predict),1)),X_predict])        return self._sigmoid(X_b.dot(self._theta))    def predict(self,X_predict):

proba = self.predict_proba(X_predict)        return proba>=0.5

def score(self,X_test,y_test):        return accuracy_score(y_test,self.predict(X_test))    def __repr__(self):        return "LogisticRegreesion()"

决策边界在逻辑回归中,易得决策边界为 theta*X_b=0 的直线

如果只有两个特征值,则很容易通过公式画出逻辑回归的决策边界

蓝线即为鸢尾花数据前两列特征值通过逻辑回归得到的决策边界

不规则的决策边界的绘制

一种绘制思路def plot_decision_boundary(model,axis):

x0,x1 = np.meshgrid(

np.linspace(axis[0],axis[1],int((axis[1]-axis[0])*100)),

np.linspace(axis[2],axis[3],int((axis[3]-axis[2])*100))

)

X_new = np.c_[x0.ravel(),x1.ravel()]

y_predict = model.predict(X_new)

zz = y_predict.reshape(x0.shape)

from matplotlib.colors import ListedColormap

custom_cmap = ListedColormap(['#EF9A9A','#FFF59D','#90CAF9'])

plt.contourf(x0,x1,zz,linewidth=5,cmap=custom_cmap)plot_decision_boundary(log_reg,axis=[4,7.5,1.5,4.5])

plt.scatter(X[y==0,0],X[y==0,1])

plt.scatter(X[y==1,0],X[y==1,1])

plt.show()

knn算法的决策边界knn_clf = KNeighborsClassifier()

knn_clf.fit(iris.data[:,:2],iris.target)

plot_decision_boundary(knn_clf,axis=[4,7.5,1.5,4.5])

plt.scatter(X[y==0,0],X[y==0,1])

plt.scatter(X[y==1,0],X[y==1,1])

plt.show()

n_neighbors默认等于5时

n_neighbors等于50时

多项式特征应用于逻辑回归#准备数据X = np.random.normal(0,1,size=(200,2))

y = np.array(X[:,0]**2 + X[:,1]**2<1.5,dtype='int')def PolynomialLogisticRegression(degree):

return Pipeline([

('Poly',PolynomialFeatures(degree=degree)),

('std_scaler',StandardScaler()),

('Logistic',LogisticRegression())

])

Log_reg = PolynomialLogisticRegression(2)

Log_reg.fit(X,y)

逻辑回归的模型正则化

逻辑回归的模型正则化方式#准备数据import numpy as npimport matplotlib.pyplot as plt

X = np.random.normal(0,1,size=(200,2))

y = np.array(X[:,0]**2 + X[:,1]<1.5,dtype='int')for _ in range(20):

y[np.random.randint(200)] = 1   #噪音plt .scatter(X[y==0,0],X[y==0,1])

plt .scatter(X[y==1,0],X[y==1,1])

plt.show()

数据.pngfrom sklearn.linear_model import LogisticRegressionfrom sklearn.preprocessing import PolynomialFeaturesfrom sklearn.pipeline import Pipeline

log_reg = LogisticRegression()

log_reg.fit(X,y)LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,

intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,

penalty='l2', random_state=None, solver='liblinear', tol=0.0001,

verbose=0, warm_start=False)

其中模型正则化公式中的参数C默认为1,penalty默认为'l2'from sklearn.preprocessing import StandardScalerdef PolynomialLogisticRegression(degree,C=1.0,penalty='l2'):

return Pipeline([

('Poly',PolynomialFeatures(degree=degree)),

('std_scaler',StandardScaler()),

('Logistic',LogisticRegression(C=C,penalty=penalty))

])

poly_log_reg = PolynomialLogisticRegression(degree=20,C=0.1,penalty='l1')

poly_log_reg.fit(X,y)

曲线相对平滑

应用OVR和OVO使逻辑回归处理多分类问题OVR:One Vs Rest

OVO:One Vs One

OVR耗时较少,性能较高,但分类准确度略低

OVO耗时较多,分类准确度较高#为了数据可视化方便,我们只使用鸢尾花数据集的前两列特征from sklearn import datasets

iris = datasets.load_iris()

X = iris['data'][:,:2]

y = iris['target']

log_reg = LogisticRegression(multi_class='ovr')   #传入multi_class参数可以指定使用ovr或ovo,默认ovrlog_reg.score(X_test,y_test)>>> 0.578   #由于只使用前两列特征,导致分类准确度较低log_reg = LogisticRegression(multi_class='ovr',solver='newton-cg')

log_reg.fit(X_train,y_train)

log_reg.score(X_test,y_test)>>> 0.7894736842105263

OVR分类决策边界

OVO分类决策边界

使用scikitlearn中的OVO及OVR类来进行多分类from sklearn.multiclass import OneVsOneClassifierfrom sklearn.multiclass import OneVsRestClassifier

ovr = OneVsRestClassifier(log_reg)

ovr.fit(X_train,y_train)

print(ovr.score(X_test,y_test))

ovo = OneVsOneClassifier(log_reg)

ovo.fit(X_train,y_train)

print(ovo.score(X_test,y_test))>>> 0.7894736842105263>>> 0.8157894736842105

作者:冰源_63ad

链接:https://www.jianshu.com/p/c5ba12a1b2c8

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

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

相关文章

mysql基础测试_MySQL基础知识测试

SQL基础知识测试1 . SQL 指的是&#xff1f;Strong Question LanguageStructured Question LanguageStructured Query Language2 . 哪个SQL 语句用于从数据库中提取数据&#xff1f;EXTRACTSELECTOPENGET3 . 哪条SQL 语句用于更新数据库中的数据&#xff1f;MODIFYSAVE ASUPDAT…

mybatis字符串转成数字_计算机储存数字和字符的方法你了解多少?

前语&#xff1a;不要为了读文章而读文章&#xff0c;一定要带着问题来读文章&#xff0c;勤思考。本文链接&#xff1a; http://1t.click/J7E前言最近在学习中涉及到计算机储存、传输数字和字符等操作&#xff0c;由于对字节、2进制、10进制、16进制、ASCII码的概念以及它们之…

usb连接不上 艾德克斯电源_艾德克斯HT3150联机和IT6720校准联机记

大概2年前&#xff0c;坛里入了一台设置电压比输出电压高几伏的IT6720电源&#xff0c;到手发现&#xff0c;里面被修得惨不忍睹。到手的时候是110V的&#xff0c;没想到这种型号&#xff0c;跳线要改焊控制变压器和高压部分两个跳线&#xff0c;只修改了控制变压器跳线&#x…

经典兔子问题python视频_Python练习题 007:兔子生兔子

【Python练习题 007】 有一对兔子&#xff0c;从出生后第3个月起每个月都生一对兔子&#xff0c;小兔子长到第三个月后每个月又生一对兔子&#xff0c;假如兔子都不死&#xff0c;问每个月的兔子总数为多少&#xff1f;------------------------------------------------------…

android调用python框架_在Java中从Android应用程序执行Python脚本?

我正试图找到一种在Android中从Java代码执行Python脚本的方法。我对这个问题做了一个研究&#xff0c;但我发现的唯一问题是&#xff0c;如何在APK for android(Kivy e.t.c.)中转换python脚本。更具体地说&#xff0c;我有一个包含很多函数的脚本&#xff0c;我想做的是在我的j…

使用java向ftp上传多张图片_ftp免费空间,利用ftp工具定时连接ftp免费空间教程及java配置...

IIS7服务器管理工具这款ftp客户端软件&#xff0c;可以批量管理ftp站点&#xff0c;还可以实现ftp定时上传、定时下载&#xff0c;定时备份、自动更新等功能。关于ftp客户端功能&#xff0c;它主要实现以下四点功能&#xff1a;1、ftp 批量操作2、ftp 定时同步&#xff08;上传…

mysql fulltext 分页_关于MySQL的FULLTEXT实现全文检索的注意事项

对于英文&#xff0c;MySQL的FULLTEXT属性来实现全文检索是相当方便且高效的&#xff0c;但是在使用过程中需要注意一些事项。首先对我们对需要进行检索的字段添加FULLTEXT属性(假设已经建表)&#xff1a;SQL&#xff1a;alter table table_name add fulltext index(filed_1,fi…

损失函数的意义和作用_损失函数的可视化:浅论模型的参数空间与正则

点击蓝字关注我们作者丨土豆知乎来源丨https://zhuanlan.zhihu.com/p/158857128本文已获授权&#xff0c;不得二次转载前言在深度学习中&#xff0c;我们总是不可避免会碰到各种各样的损失函数。通常来说&#xff0c;损失函数都是高维的函数&#xff0c;难以可视化为人类可以分…

postgres 把一个表的值转成另一个表的字段名_用LUT来做一个可动态配置的卷积核...

引言由于卷积核数据在计算过程中保持不变&#xff0c;更新较慢。这样就可以利用LUT来存储权重并同时进行乘法运算。LUT乘法器的实现很早就已经研究过&#xff0c;本论文正是在此基础上&#xff0c;提出了用于实现可配置的卷积实现方法。基于LUT的乘法器不会受到FPGA中DSP资源的…

mysql储存过程把集合并_MySQL 多日志表结果集合拼接存储过程

通常MySQL单天的日志 只记录当天的日志信息,如果需要查看一月内的日志信息需要对每天的日志表结果集合进行拼接&#xff0c;通常用到 union通常MySQL单天的日志 只记录当天的日志信息,如果需要查看一月内的日志信息需要对每天的日志表结果集合进行拼接&#xff0c;通常用到 uni…

split函数python统计英文单词_统计一篇英文文章单词个数,取出出现频次前10的单词(Python实现)...

题目&#xff1a; 用python实现统计一篇英文文章内每个单词的出现频率&#xff0c;并返回出现频率最高的前10个单词及其出现次数。常规解法怎么判定单词?1 不是字母的特殊字符作为分隔符分割字符串 (避免特殊字符的处理不便&#xff0c;全部替换成"")2 正则分割3 遍…

superset mysql数据源配置_superset 性能优化1-已经使用中的superset更改默认数据源sqlite到mysql...

已经使用中的superset更改默认数据源sqlite到mysql1.提取sqlite db(由于当前使用 docker 需要到宿主)docker cp CONTAINER_NAME:/var/lib/superset/superset.db /opt2.数据导出然后使用 navicat 数据库工具打开sqlite文件选择导出向导csv数据保存到一个文件夹3.创建mysql数据库…

对于一个指针可以多次使用delete_【C++札记】new和delete

malloc,free和new,delete区别&#xff1a;a.malloc,free是C/C的标准库函数。new,delete是c的操作符。b.malloc申请的是内存&#xff0c;严格意义不是“对象”&#xff0c;new申请的可以理解为“对象”&#xff0c;new 时会调用构造函数&#xff0c;返回指向该对象的指针。c.对于…

java循环队列_Java 循环队列的实现

队列概念队列(Queue)是限定只能在一端插入、另一端删除的线性表。允许删除的一端叫做队头(front),允许插入的一端叫做队尾(rear)&#xff0c;没有元素的队列称为“空队列”。队列具有先进先出(FIFO)的特性。普通顺序队列存在的问题在普通顺序队列中,入队的操作就是先将尾指针re…

python大数据开发平台_python示例

### 结合使用 GET 和 Authorization 标头 (Python)以下示例说明如何使用 [根据方案编号获取内容列表](http://open.gsdata.cn/article/info?id1) API 发出请求。该请求发出 GET 请求&#xff0c;并使用 Authorization 标头将身份验证信息发送到 GSDATA。~~~#!/usr/bin/python#…

java 遍历hashmap key_Java5种遍历HashMap数据的写法

本文介绍了最好的Java5种遍历HashMap数据的写法&#xff0c;分享给大家&#xff0c;也给自己留一个笔记&#xff0c;具体如下&#xff1a;通过EntrySet的迭代器遍历Iterator < Entry < Integer, String >> iterator coursesMap.entrySet().iterator();while (iter…

python不能卸载原因_linux上python卸载不了是什么原因?

linux下卸载python&#xff1a;1.首先查看自己电脑的python版本在root下&#xff0c;python3 --version python3.5.3python --version python 2.7.132.说实话&#xff0c;对于这点我不太喜欢&#xff0c;可能是系统自带的&#xff0c;无自己没事就瞎折腾一下&#xff0c;也就是…

java new 多线程_Java多线程实现(四种方法)

1.继承Thread类&#xff0c;重写run方法(其实Thread类本身也实现了Runnable接口)2.实现Runnable接口&#xff0c;重写run方法3.实现Callable接口&#xff0c;重写call方法(有返回值)4.使用线程池(有返回值)1.继承Thread类&#xff0c;重写run方法每次创建一个新的线程&#xff…

oracle删除唯一索引sql语句_高级SQL之在选择语句中使用更新和删除

点击蓝字关注我吧【本文详细介绍了数据库中在选择语句中使用更新和删除的方法&#xff0c;欢迎读者朋友们阅读、转发和收藏&#xff01;】1 基本概念1.1 SQL UPDATE 语句Update 语句Update 语句用于修改表中的数据。语法&#xff1a;UPDATE 表名称 SET 列名称 新值 WHERE 列名…

java 读 jar外文件_读取Jar包外面的配置文件

比较常用的方法是将properties文件直接打入JAR包中&#xff0c;然后使用Properties类进行读取。有时候也需要读取在JAR外面的配置文件。废话不多说&#xff0c;直接上代码&#xff1a;import java.io.BufferedInputStream;import java.io.FileInputStream;import java.io.IOExc…