C#,数值计算——用于从连续的数据值流估计任意分位数的计算方法与源程序

news2024/10/6 22:28:41

1 分位数Quantile

分位数(Quantile),亦称分位点,是指将一个随机变量的概率分布范围分为几个等份的数值点,常用的有中位数(即二分位数)、四分位数、百分位数等。

2 常见各类分位数

2.1 二分位数

对于有限的数集,可以通过把所有观察值高低排序后找出正中间的一个作为中位数。如果观察值有偶数个,则中位数不唯一,通常取最中间的两个数值的平均数作为中位数,即二分位数。
一个数集中最多有一半的数值小于中位数,也最多有一半的数值大于中位数。如果大于和小于中位数的数值个数均少于一半,那么数集中必有若干值等同于中位数。
计算有限个数的数据的二分位数的方法是:把所有的同类数据按照大小的顺序排列。如果数据的个数是奇数,则中间那个数据就是这群数据的中位数;如果数据的个数是偶数,则中间那2个数据的算术平均值就是这群数据的中位数。

2.2 四分位数

四分位数(Quartile)是统计学中分位数的一种,即把所有数值由小到大排列并分成四等份,处于三个分割点位置的数值就是四分位数。
1)第一四分位数(Q1),又称“较小四分位数”,等于该样本中所有数值由小到大排列后第25%的数字;
2)第二四分位数(Q2),又称“中位数”,等于该样本中所有数值由小到大排列后第50%的数字;
3)第三四分位数(Q3),又称“较大四分位数”,等于该样本中所有数值由小到大排列后第75%的数字。
第三四分位数与第一四分位数的差距又称四分位距。

2.3 百分位数

百分位数,统计学术语,如果将一组数据从小到大排序,并计算相应的累计百分位,则某一百分位所对应数据的值就称为这一百分位的百分位数。运用在教育统计学中,例如表现测验成绩时,称PR值。

3 分位数的应用

分位数回归思想的提出至今已经有近30多年了,经过这近30多年的发展,分位数回归在理论和方法上都越来越成熟,并被广泛应用于多种学科中。它对于实际问题能提供更加全面的分析,无论是线性模型还是非线性模型,分位数回归都是一种很好的工具,它对一般回归模型做了有益的补充。

分位数回归是对以古典条件均值模型为基础的最小二乘法的延伸,它用几个分位函数来估计整体模型。分位数回归法的特殊情况就是中位数回归(最小一乘回归),用对称权重解决残差最小化问题,而其他条件分位数回归则需要用非对称权重解决残差最小化 [2] 。

分位数回归采用加权残差绝对值之和的方法估计参数,其优点体现在以下几方面:首先,它对模型中的随机扰动项不需做任何分布的假定,这样整个回归模型就具有很强的稳健性;其次,分位数回归本身没有使用一个连接函数来描述因变量的均值和方差的相互关系,因此分位数回归有着比较好的弹性性质;第三,分位数回归由于是对所有分位数进行回归,因此对于数据中出现的异常点具有耐抗性;第四,不同于普通的最小二乘回归,分位数回归对于因变量具有单调变换性;最后,分位数回归估计出来的参数具有在大样本理论下的渐进优良性。

4 计算分位数的C#源程序

using System;

namespace Legalsoft.Truffer
{
    /// <summary>
    /// Object for estimating arbitrary quantile values 
    /// from a continuing stream of data values.
    /// </summary>
    public class IQagent
    {
        public const int nbuf = 1000;
        private int nq { get; set; }
        private int nt { get; set; }
        private int nd { get; set; }
        private double[] pval { get; set; }
        private double[] dbuf;
        private double[] qile { get; set; }
        private double q0 { get; set; }
        private double qm { get; set; }

