Roger 2024-03-20T06:59:46+00:00 kejinlu@gmail.com 一篇文章教你学会如何区分准确率、精准率、召回率,F1分值以及它们的含义 2024-03-19T00:00:00+00:00 Roger https://tjroger.github.io/2024/03/一篇文章教你学会如何区分准确率、精准率、召回率,以及它们的含义 ##内容
准确率(Accuracy),精准率(Precision)和召回率(Recall)是分类问题中常用的三个评估指标。

准确率:指分类正确的样本数占总样本数的比例,包括真正例(TP)和真负例(TN)。准确率适用于类别平衡的情况,即正例和负例数量相当。

精准率:指预测为正例的样本中真正的正例比例,即真正例(TP)占所有预测为正例(TP+FP)的比例。精准率关注的是预测为正例的准确性。

召回率:指实际正例中被预测为正例的比例,即真正例(TP)占所有实际正例(TP+FN)的比例。召回率关注的是预测正例的覆盖度。

这三个指标之间存在一定的关系:提高精准率可能会降低召回率,反之亦然。因此,在实际应用中,需要根据具体需求来权衡这三个指标,以达到最佳的分类效果。

F1 Score/F-Measure是一个统计学中用来衡量二分类模型精确度的指标,同时兼顾了分类模型的准确率和召回率。

TP(True Positive, 真阳性):算法预测为正例(P),实际上也是正例(P)的个数,即算法预测对了(True)。
TN(True Negtive,真阴性):算法预测为负例(N),实际上也是负例(N)的个数,即算法预测对了(True)。
FP(False Positive,假阳性):算法预测为正例(P),实际上是负例(N)的个数,即算法预测错了(False)这里指的是:实际为负例但被分类器划分为正例的实例数。
FN(False Negtive,假阴性):算法预测为负例(N),实际上是正例(P)的个数,即算法预测错了(False)这里指的是:即实际为正例但被分类器划分为负例的实例数
Accuracy = (TP+TN)/(TP+FP+TN+FN)
Precision = TP / (TP+FP)
Recall = TP / (TP + FN)
F1 = 2 * (precision * recall) / (precision + recall)


]]>
一篇文章告诉你怎么使用Shell执行Python脚本内的某个函数(附定时任务攻略) 2024-03-14T00:00:00+00:00 Roger https://tjroger.github.io/2024/03/一篇文章告诉你怎么使用Shell执行Python脚本内的某个函数(附定时任务攻略) 问题

在自建汇率监控工具箱时遇到一个问题,定时任务要怎么根据不同场景调用同一个Python脚本不同的方法

解决过程

分成两步,如果能在Shell调用Python脚本的指定方法,那不就简单了么

第一步、于是在万能的互联网上先搜索,怎么在Shell调用Python

找到了shell执行python某个函数 这篇文章,它详细地介绍了使用inspect和importlib来实现调用某个方法的方法

import inspect
import importlib

def is_valid_function(module, function_name):
    if not hasattr(module, function_name):
        return False
    func = getattr(module, function_name)
    return inspect.isfunction(func)

def import_module(module_name):
    return importlib.import_module(module_name)

def call_function(module, function_name):
    func = getattr(module, function_name)
    return func()

def print_result(result):
    print(result)

if __name__ == "__main__":
    # 步骤1:输入函数名
    function_name = input("请输入要执行的函数名: ")

    # 步骤2:检查函数名的有效性
    module = import_module("your_module")  # 替换为你的模块名
    if not is_valid_function(module, function_name):
        print("函数名无效,请重新输入。")
        exit(1)

    # 步骤4:调用相应的函数
    result = call_function(module, function_name)

    # 步骤5:输出结果
    print_result(result)

上面是原实现,call_function可以再优化一下添加参数

def call_function(module, function_name, *args, **kwargs):
    func = getattr(module, function_name)
    return func(*args, **kwargs)

使用shell脚本直接调用上述脚本就可以间接实现调用Python脚本内某个函数了 #####终极方法 上述解决方案还需要额外写一个脚本,感觉一点不geek,于是继续寻找,最后找到了python -c 这个命令,它可以直接运行Python命令,于是

python -c "from your_module import your_function; your_function()"

