百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

模拟360开机时长统计:正态分布与排名计算

ztj100 2025-01-05 01:00 13 浏览 0 评论

360的开机速度评分功能到底是谁最先想到的呢?很棒的创意。

说到这个评分功能,你有没有想过它是怎么计算出你的开机速度击败了全球百分之几的电脑呢?这看起来有点“2B”的功能,到底是怎么运作的?如果这些数据是从网上的数据库获取的,那它又是从哪个数据库来的呢?更奇怪的是,有时候即使你没联网也能看到这个排名结果。

在这种情况下,正态分布作为一种常用的统计模型,能够帮助我们更直观地理解这些数据的分布特征。

正态分布代表了宇宙中大多数情况的运转状态。大量的随机变量被证明是正态分布的。

无论是对数分布、幂律分布,还是指数分布,我们可以说,所有的概率分布,不是正态分布,就是在变成正态分布的路上

0.正态分布知识点

1、正态分布公式

其中,μ是平均值,σ是标准差。

对于任意的x,我们想要知道它出现的概率,只需要将x带入上面的公式就可以得到。

2、标准差(Standard Deviation)

标准差是体现数据的离散程度的指标,计算公式如下:

标准差越大,数据越离散,体现在正态分布图形中就是曲线扁平。

标准差越小,数据越聚焦,正态分布曲线越凸起。

3、正态分布的性质

  1. 正态曲线关于x=μ对称(即μ决定正态曲线对称轴的位置),具有中间高、两边低的特点,平均值μ就是数学期望
  2. 正态曲线与x轴所围成的图形面积为1
  3. σ决定正态曲线的“胖瘦”:σ越大,说明标准差越大,数据的集中程度越弱,所以曲线越"胖";σ越小,说明标准差越小,数据的集中程度越强,所以曲线越"瘦",标准差σ决定胖瘦

1. 数据采集与分析

在分析用户开机时长之前,我们首先需要记录和计算系统从电源开启到完全启动所需的时间。

记录开机时间

使用以下脚本记录系统开机时间,可以确保数据的准确性。

import datetime

def record_boot_time():
    boot_time = datetime.datetime.now()
    with open("boot_time.txt", "w") as f:
        f.write(boot_time.strftime('%Y-%m-%d %H:%M:%S'))

if __name__ == "__main__":
    record_boot_time()

在 Windows 系统上,可以通过任务计划程序在每次系统启动时运行此脚本来记录开机时间。

确定系统完全启动的时间

可以通过某个关键服务或应用程序的启动时间来标记系统完全启动。

import datetime

def read_boot_time():
    with open("boot_time.txt", "r") as f:
        boot_time_str = f.read().strip()
    return datetime.datetime.strptime(boot_time_str, '%Y-%m-%d %H:%M:%S')

def calculate_startup_duration(startup_complete_time):
    boot_time = read_boot_time()
    boot_duration = startup_complete_time - boot_time
    return boot_duration.total_seconds()

if __name__ == "__main__":
    startup_complete_time = datetime.datetime.now()  # 实际启动完成时间应由系统提供
    startup_duration = calculate_startup_duration(startup_complete_time)
    print(f"从开机到系统完全启动所需的时间(秒): {startup_duration:.2f}")

获取实际启动完成时间

系统日志或关键服务启动时间可以用作系统完全启动的标志。

2. 生成模拟数据

为了模拟用户开机时长,我们生成一个包含 100,000 条开机时长数据的模拟数据集,假设开机时长符合正态分布。

import numpy as np

def generate_mock_data(num_samples=100000, mean=50, std_dev=10):
    data = np.random.normal(loc=mean, scale=std_dev, size=num_samples)
    data = np.abs(data)
    return data

if __name__ == "__main__":
    mock_data = generate_mock_data()
    np.savetxt("mock_boot_times.csv", mock_data, delimiter=",", header="Boot Time (seconds)", comments="")

生成的mock_boot_times.csv如下:

将这个数据可视化显示出来:

import numpy as np
import matplotlib.pyplot as plt

def load_data(filename):
    # 从 CSV 文件中读取数据
    data = np.loadtxt(filename, delimiter=",", skiprows=1)  # skiprows=1 跳过头部
    return data

def plot_data(data):
    # 绘制数据的直方图
    plt.figure(figsize=(10, 6))
    plt.hist(data, bins=100, color='skyblue', edgecolor='black')
    plt.title('Distribution of Boot Times')
    plt.xlabel('Boot Time (seconds)')
    plt.ylabel('Frequency')
    plt.grid(True)
    plt.show()

if __name__ == "__main__":
    # 读取 CSV 文件中的数据
    filename = "mock_boot_times.csv"
    data = load_data(filename)
    # 可视化数据
    plot_data(data)

