干草垛(Haystack)里找“`膝尖儿`(Kneedle)”: 算法复现

news2025/1/11 14:05:41

干草垛(Haystack)里找“膝尖儿(Kneedle)”: 算法复现

缘起

  • 引用:

    Finding a “Kneedle” in a Haystack: Detecting Knee Points in System Behavior Ville Satopa † , Jeannie Albrecht† , David Irwin‡ , and Barath Raghavan§ †Williams College, Williamstown, MA ‡University of Massachusetts Amherst, Amherst, MA § International Computer Science Institute, Berkeley, CA

  • 续上: 干草垛(Haystack)里找“膝尖儿(Kneedle)”:侦测膝点的系统

原文 图二: 粗图


def figure2():
    x = np.linspace(0.0, 1, 10)
    with np.errstate(divide='ignore'):
        return x,np.true_divide(-1, x + 0.1) + 5
x,y = figure2()
plt.plot(x,y)

在这里插入图片描述

粗图: y = − 1 x + 0.1 + 5 y = \frac{-1}{x+0.1}+5 y=x+0.11+5

Step_1: 拟合条样曲线

from scipy.interpolate import interp1d # 用于插值的函数

N = len(x)

# Ds = 有限集合, 用于定义平滑曲线的x和y值, 该曲线已拟合平滑样条

uspline = interp1d(x, y) # 用x和y拟合样条曲线
Ds_y = uspline(x) # 样条曲线的y值

plt.plot(x, Ds_y);

在这里插入图片描述

拟合曲线

Step_2 曲线归一

def normalize(a):
    """返回归一化的array--`a`
    """
    return (a - min(a)) / (max(a) - min(a)) # 归一化, 使得a的最小值为0, 最大值为1
# x和y被归一到1x1的正方形中
x_normalized = normalize(x)
y_normalized = normalize(Ds_y)

Step_3 计算差异曲线

y_difference = y_normalized - x_normalized
x_difference = x_normalized.copy()

plt.title("Normalized spline & difference curve");
plt.plot(x_normalized, y_normalized);
plt.plot(x_difference, y_difference);

在这里插入图片描述

归一和差异曲线

Step_4 识别差异曲线的局部最大值

from scipy.signal import argrelextrema # 寻找局部最大值和最小值的函数

# 膝点是曲线中的局部最大值
maxima_indices = argrelextrema(y_difference, np.greater)[0] # 返回局部最大值的索引
x_difference_maxima = x_difference[maxima_indices] # 局部最大值的x值
y_difference_maxima = y_difference[maxima_indices] # 局部最大值的y值

# 局部最小值
minima_indices = argrelextrema(y_difference, np.less)[0]
x_difference_minima = x_difference[minima_indices]
y_difference_minima = y_difference[minima_indices]

plt.title("local maxima in difference curve");
plt.plot(x_normalized, y_normalized);
plt.plot(x_difference, y_difference);
plt.hlines(y_difference_maxima, plt.xlim()[0], plt.xlim()[1]);

在这里插入图片描述

差异曲线局部最大值

Step_5 算阈值


# 敏感度参数`S`, 值越小, 膝点越快被检测到
S = 1.0

Tmx = y_difference_maxima \
    - (S * np.abs(np.diff(x_normalized).mean())) # 局部最大的阈值=局部最大值-x的平均差值*`S`

Step_6 找膝尖儿算法


"""
若差值曲线中的任何差值(xdj,ydj),其中j > i,
在下一个局部最大值被达到之前,下降到阈值y = T | mxi
对于(x | mxi,y | mxi),`
膝尖儿`在相应的x值处声明膝盖x = x | xi。
**如果差值达到局部最小值并在y = T | mxi之前开始增加,则将阈值值重置为0,并等待
达到另一个局部最大值。**

"""
# 人为地在x_difference数组的最后一项处放置局部最大值和局部最小值
maxima_indices = np.append(maxima_indices, len(x_difference) - 1)
minima_indices = np.append(minima_indices, len(x_difference) - 1)

# 阈值区域i所在的占位符。
maxima_threshold_index = 0
minima_threshold_index = 0

curve = 'concave'
direction = 'increasing'

all_knees = set() # 所有膝点的集合
all_norm_knees = set() # 所有归一化膝点的集合