完美实现shell运行Python脚本内的某个方法。 ####第二步定时任务调度crontab 大名鼎鼎的crontab大家应该都知道吧

30 * * * * cd /home/work/Liana/monitor && /usr/bin/python3 money.py 1 >> ~/.crontab.log 2>&1
30 08 * * * cd /home/work/Liana/monitor && /usr/bin/python3 -c 'from money import get_jpy_cny_rate; get_jpy_cny_rate(True)' 1 >> ~/.crontab.log 2>&1

这是我的生产环境部署的两条命令,就不详细介绍了。 完结,撒花


]]>
如何根据UUID确定dSYM文件 2021-07-12T00:00:00+00:00 Roger https://tjroger.github.io/2021/07/如何根据UUID确定DSYM文件 如何根据UUID确定dSYM文件

何为dSYM

dSYM是一个ELF(Executable and Linkable Format)文件,它包含了应用的DWARF(debugging with attributed record formats)调试信息。

  • 使用dSYM可以为崩溃分析提供源代码级别查阅。包含行号和源文件名等信息
  • dSYM必须和app一致,每次打包生成的都不一样。
  • 符号和app分离,增加逆向难度,减小app大小

计算dSYM的UUID

使用命令dwarfdump -u **.dSYM可以将UUID计算出来,将对应的dSYM上传到Crashlytics或者Bugly就可以还原出崩溃现场,轻松定位bug


]]>
如何给Swift Package Manager项目添加资源 2021-07-10T00:00:00+00:00 Roger https://tjroger.github.io/2021/07/如何给SPM添加资源 如何给Swift Package Manager项目添加资源

起因

在学习Image and Video Processing课程过程中,第一周的课程附加练习是实现一些图片的基础处理。 课程中推荐使用Matlab来实现,作为半个iOS开发者想使用Swift来实现,正好之前有了解到GPUImage和SPM,于是产生了借用GPUImage来在SPM中实现课程挑战的目标。

过程

背景

swift 5.3中引入了resource bundle概念,在target中添加resources可以引入。

创建项目

swift package init --type executable创建项目后始终无法引入资源

添加资源

.executableTarget(
            name: "gpuimageDemo",
            dependencies: [
            "GPUImage"
            ],
            resources: [
            .copy("Resources/Images/WID-small.jpg"),
            ]),

在参考了How to Add Resources in Swift Package Manager后仍然无法导入 最后在查看官网说明时发现需要没有将文件放入target目录下

引用资源

let imageUrl = Bundle.module.url(forResource: "WID-small", withExtension: "jpg")

最终目录结构

.
├── Package.resolved
├── Package.swift
├── README.md
├── Sources
│   └── gpuimageDemo
│       ├── NSImage.swift
│       ├── Resources
│       │   └── Images
│       │       └── WID-small.jpg
│       └── main.swift
└── Tests
    └── gpuimageTests
        └── gpuimageTests.swift

小结

  1. 资源必须放到target所在目录下
  2. 资源处理方式有.copy和.process。copy会直接拷贝,保存目录结构;process可能会对资源进行优化,优先使用

参考项目

@TJRoger/ImageProcessing

参考链接

  1. How to Add Resources in Swift Package Manager
  2. Bundling Resources with a Swift Package

扩展


]]>
thinkPHP在lnmp环境中的open_basedir问题解决 2021-06-30T00:00:00+00:00 Roger https://tjroger.github.io/2021/06/thinkphp_with_lnmp 问题描述

在部署php项目时报错,环境lnmp1.8, php7.4.19 require(): open_basedir restriction in effect. File(<path>/thinkphp/base.php) is not within the allowed path(s)

解决

查阅文档得知open_basedir是用来对PHP可以访问的目录进行限制的选项,默认php.ini设置为空。lnmp会开启跨目录保护的选项,设置在fastcgi.cnf中fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/"; 通常在thinkPHP项目中会设置document_root为项目的public子目录,这样就导致上一级目录thinkphp中的base.php无法访问了。

方法一

最直接简单粗暴的方法就是将open_basedir注释掉,但这么操作太粗糙了,不值得记录。

方法二

我们可以将$document_root上一级的权限开放,配置改成 fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/../:/tmp/:/proc/"; 这是安全性中性的一种做法。

方法三