3. 拟合正态分布模型并持久化到本地

拟合正态分布模型以确定数据的均值和标准差,并将这些参数保存到文件中。

import numpy as np
import scipy.stats as stats
import pickle

def fit_normal_distribution(data):
    mu, std = stats.norm.fit(data)
    return mu, std

def save_model_parameters(mu, std, filename):
    with open(filename, 'wb') as f:
        pickle.dump({'mu': mu, 'std': std}, f)

if __name__ == "__main__":
    mock_data = np.loadtxt("mock_boot_times.csv", delimiter=",", skiprows=1)
    mu, std = fit_normal_distribution(mock_data)
    save_model_parameters(mu, std, "normal_distribution_model.pkl")
    print("模型参数已保存到 'normal_distribution_model.pkl'.")

生成的normal_distribution_model.pkl文件很小。

再将这个文件可视化出来。

import numpy as np
import scipy.stats as stats
import pickle
import matplotlib.pyplot as plt

def load_model_parameters(filename):
    """从文件中加载正态分布模型参数"""
    with open(filename, 'rb') as f:
        model_params = pickle.load(f)
    return model_params['mu'], model_params['std']

def plot_normal_distribution(mu, std):
    """根据均值和标准差绘制正态分布的概率密度函数"""
    # 创建一个范围用于绘制分布
    x = np.linspace(mu - 3*std, mu + 3*std, 1000)
    # 计算正态分布的概率密度函数
    pdf = stats.norm.pdf(x, mu, std)
    
    # 绘制图形
    plt.figure(figsize=(10, 6))
    plt.plot(x, pdf, color='blue', label=f'Normal Distribution\n$\mu={mu:.2f}$, $\sigma={std:.2f}#39;)
    plt.title('Normal Distribution PDF')
    plt.xlabel('Value')
    plt.ylabel('Probability Density')
    plt.legend()
    plt.grid(True)
    plt.show()

if __name__ == "__main__":
    # 加载模型参数
    mu, std = load_model_parameters("normal_distribution_model.pkl")
    # 可视化正态分布
    plot_normal_distribution(mu, std)

4. 计算用户排名

通过加载模型参数,计算用户开机时长在模型中的百分位数和相对排名。

import numpy as np
import scipy.stats as stats
import pickle
import matplotlib.pyplot as plt

def load_model_parameters(filename):
    """从文件中加载正态分布模型参数"""
    with open(filename, 'rb') as f:
        model_params = pickle.load(f)
    return model_params['mu'], model_params['std']

def calculate_rank(user_boot_time, mu, std, data=None):
    """计算用户开机时长的百分位数和排名"""
    percentile = stats.norm.cdf(user_boot_time, mu, std) * 100
    if data is not None:
        num_slower = np.sum(data < user_boot_time)
        total_users = len(data)
        rank = (total_users - num_slower) / total_users * 100
    else:
        # 当没有数据时,默认排名为百分位数
        rank = percentile
    return percentile, rank

def plot_normal_distribution(mu, std, user_boot_time, percentile, rank):
    """根据均值和标准差绘制正态分布的概率密度函数,并标记用户开机时长"""
    # 创建一个范围用于绘制分布
    x = np.linspace(mu - 3*std, mu + 3*std, 1000)
    # 计算正态分布的概率密度函数
    pdf = stats.norm.pdf(x, mu, std)
    
    # 绘制图形
    plt.figure(figsize=(12, 8))
    plt.plot(x, pdf, color='blue', label=f'Normal Distribution\n$\mu={mu:.2f}$, $\sigma={std:.2f}#39;)
    plt.axvline(x=user_boot_time, color='red', linestyle='--', label=f'User Boot Time: {user_boot_time} s')
    plt.scatter(user_boot_time, stats.norm.pdf(user_boot_time, mu, std), color='red', zorder=5)
    
    # 添加文字信息
    plt.text(user_boot_time + 0.1, stats.norm.pdf(user_boot_time, mu, std) + 0.01,
             f'Boot Time: {user_boot_time}s\nPercentile: {percentile:.2f}%\nRank: {rank:.2f}%',
             color='red', fontsize=12, ha='left')

    plt.title('Normal Distribution with User Boot Time')
    plt.xlabel('Boot Time (seconds)')
    plt.ylabel('Probability Density')
    plt.legend()
    plt.grid(True)
    plt.show()

if __name__ == "__main__":
    # 加载模型参数
    mu, std = load_model_parameters("normal_distribution_model.pkl")
    
    # 用户开机时长示例
    user_boot_time = 55  # 用户开机时长 (秒)
    
    # 计算排名(如果没有模拟数据,则使用百分位数作为排名)
    percentile, rank = calculate_rank(user_boot_time, mu, std)
    
    # 可视化正态分布及用户开机时长,并显示排名信息
    plot_normal_distribution(mu, std, user_boot_time, percentile, rank)

图中将显示用户的开机时长、在分布中的百分位数和用户的排名。

结论

通过生成模拟数据、拟合正态分布模型,以及计算用户排名,我们可以有效地分析和处理大规模的数据。

正态分布模型不仅让我们更直观地理解数据的整体分布情况,还能帮助我们做出更有依据的决策。

相关推荐

Vue 技术栈(全家桶)(vue technology)

Vue技术栈(全家桶)尚硅谷前端研究院第1章:Vue核心Vue简介官网英文官网:https://vuejs.org/中文官网:https://cn.vuejs.org/...

vue 基础- nextTick 的使用场景(vue的nexttick这个方法有什么用)

前言《vue基础》系列是再次回炉vue记的笔记,除了官网那部分知识点外,还会加入自己的一些理解。(里面会有部分和官网相同的文案,有经验的同学择感兴趣的阅读)在开发时,是不是遇到过这样的场景,响应...

vue3 组件初始化流程(vue组件初始化顺序)

学习完成响应式系统后,咋们来看看vue3组件的初始化流程既然是看vue组件的初始化流程,咋们先来创建基本的代码,跑跑流程(在app.vue中写入以下内容,来跑流程)...

vue3优雅的设置element-plus的table自动滚动到底部

场景我是需要在table最后添加一行数据,然后把滚动条滚动到最后。查网上的解决方案都是读取html结构,暴力的去获取,虽能解决问题,但是不喜欢这种打补丁的解决方案,我想着官方应该有相关的定义,于是就去...

Vue3为什么推荐使用ref而不是reactive

为什么推荐使用ref而不是reactivereactive本身具有很大局限性导致使用过程需要额外注意,如果忽视这些问题将对开发造成不小的麻烦;ref更像是vue2时代optionapi的data的替...

9、echarts 在 vue 中怎么引用?(必会)

首先我们初始化一个vue项目,执行vueinitwebpackechart,接着我们进入初始化的项目下。安装echarts,npminstallecharts-S//或...

无所不能,将 Vue 渲染到嵌入式液晶屏

该文章转载自公众号@前端时刻,https://mp.weixin.qq.com/s/WDHW36zhfNFVFVv4jO2vrA前言...

vue-element-admin 增删改查(五)(vue-element-admin怎么用)

此篇幅比较长,涉及到的小知识点也比较多,一定要耐心看完,记住学东西没有耐心可不行!!!一、添加和修改注:添加和编辑用到了同一个组件,也就是此篇文章你能学会如何封装组件及引用组件;第二能学会async和...

最全的 Vue 面试题+详解答案(vue面试题知识点大全)

前言本文整理了...

基于 vue3.0 桌面端朋友圈/登录验证+60s倒计时

今天给大家分享的是Vue3聊天实例中的朋友圈的实现及登录验证和倒计时操作。先上效果图这个是最新开发的vue3.x网页端聊天项目中的朋友圈模块。用到了ElementPlus...

不来看看这些 VUE 的生命周期钩子函数?| 原力计划

作者|huangfuyk责编|王晓曼出品|CSDN博客VUE的生命周期钩子函数:就是指在一个组件从创建到销毁的过程自动执行的函数,包含组件的变化。可以分为:创建、挂载、更新、销毁四个模块...

Vue3.5正式上线,父传子props用法更丝滑简洁

前言Vue3.5在2024-09-03正式上线,目前在Vue官网显最新版本已经是Vue3.5,其中主要包含了几个小改动,我留意到日常最常用的改动就是props了,肯定是用Vue3的人必用的,所以针对性...

Vue 3 生命周期完整指南(vue生命周期及使用)

Vue2和Vue3中的生命周期钩子的工作方式非常相似,我们仍然可以访问相同的钩子,也希望将它们能用于相同的场景。...

救命!这 10 个 Vue3 技巧藏太深了!性能翻倍 + 摸鱼神器全揭秘

前端打工人集合!是不是经常遇到这些崩溃瞬间:Vue3项目越写越卡,组件通信像走迷宫,复杂逻辑写得脑壳疼?别慌!作为在一线摸爬滚打多年的老前端,今天直接甩出10个超实用的Vue3实战技巧,手把...

怎么在 vue 中使用 form 清除校验状态?

在Vue中使用表单验证时,经常需要清除表单的校验状态。下面我将介绍一些方法来清除表单的校验状态。1.使用this.$refs...

取消回复欢迎 发表评论: