热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

logistic回归(线性和非线性)的开发笔记

本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。
本文由编程笔记#小编为大家整理,主要介绍了logistic 回归(线性和非线性)相关的知识,希望对你有一定的参考价值。


一:线性logistic 回归

代码如下:


import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import scipy.optimize as opt
import seaborn as sns
#读取数据集
path = ex2data1.txt
data
= pd.read_csv(path, header=None, names=[Exam 1, Exam 2, Admitted])
#将正负数据集分开
positive = data[data[Admitted].isin([1])]
negative
= data[data[Admitted].isin([0])]
‘‘‘
#查看分布
fig, ax = plt.subplots(figsize=(12, 8))
ax.scatter(positive[‘Exam 1‘], positive[‘Exam 2‘], s=60, c=‘b‘, marker=‘o‘, label=‘Admitted‘)
ax.scatter(negative[‘Exam 1‘], negative[‘Exam 2‘], s=50, c=‘r‘, marker=‘x‘, label=‘UnAdmitted‘)
ax.legend()
ax.set_xlabel(‘Exam 1 Score‘)
ax.set_ylabel(‘Exam 2 Score‘)
plt.show()
‘‘‘
#sigmoid函数实现
def sigmoid(h):
return 1 / (1 + np.exp(-h))
‘‘‘
#测试sigmoid函数
nums = np.arange(-10, 11, step=1)
fig, ax = plt.subplots(figsize=(12, 8))
ax.plot(nums, sigmoid(nums), ‘k‘)
plt.show()
‘‘‘
#计算损失函数值
def cost(theta, X, y):
theta
= np.matrix(theta)
X
= np.matrix(X)
y
= np.matrix(y)
part1
= np.multiply(-y, np.log(sigmoid(X * theta.T)))
part2
= np.multiply((1-y), np.log(1-sigmoid(X * theta.T)))
return np.sum(part1-part2) / len(X)
#在原矩阵第1列前加一列全1
data.insert(0, ones, 1)
cols
= data.shape[1]
X
= data.iloc[:, 0:cols-1]
y
= data.iloc[:, cols-1:cols]
X
= np.array(X.values)
y
= np.array(y.values)
theta
= np.zeros(3) #这里是一个行向量
#返回梯度向量,注意是向量
def gradient(theta, X, y):
theta
= np.matrix(theta)
X
= np.matrix(X)
y
= np.matrix(y)
parameters
= theta.ravel().shape[1]
grad
= np.zeros(parameters)
error
= sigmoid(X * theta.T) - y
grad
= error.T.dot(X)
grad
= grad / len(X)
return grad
#通过高级算法计算出最好的theta值
result = opt.fmin_tnc(func=cost, x0=theta, fprime=gradient, args=(X, y))
#print(cost(result[0], X, y))
#测试所得theta的性能
#
计算原数据集的预测情况
def predict(theta, X):
theta
= np.matrix(theta)
X
= np.matrix(X)
probability
= sigmoid(X * theta.T)
return [1 if i > 0.5 else 0 for i in probability]
theta_min
= result[0]
predictions
= predict(theta_min, X)
correct
= [1 if((a == 1 and b == 1) or(a == 0 and b == 0)) else 0 for(a, b) in zip(predictions, y)]
accuracy
= (sum(map(int, correct)) % len(correct))
print(accuracy = {0}%.format(accuracy))#训练集测试准确度89%
# 作图
theta_temp = theta_min
theta_temp
= theta_temp / theta_temp[2]
x
= np.arange(130, step=0.1)
y
= -(theta_temp[0] + theta_temp[1] * x)
#画出原点
sns.set(cOntext=notebook, color: #800000">‘ticks, font_scale=1.5)
sns.lmplot(
Exam 1, Exam 2, hue=Admitted, data=data,
size
=6,
fit_reg
=False,
scatter_kws
={"s": 25}
)
#画出分界线
plt.plot(x, y, grey)
plt.xlim(0,
130)
plt.ylim(0,
130)
plt.title(
Decision Boundary)
plt.show()

二:非线性logistic 回归(正则化)

代码如下:


import pandas as pd
import numpy as np
import scipy.optimize as opt
import matplotlib.pyplot as plt
path
= ex2data2.txt
data
= pd.read_csv(path, header=None, names=[Test 1, Test 2, Accepted])
positive
= data[data[Accepted].isin([1])]
negative
= data[data[Accepted].isin([0])]
‘‘‘
#显示原始数据的分布
fig, ax = plt.subplots(figsize=(12, 8))
ax.scatter(positive[‘Test 1‘], positive[‘Test 2‘], s=50, c=‘b‘, marker=‘o‘, label=‘Accepted‘)
ax.scatter(negative[‘Test 1‘], negative[‘Test 2‘], s=50, c=‘r‘, marker=‘x‘, label=‘Unaccepted‘)
ax.legend() #显示右上角的Accepted 和 Unaccepted标签
ax.set_xlabel(‘Test 1 Score‘)
ax.set_ylabel(‘Test 2 Score‘)
plt.show()
‘‘‘
degree
= 5
x1
= data[Test 1]
x2
= data[Test 2]
#在data的第三列插入一列全1
data.insert(3, Ones, 1)
#创建多项式特征值,最高阶为4
for i in range(1, degree):
for j in range(0, i):
data[
F + str(i) + str(j)] = np.power(x1, i-j) * np.power(x2, j)
#删除原数据中的test 1和test 2两列
data.drop(Test 1, axis=1, inplace=True)
data.drop(
Test 2, axis=1, inplace=True)
#sigmoid函数实现
def sigmoid(h):
return 1 / (1 + np.exp(-h))
def cost(theta, X, y, learnRate):
theta
= np.matrix(theta)
X
= np.matrix(X)
y
= np.matrix(y)
first
= np.multiply(-y, np.log(sigmoid(X * theta.T)))
second
= np.multiply((1 - y), np.log(1 - sigmoid(X * theta.T)))
reg
= (learnRate / (2 * len(X))) * np.sum(np.power(theta[:, 1:theta.shape[1]], 2))
return np.sum(first - second) / len(X) + reg
learnRate
= 1
cols
= data.shape[1]
X
= data.iloc[:, 1:cols]
y
= data.iloc[:, 0:1]
X
= np.array(X)
y
= np.array(y)
theta
= np.zeros(X.shape[1])
#计算原数据集的预测情况
def predict(theta, X):
theta
= np.matrix(theta)
X
= np.matrix(X)
probability
= sigmoid(X * theta.T)
return [1 if i > 0.5 else 0 for i in probability]
def gradientReg(theta, X, y, learnRate):
theta
= np.matrix(theta)
X
= np.matrix(X)
y
= np.matrix(y)
paramates
= int(theta.ravel().shape[1])
grad
= np.zeros(paramates)
grad
= (sigmoid(X * theta.T) - y).T * X / len(X) + (learnRate / len(X)) * theta[:, i]
grad[0]
= grad[0] - (learnRate / len(X)) * theta[:, i]
return grad
result
= opt.fmin_tnc(func=cost, x0=theta, fprime=gradientReg, args=(X, y, learnRate))
print(result)
theta_min
= np.matrix(result[0])
predictions
= predict(theta_min, X)
correct
= [1 if((a == 1 and b == 1) or(a == 0 and b == 0)) else 0 for(a, b) in zip(predictions, y)]
accuracy
= (sum(map(int, correct)) % len(correct))
print(accuracy = {0}%.format(accuracy))

 


推荐阅读
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • Android 渐变圆环加载控件实现
    本文介绍了如何在 Android 中创建一个自定义的渐变圆环加载控件,该控件已在多个知名应用中使用。我们将详细探讨其工作原理和实现方法。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • ImmutableX Poised to Pioneer Web3 Gaming Revolution
    ImmutableX is set to spearhead the evolution of Web3 gaming, with its innovative technologies and strategic partnerships driving significant advancements in the industry. ... [详细]
  • 利用决策树预测NBA比赛胜负的Python数据挖掘实践
    本文通过使用2013-14赛季NBA赛程与结果数据集以及2013年NBA排名数据,结合《Python数据挖掘入门与实践》一书中的方法,展示如何应用决策树算法进行比赛胜负预测。我们将详细讲解数据预处理、特征工程及模型评估等关键步骤。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
  • 尽管某些细分市场如WAN优化表现不佳,但全球运营商路由器和交换机市场持续增长。根据最新研究,该市场预计在2023年达到202亿美元的规模。 ... [详细]
  • 在金融和会计领域,准确无误地填写票据和结算凭证至关重要。这些文件不仅是支付结算和现金收付的重要依据,还直接关系到交易的安全性和准确性。本文介绍了一种使用C语言实现小写金额转换为大写金额的方法,确保数据的标准化和规范化。 ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 使用Pandas高效读取SQL脚本中的数据
    本文详细介绍了如何利用Pandas直接读取和解析SQL脚本,提供了一种高效的数据处理方法。该方法适用于各种数据库导出的SQL脚本,并且能够显著提升数据导入的速度和效率。 ... [详细]
  • 探索如何使用公共数据集为您的编程项目提供动力。无论您是编程新手还是有经验的开发者,本文将为您提供实用建议和资源,帮助您启动并运行一个创新的数据驱动型项目。 ... [详细]
  • 本文介绍如何使用 Python 的 Pandas 库中 Series 对象的 round() 方法,对数值进行四舍五入处理。该方法在数据预处理和分析中非常有用。 ... [详细]
author-avatar
雪蝴蝶的诺言forever
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有