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

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

ztj100 2025-01-05 01:00 16 浏览 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)

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

结论

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

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

相关推荐

再说圆的面积-蒙特卡洛(蒙特卡洛方法求圆周率的matlab程序)

在微积分-圆的面积和周长(1)介绍微积分方法求解圆的面积,本文使用蒙特卡洛方法求解圆面积。...

python编程:如何使用python代码绘制出哪些常见的机器学习图像?

专栏推荐...

python创建分类器小结(pytorch分类数据集创建)

简介:分类是指利用数据的特性将其分成若干类型的过程。监督学习分类器就是用带标记的训练数据建立一个模型,然后对未知数据进行分类。...

matplotlib——绘制散点图(matplotlib散点图颜色和图例)

绘制散点图不同条件(维度)之间的内在关联关系观察数据的离散聚合程度...

python实现实时绘制数据(python如何绘制)

方法一importmatplotlib.pyplotaspltimportnumpyasnpimporttimefrommathimport*plt.ion()#...

简单学Python——matplotlib库3——绘制散点图

前面我们学习了用matplotlib绘制折线图,今天我们学习绘制散点图。其实简单的散点图与折线图的语法基本相同,只是作图函数由plot()变成了scatter()。下面就绘制一个散点图:import...

数据分析-相关性分析可视化(相关性分析数据处理)

前面介绍了相关性分析的原理、流程和常用的皮尔逊相关系数和斯皮尔曼相关系数,具体可以参考...

免费Python机器学习课程一:线性回归算法

学习线性回归的概念并从头开始在python中开发完整的线性回归算法最基本的机器学习算法必须是具有单个变量的线性回归算法。如今,可用的高级机器学习算法,库和技术如此之多,以至于线性回归似乎并不重要。但是...

用Python进行机器学习(2)之逻辑回归

前面介绍了线性回归,本次介绍的是逻辑回归。逻辑回归虽然名字里面带有“回归”两个字,但是它是一种分类算法,通常用于解决二分类问题,比如某个邮件是否是广告邮件,比如某个评价是否为正向的评价。逻辑回归也可以...

【Python机器学习系列】拟合和回归傻傻分不清?一文带你彻底搞懂

一、拟合和回归的区别拟合...

推荐2个十分好用的pandas数据探索分析神器

作者:俊欣来源:关于数据分析与可视化...

向量数据库:解锁大模型记忆的关键!选型指南+实战案例全解析

本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在...

用Python进行机器学习(11)-主成分分析PCA

我们在机器学习中有时候需要处理很多个参数,但是这些参数有时候彼此之间是有着各种关系的,这个时候我们就会想:是否可以找到一种方式来降低参数的个数呢?这就是今天我们要介绍的主成分分析,英文是Princip...

神经网络基础深度解析:从感知机到反向传播

本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在...

Python实现基于机器学习的RFM模型

CDA数据分析师出品作者:CDALevelⅠ持证人岗位:数据分析师行业:大数据...

取消回复欢迎 发表评论: