2020年认证杯SPSSPRO杯数学建模D题(第一阶段)让电脑桌面飞起来全过程文档及程序

2020年认证杯SPSSPRO杯数学建模

D题 让电脑桌面飞起来

原题再现:

  对于一些必须每天使用电脑工作的白领来说,电脑桌面有着非常特殊的意义,通常一些频繁使用或者比较重要的图标会一直保留在桌面上,但是随着时间的推移,桌面上的图标会越来越多,有的时候想找到一个马上要用的图标是非常困难的,就比如下图所示的桌面。各种各样的图标会让你眼花缭乱,甚至有的时候反复找好几遍都找不到你想要的图标。其实只要把图标进行有效的分类就可以解决这个问题,但是手工分类往往非常浪费时间,有的时候使用者也会陷入分类决定困难,不知该如何选择。
在这里插入图片描述
  第一阶段问题: 请你的团队建立合理的数学模型,设计一种快速、有效地桌面图标分类的算法,使得能够根据图标的名字进行自动分类,让电脑桌面真正飞起来!这里需要注意的是,应用程序的图标文件不能通过扩展名来区分其功能,只能通过在已有的数据库或者互联网上查询文件名来判断其功能。当然也可以通过机器学习的方式来学习人的分类经验来形成一个分类模式。

整体求解过程概述(摘要)

  随着电脑办公的普及,对于桌面图标的分类整理已成为让很多电脑使用者极为头疼的一件事,无论是专业的计算机开发者还是日常办公人员,进行有效的桌面图标整理工作,对于办公效率提升其价值是不言而喻的,对于桌面图标的有效分类以及桌面区域的划分是解决该问题的有效途径。
  针对图标分类而言,我们获取桌面图标有关的 logo 图像、描述文本、以及近期访问量等三大特征。对于图像特征利用 CNN 进行图像特征提取匹配 logo 相似程度,根据图标名称寻找对应详细的文本介绍借助自然语言处理中的 LDA 主题提取算法,通过计算图标之间有关用途、来源等文本主题进行文本聚类,形成以主题为依据的图标存放单元。针对桌面图标点击量进行排序单独划分访问区域,根据图标 logo 特征提取后的结果结合图标的点击率调整图标的透明度和大小。最后得到五大主题图标区域与两块文件分类区域,在桌面上添加图标搜索栏,以完成对于文档类型图标的快速查找。
  最后利用 ROC 曲线通过新增图标数量判别分类器准确度为 87.8%,通过实际测试得到该模型对于桌面图标查找速度提升为 65%。

问题分析:

  (一)问题一的分析
  对于桌面图标而言,人们往往凭借记忆和直观视觉完成对于所需图标范围的定位与查找,这往往耗费使用者大量时间。因此查找桌面图标时间的长短是衡量桌面图标分类效果的重要标准,与此同时优化图标对于用户的视觉舒适度。首先对于桌面图标需要合理设置若干个基本存放单元[1],将桌面区域进行划分,缩小用户对于所需图标的查找范围,对于新产生的图标可通过分类器判决进入对应的基本存放单元。
  桌面图标包括三个维度的信息:1、所属文件的类型与自然文本 2、图标图像信息 3、近期桌面图标浏览量。首先,利用 CNN 对于图像论文进行特性提取,在输出层外接 LGAM快速训练模型,判决图标之间的相近程度。接着通过图标的名称向 Web 服务器发出请求查找对应名称内容的相应数据库,根据 LDA 主题模型进行主题聚类[2],将同一类型产品进行规律,最终根据用户的使用频率与图标颜色近似程度来改变的图标的透明度,最后留出一块基本存放单元体现桌面图标访问状况。通过桌面图标的访问评论调整图标的大小,并且对于使用频率低于一周一次的图标向用户申请删除命令。于此同时,针对大量同类型图标文件例如 Excel 与 Word 报表,在桌面增添搜索区域增加对于相近文件的区分度。

