热门标签 | 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()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • 使用Numpy实现无外部库依赖的双线性插值图像缩放
    本文介绍如何仅使用Numpy库,通过双线性插值方法实现图像的高效缩放,避免了对OpenCV等图像处理库的依赖。文中详细解释了算法原理,并提供了完整的代码示例。 ... [详细]
  • 本文介绍如何使用Objective-C结合dispatch库进行并发编程,以提高素数计数任务的效率。通过对比纯C代码与引入并发机制后的代码,展示dispatch库的强大功能。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • Android LED 数字字体的应用与实现
    本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 掌握远程执行Linux脚本和命令的技巧
    本文将详细介绍如何利用Python的Paramiko库实现远程执行Linux脚本和命令,帮助读者快速掌握这一实用技能。通过具体的示例和详尽的解释,让初学者也能轻松上手。 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • 本文介绍如何使用 Python 提取和替换 .docx 文件中的图片。.docx 文件本质上是压缩文件,通过解压可以访问其中的图片资源。此外,我们还将探讨使用第三方库 docx 的方法来简化这一过程。 ... [详细]
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社区 版权所有