        public IQagent()
        {
            this.nq = 251;
            this.nt = 0;
            this.nd = 0;
            this.pval = new double[nq];
            this.dbuf = new double[nbuf];
            this.qile = new double[nq];
            this.q0 = 1.0e99;
            this.qm = -1.0e99;

            for (int j = 85; j <= 165; j++)
            {
                pval[j] = (j - 75.0) / 100.0;
            }

            // Set general purpose array of p - values ranging from 1.0e-6 to 1~1.0e-6.
            // You can change this if you want.
            for (int j = 84; j >= 0; j--)
            {
                pval[j] = 0.87191909 * pval[j + 1];
                pval[250 - j] = 1.0 - pval[j];
            }
        }

        /// <summary>
        /// Assimilate a new value from the stream.
        /// </summary>
        /// <param name="datum"></param>
        public void add(double datum)
        {
            dbuf[nd++] = datum;
            if (datum < q0)
            {
                q0 = datum;
            }
            if (datum > qm)
            {
                qm = datum;
            }
            if (nd == nbuf)
            {
                update();
            }
        }

        /// <summary>
        /// Batch update.
        /// This function is called by add or report and should not be called directly
        /// by the user.
        /// </summary>
        public void update()
        {
            int jd = 0;
            int jq = 1;
            double told = 0.0;
            double tnew = 0.0;
            double[] newqile = new double[nq];

            Sorter.sort(dbuf, nd);

            double qold = q0;
            double qnew = q0;
            qile[0] = newqile[0] = q0;
            qile[nq - 1] = newqile[nq - 1] = qm;
            pval[0] = Math.Min(0.5 / (nt + nd), 0.5 * pval[1]);
            pval[nq - 1] = Math.Max(1.0 - 0.5 / (nt + nd), 0.5 * (1.0 + pval[nq - 2]));
            for (int iq = 1; iq < nq - 1; iq++)
            {
                double target = (nt + nd) * pval[iq];
                if (tnew < target)
                {
                    for (; ; )
                    {
                        if (jq < nq && (jd >= nd || qile[jq] < dbuf[jd]))
                        {
                            qnew = qile[jq];
                            tnew = jd + nt * pval[jq++];
                            if (tnew >= target)
                            {
                                break;
                            }
                        }
                        else
                        {
                            qnew = dbuf[jd];
                            tnew = told;
                            if (qile[jq] > qile[jq - 1])
                            {
                                tnew += nt * (pval[jq] - pval[jq - 1]) * (qnew - qold) / (qile[jq] - qile[jq - 1]);
                            }
                            jd++;
                            if (tnew >= target)
                            {
                                break;
                            }
                            told = tnew++;
                            qold = qnew;
                            if (tnew >= target)
                            {
                                break;
                            }
                        }
                        told = tnew;
                        qold = qnew;
                    }
                }
                //if (tnew == told)
                if (Math.Abs(tnew - told) <= float.Epsilon)
                {
                    newqile[iq] = 0.5 * (qold + qnew);
                }
                else
                {
                    newqile[iq] = qold + (qnew - qold) * (target - told) / (tnew - told);
                }
                told = tnew;
                qold = qnew;
            }
            // qile = newqile;
            qile = Globals.CopyFrom(newqile);
            nt += nd;
            nd = 0;
        }

        /// <summary>
        /// Return estimated p-quantile for 
        /// the data seen so far. (E.g., p D 0:5 for median.)
        /// </summary>
        /// <param name="p"></param>
        /// <returns></returns>
        public double report(double p)
        {
            if (nd > 0)
            {
                update();
            }
            int jl = 0;
            int jh = nq - 1;
            int j;
            while (jh - jl > 1)
            {
                j = (jh + jl) >> 1;
                if (p > pval[j])
                {
                    jl = j;
                }
                else
                {
                    jh = j;
                }
            }
            j = jl;
            double q = qile[j] + (qile[j + 1] - qile[j]) * (p - pval[j]) / (pval[j + 1] - pval[j]);
            return Math.Max(qile[0], Math.Min(qile[nq - 1], q));
        }
    }
}
 

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

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

相关文章

SQL SERVER ip地址改别名

SQL server在使用链接服务器时必须使用别名&#xff0c;使用ip地址就会把192.188.0.2这种点也解析出来 解决方案&#xff1a; 1、物理机ip 192.168.0.66 虚拟机ip 192.168.0.115 2、在虚拟机上找到 C:\Windows\System32\drivers\etc 下的 &#xff08;我选中的文件&a…

组合模式(C++)

定义 将对象组合成树形结构以表示部分-整体’的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性(稳定)。 应用场景 在软件在某些情况下&#xff0c;客户代码过多地依赖于对象容器复杂的内部实现结构&#xff0c;对象容器内部实现结构(而非抽象接口)的变化…

推荐一个OI的维基百科网站

推荐一个关于OI的维基百科网站&#xff1a; https://oi-wiki.org/ 链接: OI Wiki 这里面有很多关于竞赛的知识&#xff0c;还有各种讲解哦&#xff01;&#xff01;&#xff01; 当然&#xff0c;里面要是有什么看不懂的也可以问我哦&#xff01;&#xff01;&#xff01;

激光光束质量图像形状分析仪

随着激光技术在军事、农业、材料加工等领域内的广泛应用&#xff0c;不同领域对激光的特性要求也不相同&#xff0c;如何评价激光的质量也显得尤为重要。随着激光技术越来越成熟&#xff0c;激光开始在通信、军事、航天等领域内得到广泛应用。在军事领域中&#xff0c;如激光武…

mysql 数据库引擎介绍

一、数据库引擎 数据库引擎是用于存储、处理和保护数据的核心服务。利用数据库引擎可控制访问权限并快速处理事务&#xff0c;从而满足企业内大多数需要处理大量数据的应用程序的要求。 使用数据库引擎创建用于联机事务处理或联机分析处理数据的关系数据库。这包括创建用于存储…

FreeRTOS(STM32CubeMX)

FreeRTOS FreeRTOS介绍FreeRTOS主要特点什么时候用FreeRTOSSTM32CubeMX中如何使用FreeRTOSSTM32用FreeRTOS点灯 FreeRTOS介绍 FreeRTOS&#xff08;Real-Time Operating System&#xff09;是一款开源的实时操作系统内核&#xff0c;专为嵌入式系统和微控制器设计。它由Richard…

SpringBoot项目如何部署SSL证书 (JKS格式)

1、SpringBoot项目如何部署SSL证书 (JKS格式) 1. 获取 SSL 证书和私钥 首先&#xff0c;你需要获取有效的 SSL 证书和私钥。SSL 证书是一种用于加密通信的数字证书&#xff0c;它可以通过购买商业 SSL 证书或使用免费的 Let’s Encrypt 证书获得。请确保你拥有证书文件和与之…

TCP网络服务器设计

最近设计了一个网络服务器程序&#xff0c;对于4C8G的机器配置&#xff0c;TPS可以达到5W。业务处理逻辑是简单的字符串处理。服务器接收请求后对下游进行类似广播的发送。在此分享一下设计方式&#xff0c;如果有改进思路欢迎大家交流分享。 程序运行在CentOS7.9操作系统上&a…

2023巅峰极客比赛web复现

<1> unserialize(反序列化字符串逃逸) 下载 www.zip得到源码&#xff1a; my.php 存在 pull_it恶意类 反序列化时会执行 $this-x 这里有一层过滤 $this-x不能为字母数字 可以取反、异或绕过 下面来找一找怎么去触发反序列化 index.php 会对我们登录框输入的参数先…

CSP-J2019初赛试题客观题详解

1、中国的国家顶级域名是() A. .cn B. .ch C. .chn D. .China 【答案】A 【解析】 常见的顶级域名还有&#xff1a;.com表示商业机构&#xff1b;.org表示非盈利性组织&#xff1b;.net表示网络服务机构&#xff1b; .gov表示政府部门&#xff1b;.edu表示…