将public下的index.php移动到上级目录, 然后在nginx配置将root指向这个项目的根目录即可。下面给出一个index.php的范例

<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------

// [ 应用入口文件 ]
define('APP_DEBUG', true);
// 定义应用目录
define('APP_PATH', __DIR__ . '/application/');
//定义配置文件目录
define('CONF_PATH', __DIR__ . '/conf/');
// 加载框架引导文件
require __DIR__ . '/thinkphp/start.php';

这是最安全的做法,推荐 —-

]]>
Go sFTP 2020-11-05T00:00:00+00:00 Roger https://tjroger.github.io/2020/11/go-sftp Go sFTP is an efficient tool for you to access your sFTP servers.

It’s small, fast, stable with a low price. You can easily upload and download files with it.

  • Full sFTP protocol support
  • RSA key auth support
  • Upload/Download/Delete
  • Securely stored connections
  • Simple UI, easy use, full functions
  • Super-fast transfer

And much more to find out, enjoy yourself!


]]>
国内使用Homebrew加速 2020-05-05T00:00:00+00:00 Roger https://tjroger.github.io/2020/05/speedup_brew brew

brew全称homebrew,可以说是目前MacOS上最好用的包管理工具,没有之一。类似于apt-getyum。由于种种原因在国内使用原版源速度会较慢,这是一个痛点,今天我们就来干掉它。

前言

请在运行 brew 前设置环境变量 HOMEBREW_BOTTLE_DOMAIN ,值为 https://mirrors.ustc.edu.cn/homebrew-bottles

对于 bash 用户:

echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles' >> ~/.bash_profile
source ~/.bash_profile

对于 zsh 用户:

echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles' >> ~/.zshrc
source ~/.zshrc

替换brew.git

替换USTC镜像:

cd "$(brew --repo)"
git remote set-url origin https://mirrors.ustc.edu.cn/brew.git

重置为官方地址:

cd "$(brew --repo)"
git remote set-url origin https://github.com/Homebrew/brew.git

替换homebrew-core.git

cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core"
git remote set-url origin https://mirrors.ustc.edu.cn/homebrew-core.git

替换homebrew-cask.git

cd "$(brew --repo)/Library/Taps/homebrew/homebrew-cask"
git remote set-url origin https://mirrors.ustc.edu.cn/homebrew-cask.git

参考

  1. mirrors
  2. bottles

]]>
Go Morse 2020-04-15T00:00:00+00:00 Roger https://tjroger.github.io/2020/04/Go_Morse
Go Morse is a small tool for turnning your ideas into morse, and speak it loudly.

Version history


v1.0, at 2020-04-14

  • text to morse translation
  • morse audio playing
  • dark mode optimized

About me


]]>
Sublime Text 3 License 2020-04-07T00:00:00+00:00 Roger https://tjroger.github.io/2020/04/Sublime_Text_3_3211License Reference

origin
It’s only for test. Please use copyright edition for your business. Thanks.

Host

add these dns record to your host file

127.0.0.1 www.sublimetext.com
127.0.0.1 sublimetext.com
127.0.0.1 sublimehq.com
127.0.0.1 license.sublimehq.com
127.0.0.1 45.55.255.55
127.0.0.1 45.55.41.223
0.0.0.0 license.sublimehq.com
0.0.0.0 45.55.255.55
0.0.0.0 45.55.41.223

License

----- BEGIN LICENSE -----
Member J2TeaM
Single User License
EA7E-1011316
D7DA350E 1B8B0760 972F8B60 F3E64036
B9B4E234 F356F38F 0AD1E3B7 0E9C5FAD
FA0A2ABE 25F65BD8 D51458E5 3923CE80
87428428 79079A01 AA69F319 A1AF29A4
A684C2DC 0B1583D4 19CBD290 217618CD
5653E0A0 BACE3948 BB2EE45E 422D2C87
DD9AF44B 99C49590 D2DBDEE1 75860FD2
8C8BB2AD B2ECE5A4 EFC08AF2 25A9B864
------ END LICENSE ------

]]>
Sponsor Page 2020-03-04T00:00:00+00:00 Roger https://tjroger.github.io/2020/03/Sponsor Payal

https://paypal.me/rgrl

Alipay & Wechat

https://qr.alipay.com/fkx01415pstmgpnmlqi7a88


]]>