模型假设:

  1.假设用户对于桌面图标重命名合理(符合图标内容属性);
  2.假设用户图标类型较为常见,不存在大量图标名称极为近似
  3.假设图标的透明度与大小能进行调整
  4.假设图标名称与所关联的文本内容是一致的
  5.假设申请删除某桌面图标的标准为访问周期小于一周

论文缩略图:

在这里插入图片描述

全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可

部分程序代码:(代码和文档not free)

import logging
import logging.config
import ConfigParser
import numpy as np
import random
import codecs
import os
from collections import OrderedDict
#获取当前路径
path = os.getcwd()
#导入日志配置文件
logging.config.fileConfig("logging.conf")
#创建日志对象
logger = logging.getLogger()
# loggerInfo = logging.getLogger("TimeInfoLogger")
# Consolelogger = logging.getLogger("ConsoleLogger")
#导入配置文件
conf = ConfigParser.ConfigParser()
conf.read("setting.conf")
#文件路径
trainfile = os.path.join(path,os.path.normpath(conf.get("filepath", "trainfile")))
wordidmapfile = os.path.join(path,os.path.normpath(conf.get("filepath","wordidmapfile")))
thetafile = os.path.join(path,os.path.normpath(conf.get("filepath","thetafile")))
phifile = os.path.join(path,os.path.normpath(conf.get("filepath","phifile")))
paramfile = os.path.join(path,os.path.normpath(conf.get("filepath","paramfile")))
topNfile = os.path.join(path,os.path.normpath(conf.get("filepath","topNfile")))
tassginfile = os.path.join(path,os.path.normpath(conf.get("filepath","tassginfile")))
#模型初始参数
K = int(conf.get("model_args","K"))
alpha = float(conf.get("model_args","alpha"))
beta = float(conf.get("model_args","beta"))
iter_times = int(conf.get("model_args","iter_times"))
top_words_num = int(conf.get("model_args","top_words_num"))
class Document(object):
def __init__(self):
self.words = []
self.length = 0
#把整个文档及真的单词构成 vocabulary(不允许重复)
class DataPreProcessing(object):
def __init__(self):
self.docs_count = 0
self.words_count = 0
#保存每个文档 d 的信息(单词序列,以及 length)
self.docs = []
#建立 vocabulary 表,照片文档的单词
self.word2id = OrderedDict()
def cachewordidmap(self):
with codecs.open(wordidmapfile, 'w','utf-8') as f:
for word,id in self.word2id.items():
f.write(word +"\t"+str(id)+"\n")
class LDAModel(object):
def __init__(self,dpre):
self.dpre = dpre #获取预处理参数
#
#模型参数
#聚类个数 K,迭代次数 iter_times,每个类特征词个数 top_words_num,超参数α(alpha) β(beta)
#
self.K = K
self.beta = beta
self.alpha = alpha
self.iter_times = iter_times
self.top_words_num = top_words_num
#
#文件变量
#分好词的文件 trainfile
#词对应 id 文件 wordidmapfile
#文章-主题分布文件 thetafile
#词-主题分布文件 phifile
#每个主题 topN 词文件 topNfile
#最后分派结果文件 tassginfile
#模型训练选择的参数文件 paramfile
#
self.wordidmapfile = wordidmapfile
self.trainfile = trainfile
self.thetafile = thetafile
self.phifile = phifile
self.topNfile = topNfile
self.tassginfile = tassginfile
self.paramfile = paramfile
# p,概率向量 double 类型,存储采样的临时变量
# nw,词 word 在主题 topic 上的分布
# nwsum,每各 topic 的词的总数
# nd,每个 doc 中各个 topic 的词的总数
# ndsum,每各 doc 中词的总数
self.p = np.zeros(self.K)
# nw,词 word 在主题 topic 上的分布
self.nw = np.zeros((self.dpre.words_count,self.K),dtype="int")
# nwsum,每各 topic 的词的总数
self.nwsum = np.zeros(self.K,dtype="int")
# nd,每个 doc 中各个 topic 的词的总数
self.nd = np.zeros((self.dpre.docs_count,self.K),dtype="int")
# ndsum,每各 doc 中词的总数
self.ndsum = np.zeros(dpre.docs_count,dtype="int")
self.Z = np.array([ [0 for y in xrange(dpre.docs[x].length)] for x in xrange(dpre.docs_count)])
# M*doc.size(),文档中词的主题分布
#随机先分配类型,为每个文档中的各个单词分配主题
for x in xrange(len(self.Z)):
self.ndsum[x] = self.dpre.docs[x].length
for y in xrange(self.dpre.docs[x].length):
topic = random.randint(0,self.K-1)#随机取一个主题
self.Z[x][y] = topic#文档中词的主题分布
self.nw[self.dpre.docs[x].words[y]][topic] += 1
self.nd[x][topic] += 1
self.nwsum[topic] += 1
self.theta = np.array([ [0.0 for y in xrange(self.K)] for x in xrange(self.dpre.docs_count) ])
self.phi = np.array([ [ 0.0 for y in xrange(self.dpre.words_count) ] for x in xrange(self.K)])
def sampling(self,i,j):
#换主题
topic = self.Z[i][j]
#只是单词的编号,都是从 0 开始 word 就是等于 j
word = self.dpre.docs[i].words[j]
#if word==j:
# print 'true'
self.nw[word][topic] -= 1
self.nd[i][topic] -= 1
self.nwsum[topic] -= 1
self.ndsum[i] -= 1
Vbeta = self.dpre.words_count * self.beta
Kalpha = self.K * self.alpha
self.p = (self.nw[word] + self.beta)/(self.nwsum + Vbeta) * \
(self.nd[i] + self.alpha) / (self.ndsum[i] + Kalpha)
#随机更新主题的吗
# for k in xrange(1,self.K):
# self.p[k] += self.p[k-1]
# u = random.uniform(0,self.p[self.K-1])
# for topic in xrange(self.K):
# if self.p[topic]>u:
# break
#按这个更新主题更好理解,这个效果还不错
p = np.squeeze(np.asarray(self.p/np.sum(self.p)))
topic = np.argmax(np.random.multinomial(1, p))
self.nw[word][topic] +=1
self.nwsum[topic] +=1
self.nd[i][topic] +=1
self.ndsum[i] +=1
return topic
def est(self):
# Consolelogger.info(u"迭代次数为%s 次" % self.iter_times)
for x in xrange(self.iter_times):
for i in xrange(self.dpre.docs_count):
for j in xrange(self.dpre.docs[i].length):
topic = self.sampling(i,j)
self.Z[i][j] = topic
logger.info(u"迭代完成。")
logger.debug(u"计算文章-主题分布")
self._theta()
logger.debug(u"计算词-主题分布")
self._phi()
logger.debug(u"保存模型")
self.save()
def _theta(self):
for i in xrange(self.dpre.docs_count):#遍历文档的个数词
self.theta[i] = (self.nd[i]+self.alpha)/(self.ndsum[i]+self.K * self.alpha)
def _phi(self):
for i in xrange(self.K):
self.phi[i] = (self.nw.T[i] + self.beta)/(self.nwsum[i]+self.dpre.words_count * self.beta)
def save(self):
# 保存 theta 文章-主题分布
logger.info(u"文章-主题分布已保存到%s" % self.thetafile)
with codecs.open(self.thetafile,'w') as f:
for x in xrange(self.dpre.docs_count): for y in xrange(self.K):
f.write(str(self.theta[x][y]) + '\t')
f.write('\n')
# 保存 phi 词-主题分布
logger.info(u"词-主题分布已保存到%s" % self.phifile)
with codecs.open(self.phifile,'w') as f:
for x in xrange(self.K):
for y in xrange(self.dpre.words_count):
f.write(str(self.phi[x][y]) + '\t')
f.write('\n')
# 保存参数设置
logger.info(u"参数设置已保存到%s" % self.paramfile)
with codecs.open(self.paramfile,'w','utf-8') as f:
f.write('K=' + str(self.K) + '\n')
f.write('alpha=' + str(self.alpha) + '\n')
f.write('beta=' + str(self.beta) + '\n')
f.write(u'迭代次数 iter_times=' + str(self.iter_times) + '\n')
f.write(u'每个类的高频词显示个数 top_words_num=' + str(self.top_words_num) + '\n')
# 保存每个主题 topic 的词
logger.info(u"主题 topN 词已保存到%s" % self.topNfile)
lda = LDAModel(dpre)
lda.est()
if __name__ == '__main__':
run()
全部论文及程序请见下方“ 只会建模 QQ名片” 点击QQ名片即可

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java数据结构:1. 数据结构前置知识