十三、ESP32PS2摇杆(ADC)

1. 运行效果 在上下左右操作PS2摇杆的时候,会检测到数据 2. 滑动电阻

Linux centos 常用命令 【持续更新】

一、查看文件信息 indoe和目录项 # df命令查看每个硬盘分区的inode总数和已经使用的数量 df -i# 查看inode的大学 xfs_growfs /dev/sda1|grep "isize"# 查看文件的indoe号码 ls -istat查看文件信息 # 文件的详细信息 stat anaconda-ks.cfg # -t参数是在一行内输出…

创建型模式-工厂模式

文章目录 一、工厂模式1. 简单工厂模式1.1 结构1.2 实现1.3 优缺点1.4 扩展-静态工厂 2. 工厂方法模式2.1 概念2.2 结构2.3 实现2.4 优缺点 3. 抽象工厂模式3.1 概念3.2 结构3.3 实现3.4 优缺点3.5 使用场景 4. 工厂模式扩展4.1 简单工厂配置文件解除耦合 5. JDK源码解析-Colle…

软件架构师思维塑造

一、软件系统设计的六项原则 1、单一职责原则&#xff08;Single Responsibility Principle&#xff09; 2、开闭原则&#xff08;Open Closed Principle&#xff09; 3、里氏替换原则&#xff08;Liskov Substitution Principle&#xff09; 4、迪米特法则&#xff08;Law of …

图数据库使用及业务场景

一. 前言 来学习下图数据以及图数据库 二. 图数据库的简单原理 2.1 图数据 我认为图数据结构就是点线面的关系&#xff0c;图大致分为以下概念 &#xff1a; 节点 &#xff1a; 图中的基本元素&#xff0c;可以用来表示现实世界中的一个**实体 **边 &#xff1a; 节点之间…

接口自动化测试Mock Get和Post请求

Mock可以模拟一个http接口的后台响应&#xff0c;可以模拟request&#xff0c;response 下载 moco-runner-0.11.0-standalone.jar 下载链接: https://pan.baidu.com/s/1bmFzvJPRnDlQ-cmuJ_3iRg 提取码: kpjv 确保安装了jdk,cmd下可以运行java -version 一、模拟不带参的get请求…

恶意软件和反病毒

1. 什么是恶意软件&#xff1f; 恶意软件&#xff08;Malware&#xff09;是指以恶意目的而设计和开发的计算机软件。恶意软件的目标是在未经授权或知情的情况下入侵用户的计算机系统、窃取敏感信息、破坏系统功能或进行其他有害活动。恶意软件可以采取多种形式&#x…

VUE vue天气预报 高德接口 和风天气

方法一: 高德天气 1、引入axios import axios from "axios"; 2、 发生请求 getWeatherData() {let url https://restapi.amap.com/v3/weather/weatherInfo?city杨浦区&keyd77b4c08b2718e4e06def82570d3e834&extensionsbase;axios.get(url).then(res >…

Windows下安装Sqoop

Windows下安装Sqoop 一、Sqoop简介二、Sqoop安装2.1、Sqoop官网下载2.2、Sqoop网盘下载2.3、Sqoop安装&#xff08;以version&#xff1a;1.4.7为例&#xff09;2.3.1、解压安装包到 D:\bigdata\sqoop\1.4.7 目录2.3.2、新增环境变量 SQOOP_HOME2.3.3、环境变量 Path 添加 %SQO…

【统计学精要】:使用 Python 实现的统计检验— 1/10

一、介绍 欢迎来到“掌握 Python 统计测试&#xff1a;综合指南”&#xff0c;它将介绍本手册中您需要熟悉使用 Python 的所有基本统计测试和分析方法。本文将为您提供统计测试及其应用的全面介绍&#xff0c;无论您是新手还是经验丰富的数据科学家。 使用来自现实世界的实际示…