# 遍历差分曲线
for idx, i in enumerate(x_difference):

    # 到达曲线的尽头
    if i == 1.0:
        break

    if idx >= maxima_indices[maxima_threshold_index]:
        threshold = Tmx[maxima_threshold_index]
        threshold_index = idx
        maxima_threshold_index += 1

    # 差值曲线中的值处于局部最小值或之后
    if idx >= minima_indices[minima_threshold_index]:
        threshold = 0.0
        minima_threshold_index += 1

    # 不要在第一个局部最大值之前评估差异曲线中的值。
    if idx < maxima_indices[0]:
        continue

    # 评估阈值
    if y_difference[idx] < threshold:
        if curve == 'convex':
            if direction == 'decreasing':
                knee = x[threshold_index]
                all_knees.add(knee)
                norm_knee = x_normalized[threshold_index]
                all_norm_knees.add(norm_knee)
            else:
                knee = x[-(threshold_index + 1)]
                all_knees.add(knee)
                norm_knee = x_normalized[-(threshold_index + 1)]
                all_norm_knees.add(norm_knee)

        elif curve == 'concave':
            if direction == 'decreasing':
                knee = x[-(threshold_index + 1)]
                all_knees.add(knee)
                norm_knee = x_normalized[-(threshold_index + 1)]
                all_norm_knees.add(norm_knee)
            else:
                knee = x[threshold_index]
                all_knees.add(knee)
                norm_knee = x_normalized[threshold_index]
                all_norm_knees.add(norm_knee)
#%%
plt.xticks(np.arange(0,1.1,0.1))
plt.plot(x_normalized, y_normalized);
plt.plot(x_difference, y_difference);
plt.plot(all_norm_knees, y_normalized, 'o');
plt.hlines(Tmx[0], plt.xlim()[0], plt.xlim()[1], colors='g', linestyles='dashed');
plt.vlines(x_difference_maxima, plt.ylim()[0], plt.ylim()[1], colors='r', linestyles='dashed');

在这里插入图片描述

垂直的红色虚线表示拐点的x值。水平的绿色虚线表示阈值。

理解和不解:

原文 里面写了好多个公式, 代码却这么简单(当然也有一些不解)

  • 具体到算法无非是归一后, 再归一, 也就是说–先将x和y归一, 再将y-x…
  • 原文里面的那些公式呢?代码里面没体现呀…
  • 就这些吧…搬过来将就用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/844998.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Connection reset原因分析及解决思路

Connection reset原因分析及解决思路 我们在开发过程中经常会出现Connection reset问题&#xff0c;包括http调用&#xff0c;数据库连接等场景。出现Connection reset的原因很多&#xff0c;本文从tcp层面简单介绍下Connection reset出现的原因和问题&#xff0c;以及在实际开…

AJAX-笔记(持续更新中)

文章目录 Day1 Ajax入门1.AJAX概念和axios的使用2. 认识URL3.URL的查询参数4.常用的请求方法和数据提交5.HTTP协议-报文6.接口文档7.form-serialize插件8.案例用户登录 Day2 Ajax综合案bootstrap弹框图书管理图片上传更换背景个人信息设置 Day3 AJAX原理XMLHttpRequestPromise封…

【雕爷学编程】Arduino动手做(193)---移远 BC20 NB+GNSS模块7

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#x…

springboot集成分布式任务调度系统xxl-job(调度器和执行器)

一、部署xxl-job服务端 下载xxl-job源码 下载地址&#xff1a; https://gitee.com/xuxueli0323/xxl-job 二、导入项目、创建xxl_job数据库、修改配置文件为自己的数据库 三、启动项目、访问首页 访问地址&#xff1a; http://localhost:8080/xxl-job-admin/ 账号&#xff1…

IO进程线程day9(2023.8.7)

一、Xmind整理&#xff1a; 消息队列的原理&#xff1a; 共享内存的原理&#xff1a; 二、课上练习&#xff1a; 练习1&#xff1a;用信号的方式回收僵尸进程&#xff08;重点&#xff01;&#xff09; 1.子进程退出后&#xff0c;父进程会收到17)SIGCHLD信号。 2.父进程中捕获…

04-1_Qt 5.9 C++开发指南_常用界面设计组件_字符串QString

本章主要介绍Qt中的常用界面设计组件&#xff0c;因为更多的是涉及如何使用&#xff0c;因此会强调使用&#xff0c;也就是更多针对实例&#xff0c;而对于一些细节问题&#xff0c;需要参考《Qt5.9 c开发指南》进行学习。 文章目录 1. 字符串与普通转换、进制转换1.1 可视化U…

用i18n 实现vue2+element UI的国际化多语言切换详细步骤及代码

一、i18n的安装 这个地方要注意自己的vue版本和i1n8的匹配程度&#xff0c;如果是vue2点几&#xff0c;记得安装i18n的8版本&#xff0c;不然会自动安装的最新版本&#xff0c;后面会报错哦&#xff0c;查询了下资料&#xff0c;好像最新版本是适配的vue3。 npm install vue-…

2023年天猫除湿器行业数据分析(天猫数据分析软件)

除湿器是小家电的一种&#xff0c;随着人们生活品质的提升及健康意识的增强&#xff0c;人们对于除湿产品的观念也在不断改变&#xff0c;除湿器这一小家电也走入了越来越多消费者的家中。特别是在南方地区&#xff0c;全年的空气湿度都处于较高的水平&#xff0c;尤其是回南天…

