栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

机器学习-4逻辑回归

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

机器学习-4逻辑回归

一、二元分类

通过输入的样本,多元线性回归模型返回的是连续预测值,需要一种方法将连续值转变为离散预测值,[-∞,+∞]—>[0,1]。

可以利用逻辑函数来实现。(图如下)

import numpy as np
import matplotlib.pyplot as mp
x = np.linspace(-20,20,10000)
#y = np.array(1 / (1 + np.exp(-x)))
y=1/(1+np.exp(-x))
y1 = np.array(1 / (1 + np.exp(-x)) ** 0) / 2.0
mp.plot(x,y)
mp.plot(x,y1)
mp.show()

  

 当 0,y> 0.5;x< 0,y< 0.5" src="https://latex.codecogs.com/gif.latex?x%3E%200%2Cy%3E%200.5%3Bx%3C%200%2Cy%3C%200.5" />,将样本数据经过线性模型求得 的预测值带入逻辑函数的x,可以根据函数值确定两个分类,大于0.5属于1类,小于0.5属于0类(因为是在(0,1)区间,也可以将结果看作一个概率,依概率大小确定0、1分类),这是线性函数非线性化的一种方式。

# -*- coding: utf-8 -*-
"""
Created on Fri May  6 10:49:04 2022

@author: xxxy
"""
import numpy as np
import sklearn.linear_model as lm
x = np.array([[5,1],
              [2,5],
              [1,8],
              [6,4],
              [5,2],
              [4,5],
              [4,7],
              [4,-1]])
y = np.array([0,1,1,0,0,1,1,1])
#构建逻辑回归分类器
#solver:逻辑函数中指数的函数关系(liblinear为线性函数关系)
#c:表示正则强度,防止过拟合。正则越大拟合效果越小
model = lm.LogisticRegression(solver='liblinear',C=1)
model.fit(x,y)#底层任然是构建的一个多元线性回归模型
r=model.predict([[3,6],[8,1]])
print(r)

# -*- coding: utf-8 -*-
"""
Created on Fri May  6 22:12:09 2022

@author: xxxy
"""
import numpy as np
import sklearn.linear_model as lm
import matplotlib.pyplot as mp
x = np.array([[5,1],
              [2,5],
              [1,8],
              [6,4],
              [5,2],
              [4,5],
              [4,7],
              [4,-1]])
y = np.array([0,1,1,0,0,1,1,0])

#grid_x是500x500,拉平得到两个个250000的一维数组(grid_y也是同样500x500),
#列合并,得到一个250000x2的一个二维数组。
model = lm.LogisticRegression(solver='liblinear',C=1)
model.fit(x,y)#底层任然是构建的一个多元线性回归模型

l, r = x[:, 0].min()-1, x[:, 0].max()+1
b, t = x[:, 1].min()-1, x[:, 1].max()+1
n = 500
grid_x, grid_y = np.meshgrid(
	np.linspace(l, r, n),
	np.linspace(b, t, n))
mesh_x = np.column_stack((grid_x.ravel(), 
	grid_y.ravel()))
mesh_z = model.predict(mesh_x)#250000
grid_z = mesh_z.reshape(grid_x.shape)#grid_z变为grid_x维度500x500
mp.figure('LR Classification', facecolor='lightgray')
mp.title('LR Classification', fontsize=16)
mp.xlabel('X',fontsize=14)
mp.ylabel('Y',fontsize=14)
mp.pcolormesh(grid_x,grid_y,grid_z,cmap='gray')
mp.scatter(x[:,0], x[:,1], c=y, cmap='jet',
		label='points',s=70)
mp.legend()
mp.show()

网格化坐标颜色的实现原理是将500x500个网格通过pcolormesh()函数来填色。

二、 多元分类

通过多个二元分类器解决多元分类问题。

例如:

特征1  特征2  类别    属于A的概率   属于B的概率  属于C的概率

5           7          A          0.9                     0.2                 0.3

2.4         6         A           0.6                    0.4                 0.2

1.5        1.9       B           0.2                    0.6                 0.2

5.5         3.2      C           0.3                    0.1                 0.8

三个分类器得到每行中概率最大最为:0.9、0.6、0.8,所以:

第一行样本是A类别;

第二行样本是A类别;

第三行样本是B类别;

第四行样本是C类别。

下面代码中除修改了样本数据外,其它代码同上面代码一样,模型内部自动实现多元分类。

import numpy as np
import sklearn.linear_model as lm
import matplotlib.pyplot as mp
x = np.array([[1,5],
              [2.3,5],
              [1,8],
              [0.5,1],
              [1,2],
              [1.2,1.5],
              [7,4],
              [4,1.5],
              [5.6,2.3]])
y = np.array([0,0,0,1,1,1,2,2,2])
model = lm.LogisticRegression(solver='liblinear',C=500)
model.fit(x,y)#底层任然是构建的一个多元线性回归模型

l, r = x[:, 0].min()-1, x[:, 0].max()+1
b, t = x[:, 1].min()-1, x[:, 1].max()+1
n = 500
grid_x, grid_y = np.meshgrid(
	np.linspace(l, r, n),
	np.linspace(b, t, n))
mesh_x = np.column_stack((grid_x.ravel(), 
	grid_y.ravel()))
mesh_z = model.predict(mesh_x)#250000
grid_z = mesh_z.reshape(grid_x.shape)#grid_z变为grid_x维度500x500
mp.figure('LR Classification', facecolor='lightgray')
mp.title('LR Classification', fontsize=16)
mp.xlabel('X',fontsize=14)
mp.ylabel('Y',fontsize=14)
mp.pcolormesh(grid_x,grid_y,grid_z,cmap='gray')
mp.scatter(x[:,0], x[:,1], c=y, cmap='jet',
		label='points',s=70)
mp.legend()
mp.show()

 下面的代码帮助理解画图

import numpy as np
import sklearn.linear_model as lm
import matplotlib.pyplot as mp
grid_x=np.linspace(1,5,5,5)
grid_y=np.linspace(1,6,6,6)
print(grid_x)
print(grid_y)
print('********************************')
grid_x,grid_y=np.meshgrid(grid_x,grid_y)
print(grid_x)#行复制,6x5
print(grid_y)#列复制,6x5,即得到坐标(1,1)、(2,1)、(3,1)...(5,1)
             #                      (1,2)、(2,2)、(3,2)...(5,2)
             #                       .................
             #                      (1,5)、(2,5)、(3,5)...(5,5)
print('********************************')
z=np.random.rand(30,30)
mp.pcolormesh(z,cmap='gray')
mp.legend()
mp.show()

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/864197.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号