文章目录 一、初识数据结构二、初识集合框架1. 什么是集合框架2. 集合框架的重要性3. 背后所涉及的数据结构以及算法 三、时间复杂度空间复杂度1. 算法效率2. 时间复杂度(1)概念(2)大O的渐进表示法(3)推导大…

捕捉“五彩斑斓的黑”:锗基短波红外相机的多种成像应用

红外处于人眼可观察范围以外,为我们了解未知领域提供了新的途径。红外又可以根据波段范围,分为短波红外、中波红外与长波红外。较短的SWIR波长——大约900nm-1700nm——与可见光范围内的光子表现相似。虽然在SWIR中目标的光谱含量不同,但所产…

PostgreSQL荣获DB-Engines 2023年度数据库

数据库流行度排名网站 DB-Engines 2024 年 1 月 2 日发布文章宣称,PostgreSQL 荣获 2023 年度数据库管理系统称号。 PostgreSQL 在过去一年中获得了比其他 417 个产品更多的流行度增长,因此获得了 2023 年度 DBMS。 DB-Engines 通过计算每种数据库 2024 …

Amazon CodeWhisperer 免费 AI 代码生成助手体验分享

今年上半年,亚马逊云科技正式推出了实时AI编程助手 Amazon CodeWhisperer,还提供了供所有开发人员免费使用的个人版版本。经过一段时间的体验,我觉得 CodeWhisperer 可以处理编程工作中遇到的很多问题,并且帮助开发人员提高编程效…

