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

LogisticRegression实现与解析

本文详细介绍了使用NumPy和TensorFlow实现的逻辑回归算法。通过具体代码示例,解释了数据加载、模型训练及分类预测的过程。

NumPy 实现逻辑回归

# -*- coding: utf-8 -*-
"""
创建时间:2014年12月09日 21:54:00
作者:wepon
功能描述:
- loadData 函数从指定目录加载所有文件,将32x32图像转换为1x1024的一维向量,返回m个样本的1024维矩阵及对应标签。
- sigmoid 函数实现Sigmoid激活函数。
- gradAscent 函数使用梯度下降法求解回归系数。
- classfy 函数基于回归系数对新样本进行分类。
"""
#!/usr/bin/python
import numpy as np
from os import listdir

def loadData(directory):
fileList = listdir(directory) # 获取目录下的所有文件名
numFiles = len(fileList) # 文件数量
dataMatrix = np.zeros((numFiles, 1024)) # 初始化数据矩阵
labels = np.zeros((numFiles, 1)) # 初始化标签数组
for index in range(numFiles):
featureVector = np.zeros((1, 1024)) # 单个文件的特征向量
fileName = fileList[index]
with open(f'{directory}/{fileName}') as file:
for row in range(32):
line = file.readline().strip()
for col in range(32):
featureVector[0, 32*row + col] = int(line[col]) # 将32x32的数字矩阵转换为1x1024的向量
dataMatrix[index, :] = featureVector # 存储特征向量
label = int(fileName.split('_')[0]) # 解析文件名获取标签
labels[index] = label # 存储标签
return dataMatrix, labels

def sigmoid(inputX):
return 1.0 / (1 + np.exp(-inputX)) # Sigmoid函数实现

def gradientAscent(dataMatrix, labels, alpha=0.01, maxCycles=500):
dataMatrix = np.mat(dataMatrix)
labelMatrix = np.mat(labels).transpose()
m, n = np.shape(dataMatrix)
weights = np.ones((n, 1))
for cycle in range(maxCycles):
h = sigmoid(dataMatrix * weights)
error = labelMatrix - h
weights += alpha * dataMatrix.transpose() * error # 更新权重
return weights

def classify(testDirectory, weights):
testData, testLabels = loadData(testDirectory)
testDataMatrix = np.mat(testData)
testLabelMatrix = np.mat(testLabels).transpose()
predictiOns= sigmoid(testDataMatrix * weights)
m = len(predictions)
errorCount = 0
for i in range(m):
if predictions[i] > 0.5:
print(f'预测结果: 1, 实际标签: {testLabelMatrix[i][0]}')
if testLabelMatrix[i][0] != 1:
errorCount += 1
else:
print(f'预测结果: 0, 实际标签: {testLabelMatrix[i][0]}')
if testLabelMatrix[i][0] != 0:
errorCount += 1
print(f'错误率: {errorCount / m:.4f}')

def digitRecognition(trainingDirectory, testingDirectory, alpha=0.01, maxCycles=500):
trainingData, trainingLabels = loadData(trainingDirectory)
weights = gradientAscent(trainingData, trainingLabels, alpha, maxCycles)
classify(testingDirectory, weights)

# 示例调用
trainingPath = 'path_to_training_data'
testingPath = 'path_to_testing_data'
digitRecognition(trainingPath, testingPath, alpha=0.01, maxCycles=500)


TensorFlow 实现逻辑回归

import tensorflow as tf
# 导入MNIST数据
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('MNIST_data', one_hot=True)
# 参数设置
learningRate = 0.01
epochs = 25
batchSize = 100
displayStep = 1
# 输入占位符
x = tf.placeholder(tf.float32, [None, 784]) # MNIST图像数据,形状为28*28=784
y = tf.placeholder(tf.float32, [None, 10]) # 0-9数字识别,共10类
# 定义模型参数
weights = tf.Variable(tf.zeros([784, 10]))
bias = tf.Variable(tf.zeros([10]))
# 构建模型
predictiOns= tf.nn.softmax(tf.matmul(x, weights) + bias) # 使用Softmax函数作为激活函数
# 定义损失函数和优化器
loss = tf.reduce_mean(-tf.reduce_sum(y * tf.log(predictions), reduction_indices=[1])) # 交叉熵损失
optimizer = tf.train.GradientDescentOptimizer(learningRate).minimize(loss) # 梯度下降优化器
# 初始化变量
init = tf.global_variables_initializer()
# 开始训练
with tf.Session() as session:
session.run(init)
for epoch in range(epochs):
avgLoss = 0.
totalBatches = int(mnist.train.num_examples / batchSize)
for batchIndex in range(totalBatches):
batchX, batchY = mnist.train.next_batch(batchSize)
_, currentLoss = session.run([optimizer, loss], feed_dict={x: batchX, y: batchY})
avgLoss += currentLoss / totalBatches
if (epoch + 1) % displayStep == 0:
print(f'Epoch: {epoch + 1}, Loss: {avgLoss:.9f}')
print('优化完成!')
# 测试模型准确性
correctPredictiOns= tf.equal(tf.argmax(predictions, 1), tf.argmax(y, 1))
accuracy = tf.reduce_mean(tf.cast(correctPredictions, tf.float32))
print(f'准确率: {accuracy.eval({x: mnist.test.images[:3000], y: mnist.test.labels[:3000]})}')


推荐阅读
  • 毕业设计:基于机器学习与深度学习的垃圾邮件(短信)分类算法实现
    本文详细介绍了如何使用机器学习和深度学习技术对垃圾邮件和短信进行分类。内容涵盖从数据集介绍、预处理、特征提取到模型训练与评估的完整流程,并提供了具体的代码示例和实验结果。 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 本文介绍了如何使用JQuery实现省市二级联动和表单验证。首先,通过change事件监听用户选择的省份,并动态加载对应的城市列表。其次,详细讲解了使用Validation插件进行表单验证的方法,包括内置规则、自定义规则及实时验证功能。 ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
  • 深入理解Tornado模板系统
    本文详细介绍了Tornado框架中模板系统的使用方法。Tornado自带的轻量级、高效且灵活的模板语言位于tornado.template模块,支持嵌入Python代码片段,帮助开发者快速构建动态网页。 ... [详细]
  • 主要用了2个类来实现的,话不多说,直接看运行结果,然后在奉上源代码1.Index.javaimportjava.awt.Color;im ... [详细]
  • 本文介绍了在安装或运行 Python 项目时遇到的 'ModuleNotFoundError: No module named setuptools_rust' 错误,并提供了解决方案。 ... [详细]
  • CentOS7源码编译安装MySQL5.6
    2019独角兽企业重金招聘Python工程师标准一、先在cmake官网下个最新的cmake源码包cmake官网:https:www.cmake.org如此时最新 ... [详细]
  • 构建基于BERT的中文NL2SQL模型:一个简明的基准
    本文探讨了将自然语言转换为SQL语句(NL2SQL)的任务,这是人工智能领域中一项非常实用的研究方向。文章介绍了笔者在公司举办的首届中文NL2SQL挑战赛中的实践,该比赛提供了金融和通用领域的表格数据,并标注了对应的自然语言与SQL语句对,旨在训练准确的NL2SQL模型。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • Android LED 数字字体的应用与实现
    本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ... [详细]
author-avatar
mobiledu2502926273
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有