PHP最简单自定义自己的框架创建目录结构(二)

1、mvc目录结构 2、目录解释 KJ&#xff1a;项目名称 core&#xff1a;框架核心目录 KJ.php 框架运行入口 index: 框架模块 controller:模块控制器 model:模块模型数据库操作 view:页面显示html index.php:index模块框架入口 3、index.php框架入口文件引入框架 <?php r…

FPGA学习——Altera IP核调用之PLL篇

文章目录 一、IP核1.1 IP核简介1.2 FPGA中IP核的分类1.3 IP核的缺陷 二、PLL简介2.1 什么是PLL2.2 PLL结构图2.3 C4开发板上PLL的位置 三、IP核调用步骤四、编写测试代码五、总结 一、IP核 1.1 IP核简介 IP核&#xff08;知识产权核&#xff09;&#xff0c;是在集成电路的可…

ReSharper C++ 2023 Crack

ReSharper C 2023 Crack ReSharper的AI助手会考虑项目中使用的语言和技术。这种上下文感知可以一开始就调整其响应&#xff0c;为您节省时间和精力。 您可以在查询中包含部分源代码。ReSharper将检测你发送或粘贴到聊天中的代码&#xff0c;并正确格式化&#xff0c;而人工智能…

Redis 加入服务列表自启动

1、下载reids windows版本&#xff0c;选择zip格式下载 2、解压zip&#xff0c;并进入路径&#xff1b; 3、命令提示符&#xff08;cmd&#xff09; 进入解压后的路径后&#xff0c;输入指令&#xff1a;redis-server --service-install redis.windows.conf&#xff1b; 4、如…

Gumbel-Softmax简介

一、Gumbel Softmax trick的使用场景 1. argmax简介 在NLP领域的强化学习或者对抗学习中&#xff0c;token的生成是离散的。比如&#xff0c;一个token的产生是一个大小为vocab size的one-hot向量。比如&#xff0c;对于character level的token&#xff1a; [ 1 , 0 , 0 , 0 …

阻抗是什么?什么时候要考虑阻抗匹配?

在电路设计中&#xff0c;我们常常碰到跟阻抗有关的问题&#xff0c;那么到底什么是阻抗&#xff1f; 在具有电阻、电感和电容的电路里&#xff0c;对电路中电流所起的阻碍作用叫做阻抗。常用Z来表示&#xff0c;它的值由交流电的频率、电阻R、电感L、电容C相互作用来决定。由…

Mybatis异常Invalid bound statement (not found)原因之Mapper文件配置不匹配

模拟登录操作 $.post("/admin/login", {aname, pwd }, rt > {if (rt.code 200) {location.href "manager/index.html";return;}alert(rt.msg)});网页提示服务器代码错误 POST http://localhost:8888/admin/login 500后端显示无法找到Mapper中对应的…

ros tf

欢迎访问我的博客首页。 tf 1. tf 命令行工具1.1 发布 tf1.2 查看 tf 2.参考 1. tf 命令行工具 1.1 发布 tf 我们根据 cartographer_ros 的 launch 文件 backpack_2d.launch 写一个 tf.launch&#xff0c;并使用命令 roslaunch cartographer_ros tf.launch 启动。该 launch 文件…

wpf 项目中使用 Prism + MaterialDesign

1.通过nuget安装MaterialDesign 2.通过nuget安装Prism 3.修改App.xmal <prism:PrismApplication x:Class"VisionMeasureGlue.App"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/…

简单易懂的Transformer学习笔记

1. 整体概述 2. Encoder 2.1 Embedding 2.2 位置编码 2.2.1 为什么需要位置编码 2.2.2 位置编码公式 2.2.3 为什么位置编码可行 2.3 注意力机制 2.3.1 基本注意力机制 2.3.2 在Trm中是如何操作的 2.3.3 多头注意力机制 2.4 残差网络 2.5 Batch Normal & Layer Narmal 2.…

C++入门篇5---模板

相信大家都遇到过这么一种情况&#xff0c;为了满足不同类型的需求&#xff0c;我们要写多个功能相同&#xff0c;参数类型不同的代码&#xff0c;为此&#xff0c;C引入了泛型编程这一概念&#xff0c;而模板就是实现泛型编程的基础&#xff0c;其实本质就是我们写一个类似”模…

JVM、JRE、JDK三者之间的关系

JVM、JRE和JDK是与Java开发和运行相关的三个重要概念。 再了解三者之前让我们先来了解下java源文件的执行顺序&#xff1a; 使用编辑器或IDE(集成开发环境)编写Java源文件.即demo.java程序必须编译为字节码文件&#xff0c;javac(Java编译器)编译源文件为demo.class文件.类文…