高德地图经纬度坐标导出工具

https://tool.xuexiareas.com/map/amap 可以导出单个点,也可以导出多个,多个点可以连成线,可用于前端开发时自己模拟“线“数据

【Apache Doris】自定义函数之 JAVA UDF 详解

【Apache Doris】自定义函数之 JAVA UDF 详解 一、背景说明二、原理简介三、环境信息3.1 硬件信息3.2 软件信息 四、IDE准备五、JAVA UDF开发流程5.1 源码准备5.1.1 pom.xml5.1.2 JAVA代码 5.2 mvn打包5.2.1 clean5.2.2 package 5.3 函数使用5.3.1 upload5.3.2 使用 六、注意事…

华为端口隔离高级用法经典案例

最终效果: pc4不能ping通pc5,pc5能ping通pc4 pc1不能和pc2、pc3通,但pc2和pc3能互通 vlan batch 2 interface Vlanif1 ip address 10.0.0.254 255.255.255.0 interface Vlanif2 ip address 192.168.2.1 255.255.255.0 interface MEth0/0/1 i…

服务器防护怎么做

随着网络攻击的日益猖獗,服务器安全已成为关注的焦点。如何有效防御各种网络威胁,确保数据安全与业务连续性,已成为一项迫切的需求。目前服务器所面临的主要威胁包括但不限于:DDoS攻击、SQL注入、跨站脚本攻击(XSS)、远程命令执行…

大模型笔记 【1】 大模型初探

以下是Andrej Karpathy一小时讲解chatgpt的笔记。 Andrej Karpathy做自动驾驶的人应该比较熟悉,他是李飞飞的学生。在openAI做了一年半的科学家之后,去了特斯拉。在Tesla AI day讲解tesla自动驾驶方案的就是他。 这里我的主要收获是两个 大模型是一个有…

七夕祭

title: 七夕祭 date: 2024-01-03 22:47:05 tags: 传送门 题目大意 解题思路 行的感兴趣的摊点或者列的感兴趣的摊点的数量能被行数或者列数整除,则能够实现要求。“均分”思想,设总感兴趣摊点数 T T T 和行数列数 n n n,当前感兴趣的摊点数…

三、HTML元素

一、HTML元素 HTML 文档由 HTML 元素定义。 *开始标签常被称为起始标签(opening tag),结束标签常称为闭合标签(closing tag)。 二、HTML 元素语法 HTML 元素以开始标签起始。HTML 元素以结束标签终止。元素的内容是…

玩转贝启科技BQ3588C开源鸿蒙系统开发板 —— 首次运行DevEco Studio

接前一篇文章:玩转贝启科技BQ3588C开源鸿蒙系统开发板 —— DevEco Studio下载与安装 上一篇文章详细说明了Dev Eco Stdio的下载即安装过程,本回讲一下首次运行DevEco Studio的过程。 笔者电脑的操作系统是Windows 11。点击“开始菜单”,在弹…

Linux 如何 kill 指定的 python 进程

文章目录 写在前面一、显示python相关的进程二、找到自己想要 kill 的进程,执行下述指令 写在前面 自己的系统是 Ubuntu 20.04 一、显示python相关的进程 ps -ef | grep python显示结果如下 其中,第二列分别是各个进程的 PID 号。 二、找到自己想要…

Python搭建代理IP池实现存储IP的方法

目录 前言 1. 介绍 2. IP存储方法 2.1 存储到数据库 2.2 存储到文件 2.3 存储到内存 3. 完整代码示例 总结 前言 代理IP池是一种常用的网络爬虫技术,可以用于反爬虫、批量访问目标网站等场景。本文介绍了使用Python搭建代理IP池,并实现IP存储的…

人机交互不是人机融合智能

一、人机交互和人机融合智能是两个不同的概念 人机交互是指人类与计算机之间的信息交流和操作方式,包括输入和输出界面、交互技术、用户体验等方面。人机交互的目标是提供用户友好的界面和自然的交互方式,使人类能够与计算机更加高效地进行沟通和协作。 …

pytest conftest通过fixture实现变量共享

conftest.py scope"module" 只对当前执行的python文件 作用 pytest.fixture(scope"module") def global_variable():my_dict {}yield my_dict test_case7.py import pytestlist1 []def test_case001(global_variable):data1 123global_variable.u…

Flink版本更新汇总(1.14-1.18)

0、汇总 1.14.0 1.有界流支持 Checkpoint; 2.批执行模式支持 DataStream 和 Table/SQL 混合应用; 3.新增 Hybrid Source 功能; 4.新增 缓冲区去膨胀 功能; 5.新增 细粒度资源管理 功能; 6.新增 DataStream 的 Pulsar …

[DevOps-02] Code编码阶段工具

一、简要说明 在code阶段,我们需要将不同版本的代码存储到一个仓库中,常见的版本控制工具就是SVN或者Git,这里我们采用Git作为版本控制工具,GitLab作为远程仓库。 Git安装安装GitLab配置GitLab登录账户二、Git安装 Git官网 Githttps://git-scm.com/

VScode——下载、安装、配置C/C++环境(windows)

一.快速下载 还在因为vscode官方下载慢而头疼嘛,按这个步骤来直接起飞兄弟萌 首先进入vscode官方网站然后选择对应版本下载然后进入浏览器下载页面复制下载链接粘贴到地址栏 将地址中的/stable前换成vscode.cdn.azure.cn 即可实现超速下载 下面是一个国内镜像的下…

RocketMQ单机部署完整学习笔记

文章目录 前言一、RocketMQ是什么?二、使用步骤1.安装MQ1.安装JDK2.安装mq3.MQ配置(核心) 2.搭建可视化dashboard1.下载源码2.修改配置3.启动 3.整合java1.生产者2.消费者3.启动生产者4.启动消费者5.dashboard添加消费组 三、总结全部的配置 前言 本文是基于4.X版本…