在vue前端下载csv用excel打开是乱码的问题解决方案

背景 前端下载csv文件,Excel打开乱码的问题。 前端下载代码很简单,利用HTML5的blob接口生成前端下载链接,实现下载。 那问题出在哪里呢?读入的文件是utf-8格式,下载下来Excel打开乱码,但是用其他编辑器打开并不是乱码,一开始解决问题的思路是,下载文件的时候,是不是没有指定编码方式,导致文件编码方式不对,于是乎使用了Blob里的type参数,硬塞了一个类型以及编码方式,但是这种方法似乎并不管用,仔细读了官方文档之后,关于type的解读如下: type,默认值为 “”,它代表了将会被放入到blob中的数组内容的MIME类型。 这里明确表明,此type只是一个类型标记,并不会起到转码的作用,想想也是,blob仅仅是内存里开辟的0,1代码,怎么可能在下载的过程中去解码编码呢? 后来逛遍大谷歌,发现这其实是微软家的坑,微软家发明了一个东西叫bom头,关于bom头: https://www.cnblogs.com/sparkdev/p/5676654.html 这个恶心的bom头,微软系产品类似Excel会先识别该bom头,然后才能认识你,而针对csv格式文件,Excel又格外不友好。一些列手把手指导如何使用Excel打开,导入,导出csv格式文件的文章网上一大堆,那这里,我们的解决方法是给你加一个你认识的bom头,那你总能识别了吧。 解决方法 因此我们通过blob新建下载url的时候,加一个bom头编码: window.URL.createObjectURL(new Blob(['\uFEFF' + content])) 再无乱码! 参考 https://stackoverflow.com/questions/18925210/download-blob-content-using-specified-charset https://stackoverflow.com/questions/38508064/url-createobjecturl-and-charset-utf-8 作者:lolivialucky 链接:https://www.jianshu.com/p/c330a911d6f5 来源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Vuejs之axios获取Http响应头,flask后端返回csv文件,获取不到文件名

今天在开始接入后端Api 就遇到了一个问题了 在用 axios 获取 respose.headers时候获取到的只有的 content-length: 61554 content-type: "text/csv" 下面是服务器返回的响应头, 我需要拿到的是 Content-Disposition 原来在默认的请求上, 浏览器只能访问以下默认的 响应头 Cache-Control Content-Language Content-Type Expires Last-Modified Pragma 如果想让浏览器能访问到其他的 响应头的话 需要在服务器上设置Access-Control-Expose-Headers response.headers["access-control-expose-headers"] = "Content-disposition" 前端成功获取Authorization

Vue基础知识总结 7:插槽slot与vue导入导出

🍅 作者简介:哪吒,CSDN2021博客之星亚军🏆、新星计划导师✌、博客专家💪 🍅 哪吒多年工作总结:Java学习路线总结,搬砖工逆袭Java架构师 🍅 关注公众号【哪吒编程】,回复1024,获取Java学习路线思维导图、大厂面试真题、加入万粉计划交流群、一起学习进步 目录 一、插槽slot 二、插槽代码实例 三、具名插槽的使用 四、作用域 五、作用域插槽 六、前端代码复杂带来的问题 1、js脚本语言 2、前后端分离开发 3、匿名函数的解决方案 4、常见的模块化规范 七、CommonJS 1、CommonJS导出 2、CommonJS导入 八、ES6导入导出 1、index.html 2、aaa.js 3、bbb.js 4、mmm.js 一、插槽slot 插槽slot会使代码更有扩展性; 插槽slot也就是预留一些空间; 如何封装京东标头类似的组件呢? 它们有很多区别,但是有很多共性;如果每一个单独封装一个组件,显然不合适,比如每个页面都返回,这部分内容我们就要重复去封装;但是,如果我们封装成一个,好像也不合理,有些左侧是菜单,有些是返回,有些中间是搜索,有些是文字等等。 如何封装合适呢? 抽取共性,保留不同,不同的地方使用插槽slot。 最好的封装方式就是将共性抽取到组件中,将不同暴露为插槽;一旦我们预留了插槽,就可以让使用者根据自己的需求,决定插槽中输入的内容;是搜索框,还是文字,还是菜单,由调用者自己决定; 二、插槽代码实例 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <!-- 1.插槽的基本使用 <slot></slot> 2.插槽的默认值 <slot>button</slot> 3.如果有多个值, 同时放入到组件进行替换时, 一起作为替换元素 --> <div id="app"> <cpn></cpn> <cpn><span>哈哈哈</span></cpn> <cpn><i>呵呵呵</i></cpn> <cpn> <i>呵呵呵</i> <div>我是div元素</div> <p>我是p元素</p> </cpn> <cpn></cpn> <cpn></cpn> <cpn></cpn> <cpn></cpn> </div> <template id="

Vue基础知识总结 6:vue双向绑定原理

🍅 作者简介:哪吒,CSDN2021博客之星亚军🏆、新星计划导师✌、博客专家💪 🍅 哪吒多年工作总结:Java学习路线总结,搬砖工逆袭Java架构师 🍅 关注公众号【哪吒编程】,回复1024,获取Java学习路线思维导图、大厂面试真题、加入万粉计划交流群、一起学习进步 目录 一、前端代码初体验 1、代码实例 2、浏览器显示 二、根据异常改进 1、监听事件,反向赋值 2、代码实例 3、浏览器显示 三、联动修改num1的值 1、代码实例 2、浏览器显示 四、watch 五、通过$refs完成父访问子 需求分析: 通过输入框,双向绑定文本框显示。 一、前端代码初体验 1、代码实例 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="app"> <cpn :number1="num1" :number2="num2"/> </div> <template id="cpn"> <div> <h2>{{number1}}</h2> <input type="text" v-model="number1"> <h2>{{number2}}</h2> <input type="text" v-model="number2"> </div> </template> <script src="../js/vue.js"></script> <script> const app = new Vue({ el: '#app', data: { num1: 1, num2: 0 }, components: { cpn: { template: '#cpn', props: { number1: Number, number2: Number }, } } }) </script> </body> </html> 2、浏览器显示 错误信息

安鸾渗透实战平台——暴力破解(Mysql暴力破解 (200分)

漏洞环境 安鸾渗透实战平台——暴力破解(Mysql暴力破解) kali虚拟机 分析题目 1、从图上作者告诉我们要使用MySQL漏洞,最开始没明白是什么意思,去拿MSF的mysql爆破模块去测试了一下,得到密码,拿去使用时出现了问题 提示密码错误: 又试了几次发现每次爆破的密码都不一样 题目提示了,利用漏洞,以前有个MySQL的漏洞,这里直接使用linux的for循环去测试 Mysql 身份认证绕过漏洞(CVE-2012-2122) 当连接MariaDB/MySQL时,输入的密码会与期望的正确密码比较,由于不正确的处理,会导致即便是memcmp()返回一个非零值,也会使MySQL认为两个密码是相同的。 也就是说只要知道用户名,不断尝试就能够直接登入SQL数据库。按照公告说法大约256次就能够蒙对一次。 for i in `seq 1 1000`; do mysql -uroot -paaaaa -h 118.190.133.35 -P3308 ; done for : 利用linux的shell创造一个for循环 i : 循环的变量 seq 1 1000:表示循环是从1-1000 do:执行 mysql -uroot -paaaaa:mysql的登录命令,意思是用户名是root,密码是aaaaa -h 118.190.133.35 -P3308:-h是IP ;-P是端口 done:表示循环结束 进去了,看一下表的信息,发现有个test 没有,看看whalwl把 use whalwl; show tables; select * from flag;

RuntimeError: CUDA unknown error - this may be due to an incorrectly set up environment, e.g. changi

最近在训练网络模型时,出现以下错误: /home/xw/anaconda3/envs/openmmlab/lib/python3.7/site-packages/torch/cuda/__init__.py:52: UserWarning: CUDA initialization: CUDA unknown error - this may be due to an incorrectly set up environment, e.g. changing env variable CUDA_VISIBLE_DEVICES after program start. Setting the available devices to be zero. (Triggered internally at /opt/conda/conda-bld/pytorch_1623448265233/work/c10/cuda/CUDAFunctions.cpp:115.) return torch._C._cuda_getDeviceCount() > 0 No CUDA runtime is found, using CUDA_HOME='/usr/local/cuda-11.1' Traceback (most recent call last): File "configs/trainval/tinaface/test_widerface.py", line 132, in <module> main() File "configs/trainval/tinaface/test_widerface.py", line 125, in main engine, data_loader = prepare(cfg, args.

shell脚本中()、(())、[]、[[]]、{}、||、&&的作用

脚本中的一些用法 1. 单个小括号()2.两个小括号(())3. 单中括号[]4.双中括号[[]]5.大括号{}6. ||逻辑或7.&&逻辑与 1. 单个小括号() 命令替换$(cmd),看如下示例: //现有如下文件,用脚本提取后面数字 [root@localhost ~]# ls anaconda-ks.cfg passwd test.sh [root@localhost ~]# cat passwd password 793127948 //等同于`cmd` [root@localhost ~]# vim test.sh #!/bin/bash pass=`grep password ~/passwd|awk '{print $NF}'` echo $pass passwd=$(grep password ~/passwd|awk '{print $NF}') echo $passwd [root@localhost ~]# sh test.sh 793127948 793127948 数组赋值 [root@localhost ~]# vim test.sh #!/bin/bash #pass=`grep password ~/passwd|awk '{print $NF}'` #echo $pass #passwd=$(grep password ~/passwd|awk '{print $NF}') #echo $passwd //现有如下数组 num=(a b c d) echo ${#num[*]} echo ${#num[@]} echo ${num[1]} echo ${num[0]} [root@localhost ~]# sh test.

算法编程1

文章目录 算法题一、二分查找给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。 二、判定字符是否唯一实现一个算法,确定一个字符串 s 的所有字符是否全都不同。 三、判定是否互为字符重排给定两个字符串 s1 和 s2,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。 总结 算法题 一、二分查找 在升序数组 \textit{nums}nums 中寻找目标值 \textit{target}target,对于特定下标 ii,比较 \textit{nums}[i]nums[i] 和 \textit{target}target 的大小: 如果 \textit{nums}[i] = \textit{target}nums[i]=target,则下标 ii 即为要寻找的下标; 如果 \textit{nums}[i] > \textit{target}nums[i]>target,则\textit{target}target 只可能在下标 ii 的左侧; 如果 \textit{nums}[i] < \textit{target}nums[i]<target,则 \textit{target}target 只可能在下标 ii 的右侧。 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。 示例 1: 输入: nums = [-1,0,3,5,9,12], target = 9

Excel处理控件Spire.XLS热门问题解答

为方便使用者快速掌握和了解Spire.XLS,下面小编就试用者试用过程中常见的一系列问题进行了汇总和整理,希望能帮到大家! 猛戳此处→→<<Spire.XLS最新版下载>> (1)如何将图像添加到 Excel 中? A : 请调用 Add 方法将图像添加到 Excel 文件的工作表中。完整代码: Workbook workbook = new Workbook(); Worksheet sheet = workbook.Worksheets[0]; //insert the picture day.jpg into the sheet and place it in the cell "B3" sheet.Pictures.Add(3, 2, "day.jpg"); workbook.SaveToFile("result.xlsx"); (2)如何在 Excel 文件的工作表中插入新行? A : 请调用方法 InsertRow 将新行添加到 Excel 文件的工作表中。完整代码: Workbook workbook = new Workbook(); workbook.LoadFromFile("sample.xlsx"); Worksheet sheet = workbook.Worksheets[0]; //add a new row in the third row sheet.InsertRow(3); workbook.SaveToFile("result.xlsx"); (3)如何在 XLS 中设置打印区域? A:您可以设置工作表的 PrintArea 属性来执行此操作。完整代码:

手把手教你10分钟做一个音乐播放器

一.话不多,先看效果: 视频B站效果演示地址~ (大佬勿入,大佬勿入,大佬勿入)这是个单页面音乐播放器,只用到了 html+css 与很基础的vue语法,所以适合初学者,看一看10分钟就会了~ 这个思路是借鉴黑马的~ 二.详细制作步骤(完整代码在最后): 1.第一步当然是定义标签,对于每一个标签的作用注释都写得清清楚楚啦~: <!-- 最底层的盒子 --> <div class="container" id="container"> <!-- 头部区域盒子 --> <div class="top"> <!-- 搜索框 --> <input type="text" class="txt" v-model='query' @keyup.enter="searchMusic"> </div> <!-- 歌曲列表区域 --> <div class="list"> <ul> <!-- 每个li是一首歌 --> <li v-for="(item,index) in musicList " :key="index"> <a href="javascript:;" @click="playMusic(item.id)"></a> {{item.name}} </li> </ul> </div> <!-- 中间区域 --> <div class="middle"> <!-- 那个旋转的杆 --> <img src="img/player_bar.png" alt="x" class="bar" :class="{playing:isPlay}"> <!-- 唱片 --> <img src="img/disc.png" alt="x" class="

EDA学习环境的搭建

内 容 摘 要 写这个环境搭建流程的推送主要为了新人们避开某些系统版本引发的坑,很多坑都是作者自己爬过的,都是一路找坑过来的,目前没有经费,所以用的Ubuntu 20.04LTS版本,后期有经费了再出REDHAT版本的(PS.别买12代U做服务器,各种系统不支持)。 后续会份多节说明安装流程,当然有的没有出问题的就可以略过了;大体可分为: 1、 LINUX环境下Vivado、PetaLinux环境的搭建(Intel和Libero得看情况了,Libeor都是12.8以后的版本); 2、 S家应用的搭建(2017版本); 3、 M家应用的搭建(Modelsim还是10.7d,后期版本Vivado不支持) 4、 C家应用的搭建(前端的基本用不到,后端用的多) 5、 对单软件出教程, 更新可能会很慢,要么没时间或者就是做项目去了,或者就是服务器哪又给升级改挂了,重头搞去了,都是以学习为主,非盈利目的,希望各大EDA大厂法务们别盯着小弟。 第一章 前期准备 1.1 软硬件准备 这里主要就是说明一下,装环境的话建议500G+的PCI-e 3.0 的SSD或者SATA的SSD,PCI-e 4.0的固态基本用不上那个速度,所以没必要在这边浪费时间; 硬件的话我就说INTEL了AMD很久没用了,以价格做参考吧,买更好的就行(PS.Xilinx都是AMD的,编译起来不知道会不会又BUFG)。 CPU:Intel的7代 i7以后就行,服务器可以上俩(别上12代坑死,最好10980EX,11代那种垃圾就不提了); 内存:16G起步,最好双通道两根16G,上不封顶,能上ECC的更好; 硬盘:最好就是两块1T PCI-e 3.0的SSD+一块大机械盘(2T起步); 显卡:又一定BUFG,看预算; 显示器:两块吧FUH就行,4K受不了,34寸的带鱼屏就当我没说。 WIN就不细说了,别用WIN11就行,目前没几个软件兼容的,7和10看软件版本支持了,不是这次说的重点。 LINUX这次用的Ubuntu20.04LTS版,没有经费纯属个人方便使用,后期的话我会整理完安装包统一发。 软件的话我放在百度云了,除了Vivado ML这玩意官网自己下就行,账号自己注册,要是搞不定还是自己劝退吧,有时候学东西也很费钱。 1.2制作启动盘 推荐在Windows平台推荐启动盘制作工具:UltraISO,下面我将讲解一下这款软件的使用方法。(MAC大牛就当我没说,M1的MAC我还没玩明白,我就不乱说话了虚拟机用户请自百度,跳过这个章节。)。 首先下载好UltraISO 打开软件使用界面后,点击 文件 -> 打开 ,选择ISO镜像文件,选择打开,然后选择U盘,往U盘里面选择下入硬盘镜像了。如下图所示: 点击 启动 -> 写入硬盘映像,然后会弹出一个写入写入界面(PS.USB的U盘可能会写废了,1月份的时候搞废了2块,建议用32G的SD CZ 8X永久质保的) 选项都确定没问题以后可以点击 写入 按钮,此时会提示你会格式化U盘,我们当然选择 yes,然后静静的等待刻录完成即可,速度根据每个人的电脑写入速度有所区别。 做好这一步,你的 Ubuntu系统 启动盘就已经做好了。 1.3安装Ubuntu 首先关闭Windows系统下的快速启动,开启快速启动有可能造成无法识别U盘。然后关闭电脑,插入U盘,开机时快速按F2(不同电脑进入BIOS的按键不同,联想的大多为F2)进入BIOS设置。这里有可能发生两处错误: 1:RST错误:英特尔快速存储技术(RST)和ubuntu是不兼容的,所以我们需要在w10系统中移除掉RST技术。调整BIOS的SATA硬盘控制器的模式由RAID改为AHCI.(RST使用的是RAID模式,因为卸载了RST驱动,所以需要改变硬盘控制器模式),保存设置。 2:安全启动错误:进入BIOS设置后,切换到第3个选项卡Security(安全选项),把 Secure Boot(安全启动)设置为 Disabled 。然后找到boot-USB boot-Enable开启USB设备引导。F10保存并退出。

【WEB安全自学】第一节 WEB基础环境搭建

文章目录 前言搭建记录系统概况基本环境安装安装GCC安装PCRE安装Zlib安装Openssl安装EPEL-release 安装Nginx安装php-fpm安装MySQL 安全思考服务器数据库应用系统中间件 快捷键安装思考 前言 利用linux+nginx+php-fpm+mysql搭建网站并能够运行php代码,连接数据库并执行mysql语句。 搭建记录 系统概况 centos 7 基本环境安装 安装GCC yum install gcc-c++ 安装PCRE yum install -y pcre pcre-devel 安装Zlib yum install -y zlib zlib-devel 安装Openssl yum install -y openssl openssl-devel 安装EPEL-release yum -y install epel-release 安装Nginx yum -y install nginx 网站路径:/usr/share/nginx/html nginx配置:/etc/nginx/nginx.conf 设置自启动:systemctl enable nginx.service 修改配置文件,去掉前面的注释即可解析php文件: 重启:service resrat nginx 访问首页查看安装情况: 安装php-fpm PHP-FPM的出现是为了解决两个问题: 1.传统php-cgi变更php.ini配置后需要重启php-cgi才能让新的php-ini生效,不可以平滑启动。 2.php-cgi进程终止,php服务也会被迫终止。 同步源: rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm 搜索php-fpm版本: yum search all php-fpm

Word 转PDF图片不清晰解决方法

Word中编辑的内容由于打印等需求,经常需要将其转换为PDF格式,在此过程中部分图片可能出现清晰度降低,图片模糊等现象。以下为该问题具体解决方法: 1、关闭word对图片的压缩选项 文件 > 选项 > 高级 > 做下图所示处理 2、输出PDF格式采用打印至PDF,而不采用另存为PDF,如下图所示 3、打印前对上图中打印机属性进行设置,避免打印过程对图片进行压缩,如下图所示 选择高质量打印 而后点击编辑按钮,选择左侧图像按钮,根据下图关闭图片压缩 依次点击个对话框确定按钮,进行打印输出PDF即可。 本教程使用软件为office2016 + Adobe Acrobat Pro DC 。

Java中时间格式 yyyyMMdd和yyyy-MM-dd相互转换

public class DateUtil { /*** * @param strDate yyyyMMdd类型字符串 * @return yyyy-MM-dd类型字符串 */ public static String toFormatDate(String strDate) { try { Date date = new SimpleDateFormat("yyyyMMdd").parse(strDate); return new SimpleDateFormat("yyyy-MM-dd").format(date); } catch (ParseException e) { e.printStackTrace(); return null; } } } @Test public void dateConvertion() { String str = "20200201"; // String string = "2020-02-01"; //yyyy-MM-dd try { // yyyyMMdd转yyyy-MM-dd Date format1 = new SimpleDateFormat("yyyyMMdd").parse(str); String longDate = new SimpleDateFormat("yyyy-MM-dd").format(format1); System.

手把手教你用线性回归预测二手房房价

导读 在机器学习中,线性模型是一种形式简单但包含机器学习主要建模思想的模型。 线性回归是线性模型的一种典型方法,比如“双十一”中某款产品的销量预测、某数据岗位的薪资水平预测、二手房房价的预测都可以用线性回归来拟合模型。 今天我们就以杭州的二手房的房屋单价为例,看看如何用线性回归进行预测。 2021年杭州二手房挂牌数量累计超过16万套,在新房数量少和排队摇号的限制下,购买二手房已成为杭州人买房更重要的方式。下图是某二手房网站公开的杭州部分地区的二手房房价。 图 | 链家 二手房的市场价格是多种因素综合作用的结果,主要因素有:面积、户型、朝向、是否精装、楼层、建筑形态、所属地段、所属城区和附近是否有地铁等。 我们的目标是预测二手房的均价,输入自变量包括上述特征,因为二手房房屋单价是一个连续数值,所以可以直接建立起由自变量到因变量的线性回归模型。 线性回归的原理推导 给定一组由输入x和输出y构成的数据集D={(x₁,y₁),(x₂,y₂),…,(xₘ,yₘ)},其中xᵢ=(xᵢ1,xᵢ2,…,xᵢd),yᵢ∈R。 线性回归就是通过训练学习得到一个线性模型来最大限度地根据输入x拟合输出y。 线性回归试图用上文提到的对房价的影响因素作为输入xᵢ,以房屋单价yᵢ作为输出,学习得到y=wxᵢ+b。 线性回归学习的关键问题在于确定参数w和b,使得拟合输出y与真实输出yᵢ尽可能接近。 在回归任务中,我们通常使用均方误差来度量预测与标签之间的损失,所以回归任务的优化目标就是使得拟合输出和真实输出之间的均方误差最小化,所以有: 为求得w和b的最小化参数w*和b*,可基于式(2-1)分别对w和b求一阶导数并令其为0,对w求导的推导过程如式(2-2)所示: 同理,对参数b求导的推导过程如式(2-3)所示: 基于式(2-2)和式(2-3),分别令其为0,可解得w和b的最优解表达式为: 这种基于均方误差最小化求解线性回归参数的方法就是著名的最小二乘法。最小二乘法的简单图示如下所示。 下面我们将上述推导过程进行矩阵化以适应多元线性回归问题。 所谓多元问题,就是输入有多个变量,如前述影响薪资水平的因素包括城市、学历、年龄和经验等。为方便矩阵化的最小二乘法的推导,可将参数w和b合并为向量表达形式: 训练集D的输入部分可表示为一个m×d 维的矩阵X,其中d为输入变量的个数。则矩阵X可表示为式(2-6): 输出y的向量表达式为y=(y1,y2,…,ym),类似于式(2-1),参数优化目标函数的矩阵化表达式(2-7)为: 根据矩阵微分公式: 可得: 令矩阵XᐪX为满秩矩阵或者正定矩阵,令式(2-13)等于0,可解得参数为: 但有些时候,矩阵XᐪX并不是满秩矩阵,我们通过对XᐪX添加正则化项来使得该矩阵可逆。一个典型的表达式如下: 其中λΙ即为添加的正则化项。在线性回归模型的迭代训练时,基于式(14)直接求解参数的方法并不常用,通常可以使用梯度下降之类的优化算法来求得的最优估计。 线性回归的代码实现 基于一个完整机器学习模型实现的视角,我们从整体编写思路到具体分步实现,使用NumPy实现一个线性回归模型。 按照机器学习三要素——模型、策略和算法的原则,逐步搭建线性回归代码框架。 一、编写思路 线性回归模型的主体较为简单,即y=wTx+b,在具体编写过程中,基于均方损失最小化的优化策略和梯度下降的寻优算法非常关键。一个线性回归模型代码的编写思路如图2-3所示。 图2-3 线性回归模型代码的编写思路 可以看到,图3提供了两种实现方式。一种是基于Numpy的手动实现,也是本文的重点所在。另一种是调用sklearn机器学习库的实现方式,旨在提供对比参考。 二、基于Numpy的代码实现 首先尝试实现线性回归模型的主体部分,包括回归模型公式、均方损失函数和参数求偏导。线性回归模型主体部分的实现如代码清单2-1所示。 在代码清单2-1中,我们尝试将线性回归模型的主体部分定义为linear_loss函数。该函数的输入参数包括训练数据和权重系数,输出为线性回归模型预测值、均方损失、权重参数一阶偏导和偏置一阶偏导。 在给定模型初始参数的情况下,线性回归模型根据训练数据和参数计算出当前均方损失和参数一阶梯度。 然后在linear_loss函数的基础上,定义线性回归模型的训练过程。主要包括参数初始化、迭代训练和梯度下降寻优。 我们可以先定义一个参数初始化函数initialize_params,再基于linear_loss函数和initialize_params函数来定义包含迭代训练和梯度下降寻优的线性回归拟合过程。 参数初始化函数initialize_params如代码清单2-2所示。 在代码清单2-2中,我们输入训练数据的变量维度,即对于线性回归而言,每一个变量都有一个权重系数。输出为初始化为零向量的权重系数和初始化为零的偏置参数。 最后,我们尝试结合linear_loss和initialize_params函数定义线性回归模型训练过程的函数linear_train,如代码清单2-3所示。 在代码清单2-3中,我们首先初始化模型参数,然后对遍历设置训练迭代过程。在每一次迭代过程中,基于linear_loss函数计算当前迭代的预测值、均方损失和梯度,并根据梯度下降法不断更新系数。 在训练过程中记录每一步的损失、每10000次迭代打印当前损失信息、保存更新后的模型参数字典和梯度字典。这样,一个完整的线性回归模型就基本完成了。 基于上述代码实现,我们使用sklearn的diabetes数据集进行测试,其具体信息如表2-1所示。 从sklearn中导入该数据集并将其划分为训练集和测试集,如代码清单2-4所示。 代码清单2-4首先导入sklearn的diabetes公开数据集,获取数据输入和标签并打乱顺序后划分数据集,输出为: 然后我们使用代码清单2-3定义的linear_train函数训练划分后的数据集,如代码清单2-5所示。 在学习率为0.01、迭代次数为200000的条件下,我们得到上述训练参数。训练中的均方损失下降过程如图2-4所示。 图2-4 训练中的均方损失下降过程 基于前述训练参数,我们可以定义一个预测函数对测试集进行预测,如代码清单2-6所示。 代码清单2-6定义了回归模型的预测函数,输入参数为测试集和模型训练参数,然后通过回归表达式即可进行回归预测。 如何衡量预测结果的好坏呢? 除均方损失外,回归模型的一个重要评估指标是R2系数,用来判断模型拟合水平。我们尝试自定义一个R2系数计算方法,并基于该系数计算代码清单2-6预测结果的拟合水平,具体如代码清单2-7所示。 代码清单2-7给出了回归模型R2系数的计算方式。根据总离差平方和、残差平方和以及R2计算公式,我们计算测试集的R2系数。代码清单2-7的输出如下: 0.5334188457463576 可以看到,我们自定义并训练的线性回归模型在该测试集上的R2系数为0.53,结果并不算太好,除了模型的一些超参数需要做一些调整和优化外,可能线性回归模型本身对该数据集拟合效果有限。 三、基于sklearn的模型实现 作为参考对比,这里同样基于sklearn的LinearRegression类给出对于该数据集的拟合效果。LinearRegression函数位于sklearn的linear_model模块下,定义该类的一个线性回归实例后,直接调用其fit方法拟合训练集即可。 参考实现如代码清单2-8所示。 输出如下: 可以看到,在不做任何特征处理的情况下,基于sklearn的线性回归模型在同样的数据集上与我们基于NumPy手写的模型表现差异并不大,这也验证了手写算法的有效性。 本文摘编自《机器学习:公式推导与代码实现》

focal loss 多分类问题MNIST手写字学习

focal loss参考 https://blog.csdn.net/u011583927/article/details/90716942 import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets("/media/liao/My Passport/MNIST/", one_hot=True) def multi_category_focal_loss1(y_true, y_pred): epsilon = 1.e-7 gamma = 1.0 #alpha = tf.constant([[2],[1],[1],[1],[1]], dtype=tf.float32) alpha = tf.constant([[1],[1],[1],[1],[1],[1],[1],[1],[1],[1]], dtype=tf.float32) y_true = tf.cast(y_true, tf.float32) y_pred = tf.clip_by_value(y_pred, epsilon, 1. - epsilon) y_t = tf.multiply(y_true, y_pred) + tf.multiply(1-y_true, 1-y_pred) ce = -tf.log(y_t) weight = tf.pow(tf.subtract(1., y_t), gamma) fl = tf.matmul(tf.multiply(weight, ce), alpha) loss = tf.reduce_mean(fl) return loss x = tf.

网络调优(提升跨城市网页加载速度、mysql数据库连接性能)

网络调优(提升跨城市网页加载速度、数据库连接性能) 起因nginx启动gzip压缩mysql jdbc启动压缩 起因 测试服务器、测试数据库部署在另外一个城市的云主机上,本机访问远程网络资源仅限50K/秒。蜗牛一样的网络速度,终于无法忍受,只能处理之。 正在开发的一个项目其他前端同事使用以往项目遗留下来的vue2工程改造,打包后的一个最大的js文件有2.7M,更新后,基本上要刷新n次,历经几个小时才能正常使用。 同一个项目,我自己使用基于vue-admin-beauty开发的demo,最大js文件有3M多,更新后,成功刷新也要几个小时。 同一个项目,我自己又使用最新版SDP(生成vue3前端)开发了同样功能的demo,最大js文件500K,不用几个小时,但是也很慢。 启用nginx压缩后,这些网页10秒内都能成功刷新。 nginx启动gzip压缩 在nginx.conf的http项目下配置: gzip on; gzip_types text/plain text/css application/javascript application/json text/json; 这些types需要根据自己的情况进行修改,因为这些虽然都是通用的,但是服务端开发是有可能返回定制化的类型(例如最后一个),最好是在客户端浏览器按F12,启动调试,逐个查看每个url是否启用了压缩。 我好奇看了一下其他网站,公司的一个商城启用了gzip压缩,另外一些内部开发的企业管理网站多数没开启gzip压缩。 政府网站看了两个,一个开启了gzip压缩,一个没开启。 那些开启了gzip的,说明技术人员知道如何调优网页加载性能,也是负责的。没开启的,一种是真不懂,可能也懒得懂。另外一种可能懂,但是就不开:可以用来申请更高的配置、带宽、扩容,反正没人真正关心。。。 mysql jdbc启动压缩 这个情况比较少见,主要是向我们这样的:本地没有硬件服务器,服务资源都在远程。java程序需要在本地调试,数据库却在远程。启用压缩和不启用压缩性能相差几倍。配置方法是在jdbc url中加入useCompression=true参数。在网上找了一圈没找到如何开启的文章,最后还是看mysql jdbc源代码找到如何配置: package com.mysql.cj.conf; public class PropertyDefinitions { ... public static final String PNAME_useCompression = "useCompression"; ... } 修改后的配置如下: spring: datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://10.10.10.10:3306/testdb?useUnicode=true&characterEncoding=UTF8&serverTimezone=Asia/Shanghai&tcpKeepAlive=true&autoReconnect=true&useCompression=true

vscode卡在Setting up SSH Host XX:Copying VS Code Server to host with scp

vscode卡在Setting up SSH Host XX:Copying VS Code Server to host with scp 背景 普通用户,不是sudo用户,使用vscode进行远程连接的时候卡住了,一直在等待Setting up SSH Host XX:Copying VS Code Server to host with scp。(这里远程服务器不分centos、ubuntu。都适用) 原因 是因为在远程的服务器下 家目录/.vscode-server/bin/f80445acd5a3da24aa209168452a3d97cc32(一串很的东西,这里叫做commit_id吧)/vscode-servlet.tar.gz 没有下载下来。 这里可以使用ls - la来进行查看这个文件的大小,看一下是不是没有下载成功。(一般情况都是这个原因,没有下载成功) 解决措施 我们采用手动下载,不让服务器下载。 1.进行下载vscode-servlet.tar.gz。通过下面的连接进行下载。 https://update.code.visualstudio.com/commit:${commit_id}/server-linux-x64/stable(注意把:${commit_id}替换成对应的Commit ID) 2.先记录commit_id。之后用得到 就是 :家目录/.vscode-server/bin/f80445acd5a3da24aa209168452a3d97cc32(一串很的东西,这里叫做commit_id吧)。 3.运行下面这行命令。把~/.vscode-server/bin目录下的东西删除干净。 rm ~/.vscode-server/bin/* -rf 3.2没有~/.vscode-server/bin目录的话进行创建,有的话请忽略这一步。 mkdir -p ~/.vscode-server/bin 4.将下载的压缩包vscode-server-linux-x64.tar.gz放在~/.vscode-server/bin目录下。 5.运行下面这三行命令,其中${commit_id}需要替换成第2步记录的commit_id. cd ~/.vscode-server/bin tar -zxf vscode-server-linux-x64.tar.gz mv vscode-server-linux-x64 ${commit_id} 6.重新启动vscode即可。

layui实现数据表格table的搜索功能

layui根据特定信息对表格进行搜索并显示 效果实现 html部分js部分 Controller层Mapper层 注意 总结 效果 先放效果图 此处根据“角色名称”进行搜索,得到效果 实现 html部分 此处注意!!需要要为input、table里边加上“id”属性,在js部分需要特定进行获取。 <div class="layuimini-container"> <div class="layuimini-main"> <fieldset class="table-search-fieldset"> <legend>搜索信息</legend> <div style="margin: 10px 10px 10px 10px" id="btn"> <form class="layui-form layui-form-pane" action=""> <div class="layui-form-item"> <div class="layui-inline"> <label class="layui-form-label">角色名称</label> <div class="layui-input-inline"> <!--注意此处input标签里的id--> <input class="layui-input" name="keyword" id="demoReload" autocomplete="off"> </div> </div> <div class="layui-inline"> <!--注意此处button标签里的type属性--> <button type="button" class="layui-btn layui-btn-primary" lay-submit data-type="reload" lay-filter="data-search-btn"><i class="layui-icon"></i> 搜 索</button> </div> </div> </form> </div> </fieldset> <!--注意此处table标签里的id--> <table class="layui-table layui-hide" id="test" lay-filter="

NLP-基础任务-中文分词算法(4)-评价指标:精确率(“模型分词结果集”与“标准答案集”的交集/“模型分词结果集”)、召回率(“模型分词结果集”与“标准答案集”的交集/“标准答案集”)、F1

一、分类模型中的:精确率、召回率、F1-Measure 准确率(Accuracy):对于给定的测试数据集,分类器正确分类的样本数与总样本数之比。 A c c u r a c y = T P + T N T P + T N + F P + F N Accuracy=\cfrac{TP+TN}{TP+TN+FP+FN} Accuracy=TP+TN+FP+FNTP+TN​精确率(Precision)**:精指分类正确的正样本个数(TP)占分类器判定为正样本的样本个数(TP+FP)的比例。 P r e c i s i o n = T P T P + F P Precision=\cfrac{TP}{TP+FP} Precision=TP+FPTP​召回率(Recall):召回率是指分类正确的正样本个数(TP)占真正的正样本个数(TP+FN)的比例。 R e c a l l = T P T P + F N Recall=\cfrac{TP}{TP+FN} Recall=TP+FNTP​F1-Measure值:就是精确率和召回率的调和平均值。 F 1 − M e a s u r e = 2 1 P r e c i s i o n + 1 R e c a l l \begin{aligned}F1-Measure=\cfrac{2}{\cfrac{1}{Precision}+\cfrac{1}{Recall}}\end{aligned} F1−Measure=Precision1​+Recall1​2​​ 每个评估指标都有其价值,但如果只从单一的评估指标出发去评估模型,往往会得出片面甚至错误的结论;只有通过一组互补的指标去评估模型,才能更好地发现并解决模型存在的问题,从而更好地解决实际业务场景中遇到的问题。

开灯问题:有从1到n依次编号的n个同学和n 盏灯。

开灯问题:有从1到n依次编号的n个同学和n 盏灯。1号同学将所有的灯都关掉;2号同学将编号为2的倍数的灯都打开;3号同学则将编号为3的倍数的灯作相反处理(该号灯如打开的,则关掉;如关闭的,则打开);以后的同学都将自己编号的倍数的灯,作相反处理。问经n个同学操作后,哪些灯是打开的? #include<iostream> #define n 10 #include<cstring> using namespace std; int main(){ int lantern[n+1]; for(int t=0;t<n+1;t++) lantern[t]=1; for(int i=2;i<=n;i++){ for(int j=2;j<=n;j++){ if(j%i==0) lantern[j]=-lantern[j]; } } for(int k=1;k<=n;k++) cout<<lantern[k]<<' '; cout<<endl; return 0; }

Intel OMAF install and compile note

Preparatory OS: ubuntu 18.04 1. update os sudo apt update sudo apt upgrade 2.insatll tools sudo apt-get install libgoogle-glog-dev cmake clang curl -y 3.install docker curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun 4.download source code git clone https://github.com/OpenVisualCloud/Immersive-Video-Sample.git Install steps: 1.Immersive-Video-Sample/OMAF-Sample/server/DockFiles epel-release-7-13.noarch.rpm CHANGE to epel-release-7-14.noarch.rpm RUN wget -O - ${YASM_REPO} | tar xz && \ CHANGE to RUN wget -O - ${YASM_REPO} --no-check-certificate | tar xz && \

js前端打印

1.js原生打印 不借助辅助工具,把css样式和内容直接带入到打印页面,但是会存在部分样式浏览器无法成功转换成pdf,也会存在样式紊乱问题,具体原因在代码注释中 function printTO() { let printHtml = '' // 下列获取会存在有样式紊乱问题,在不清楚css引用的顺序情况下,会存在有样式覆盖问题 // 建议确定样式的引入顺序,或样式只存在一种标签内 // 获取styles标签样式 const styles = document.querySelectorAll('style') styles.forEach(el => { printHtml += el.outerHTML }) // 获取link标签样式 const links =document.querySelectorAll('link') links.forEach(el => { el.outerHTML.indexOf('.css') > -1 ? printHtml += el.outerHTML : void(0) }) // 转换打印区域内容为String let div = document.createElement('div') // 需要复制打印区域节点,不能直接把区域append到div元素中,会把打印区域全部移入到div中 div.appendChild(document.getElementById('打印区域id').cloneNode(true)) printHtml += div.innerHTML const newWinDow = window.open('', '打印', "height=600, width=1200, top=50, left=100, toolbar=no, menubar=no, scrollbars=yes, resizable=yes, location=no, status=no"

centos 安装mysql

先删除 https://blog.csdn.net/typa01_kk/article/details/49057073 后安装 wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm yum -y install mysql57-community-release-el7-10.noarch.rpm yum -y install mysql-community-server systemctl status mysqld.service 或 service mysql start 想进入MySQL还得先找出此时root用户的密码,通过如下命令可以在日志文件中找出密码,有的可以直接进 grep “password” /var/log/mysqld.log 通过输入密码进入数据库 若报错 https://blog.csdn.net/qq_44378358/article/details/123178588

mysql启动不开

Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ 原因: /etc/my.cnf 配置文件中设置了 [mysqld] 的参数 socket ,而没有设置[client]的参数socket 办法: 在/etc/my.cnf后面添加下面内容,其中socket的值要跟此文件上原始的socket的值保持一致 [client] port=3306 socket=/var/lib/mysql/mysql.sock

pyecharts如何给柱形图的每个柱子设置不同颜色

前言 有时,我们绘制图表需要特定指定柱子的颜色,以显示出它的重要性,本文使用Pyecharts提供的js代码的接口完成。 绘制效果 未指定颜色情况: 指定柱子颜色: 完整代码 https://www.cnblogs.com/cenjw/p/15943460.html

Java8 Stream 流的创建、筛选、映射、排序、归约、分组、聚合、提取与组合、收集、接合、foreach遍历

目录 一 了解Stream 1 Stream概述 那么什么是Stream? Stream可以由数组或集合创建 Stream有几个特性: Stream流的起始操作 2 Stream的创建----Stream可以通过集合数组创建。 3、通过 java.util.Collection.stream() 方法 用map集合 ,间接创建生成流 stream和parallelStream的简单区分: 4、使用java.util.Arrays.stream(T[] array)方法 用数组 创建流 3 Stream的使用 类声明 类方法 注意: 这些方法是从 java.lang.Object 类继承来的。 Optional 实例 输出结果: 案例使用的员工类 3.1 遍历/匹配(foreach/find/match) foreach()是终止操作,只能执行一次,之后再执行此操作,会报IllegalStateException异常 案例--- forEach() / findFirst() / findAny() / findFirst.get() / findAny.get() / anyMatch() 二 Stream流常见的中间操作 3.2 筛选(filter)--进行筛选提取,不对元素进行修改附加操作 案例一:filter的常规中间操作 案例二:筛选出Integer集合中大于7的元素,并打印出来 案例三: 筛选员工中工资高于8000的人,并形成新的集合。 形成新集合依赖collect(收集)。 3.3 聚合(max/min/count) 3.4 映射(map/flatMap)--会对每一个元素进行修改等附加操作 3.5 归约(reduce) 3.6 收集(collect) 3.6.1 归集(toList/toSet/toMap) toMap 的案例

朋友创业2年,估值已达10亿,正招贤纳士,不错的机会

公司主要成员是来自高通中国的IC创业团队,公司成立两年,估计已经达到10亿人民币,成长速度惊人。 截止目前,公司全职员工约60人,预计2022年底公司将成长至100人规模,团队成员中80%以上有硕士或博士学历。其中核心研发人员分别来自清华、北大、复旦、交大、中科院等且拥有丰富的芯片设计经验。 由于公司成长非常快,现有大量IC相关职位流出。注:属于内推性质,成功概率高。如果有兴趣请发简历到 <mliu@wedosemi.com>。 职位涵盖从模拟到数字,从设计到有验证,从工程师到经理等各种职位。 职位详情大家可以点击左下角阅读原文直达官网查询。手机登陆网站的话网页显示有些问题,建议直接电脑打开网页:www.wedosemi.com,点击“招贤纳士”。 另外,也有很多校招职位,感兴趣的同学可以官网查看。 需要内推赶快发简历到 <mliu@wedosemi.com>。

使用Navicat生成ER关系图并导出

1.打开已经设计好的表视图界面 2.点击右下角的按钮切换到ER视图 3.在数据库名字上,右击选择逆向数据库到模型 4.选择导出,导出格式有三种,pdf、svg和png

Mybatis学习笔记

一、MyBatis简介 1、MyBatis历史 MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下, iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到Github。 iBatis一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。 iBatis提供的持久层框架包括SQL Maps和Data Access Objects(DAO)。 2、MyBatis特性 1) MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架 2) MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集 3) MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录 4) MyBatis 是一个 半自动的ORM(Object Relation Mapping)框架 3、MyBatis下载 MyBatis下载地址:https://github.com/mybatis/mybatis-3 4、和其它持久化层技术对比 ● JDBC SQL 夹杂在Java代码中耦合度高,导致硬编码内伤维护不易且实际开发需求中 SQL 有变化,频繁修改的情况多见代码冗长,开发效率低 ●Hibernate 和 JPA 操作简便,开发效率高程序中的长难复杂 SQL 需要绕过框架内部自动生产的 SQL,不容易做特殊优化基于全映射的全自动框架,大量字段的 POJO 进行部分映射时比较困难。反射操作太多,导致数据库性能下降 ●MyBatis 轻量级,性能出色SQL 和 Java 编码分开,功能边界清晰。Java代码专注业务、SQL语句专注数据开发效率稍逊于HIbernate,但是完全能够接受 二、搭建MyBatis 1、开发环境 IDE:idea 2019.2 构建工具:maven 3.5.4 MySQL版本:MySQL 5.7 MyBatis版本:MyBatis 3.5.7 2、创建maven工程 a>打包方式:jar

dubbo admin 可视化管理

dubbo admin 可视化管理 官网:https://dubbo.apache.org/zh/docsv2.7/admin/ops/ docker 镜像:https://hub.docker.com/r/apache/dubbo-admin dubbo admin 安装 下载镜像 docker pull apache/dubbo-admin 配置文件 # # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License.

IDEAMaven报错Could not transfer artifact错误

Could not transfer artifact org.springframework.boot:spring-boot-starter-data-mongodb:pom:2.6.1 from/to aliyunmaven (https://maven.aliyun.com/repository/public): transfer failed for https://maven.aliyun.com/repository/public/org/springframework/boot/spring-boot-starter-data-mongodb/2.6.1/spring-boot-starter-data-mongodb-2.6.1.pom 原因竟然真的是因为校园网不行,使用手机流量就解决了,废了一天。。。

Windows 脑增加静态路由(双网卡或双IP)

环境:当电脑有双网卡或者双IP时,需要增加静态路由来同时访问2个网络 网卡2配置:IP:192.168.1.7 掩码:255.255.255.0 网关:192.168.1.1 网卡2配置:IP:10.253.251.6 掩码:255.255.255.0 (不配置网关) 步骤: 1、首先在“运行”窗口输入cmd(按WIN+R打开运行窗口),然后回车进入命令行,输入 route add 10.253.251.0 mask 255.255.255.0 -p 192.254.1.1。其中10.253.251.0是源地址,255.255.255.0是源地址掩码,192.254.1.1是目标地址; 2、输入 route print,然后回车出现图2内容。图2中红线的内容就是我们刚才添加的路由; 3、把这条命令 route add 10.253.251.0 mask 255.255.255.0 -p 192.254.1.1 中的add 改成 delete ,然后回车就可以。 注意:命令中有 -p 表示永久;没有 -p 表示临时,重启就命令就失效了。

UltraISO制作大于4G文件的光盘映像可启动U盘

在制作包含大于4G的文件的启动U盘时,经常发生制作后无法安装的情况,下面就给大家介绍一下有关大于4G的文件的光盘映像如何制作U盘启动盘,需要的朋友可以看看 无法启动原因:在Windows操作系统中常用的文件系统(即通常我们说的磁盘格式,如U盘是FAT32格式的等)只要有FAT32、NTFS等。对于FAT32文件系统,其缺点不能存储超过4G的文件,这就导致映像中的install.wim大于4G文件,无法被刻录到U盘里 解决办法:将u盘改为NTFS文件系统 步骤: 1、按正常步骤制作U盘启动盘,但在刻录前将大于4G的install.wim 文件删除,如下图 2、制作完成后,将U盘转换为NTFS文件系统,方法是:管理员身份运行CMD或快捷键WIN+R,然后输入如下命令convert x: /fs:ntfs(x为U盘的盘符),回车运行即可。 3、解压ISO镜像或者通过UltraISO找到ISO中的sources目录里的install.wim,提取到U盘的相应目录即可!等待写入完成后就可以使用U盘安装新系统了。

数据库四大范式判断

1NF,2NF,3NF,BCNF范式判断方法 判断方法如下图所示,关键是找出候选键和非键属性(下面会详细介绍)。 部分依赖: AB->C B->C;即C部分依赖AB 传递依赖:C传递依赖于A 一、求出候选键和非键 候选键定义:若关系中的某一属性组的值能唯一地标识一个元组,则称该属性组为候选键。候选键的闭包为U。 求出候选键步骤: (1)找出只在左边出现的项(如果没有跳到步骤2)并判断是否能导出所有项。如果可以则这个项为候选键不进行步骤(2)。 (2)找出在左右两边都出现的项与(1)找出的项组合并判断是否能导出所有项,能导出所有项的成为候选键。 非键属性:不包含在候选键中的属性为非主属性。 注意:候选键不唯一 **例子**:F={B->D,D->B,AB->C} 步骤1:找出A,A无法导出所有项所以进行步骤2 步骤2:找出B,D与A组合成AB,AD。因AB,AD能导出所有项,即AB,AD为候选键。 C为非键属性 **例子**:F={A->B,B->C} 步骤1:找出A,A能导出所有项即A为候选键。 二、例题 1.F={B->D,D->B,AB->C} 1°:候选键为AB和AD,非键为C; 2°:C完全依赖于AB符合2NF; 3°:C不具备传递依赖候选键符合3NF; 4°:依赖项的左边不全是候选键,即最高范式为3NF; 2.F={A->B,B->A,A->C} 1°:候选键为A和B,非键为C; 2°:C完全依赖于A符合2NF; 3°:C不具备传递依赖候选键符合3NF; 4°:依赖项的左边全是候选键,即最高范式为BCNF;

C# 在WPF中使用“FontAwesome”字体图标

一、下载FontAwesome FontAwesome下载地址 进入网站后点击立即下载。 下载之后解压下载的压缩包: 至此,我们已经下载好。 二、在WPF中引用 ①引用fontawesome-webfont.ttf字体文件 在WPF项目中新建文件夹,把解压缩后的文件夹中的 fonts→fontawesome-webfont.ttf文件放到我们在WPF中创建的文件夹中。例如我放在Reference→Icon文件夹中。记住放的文件夹中,后续引用要知道。 ②将字体文件以资源的形式生成。 如图所示: 右键 fontsfontawesome-webfont.ttf —— 属性 复制到输出目录:如果较新则复制 或者 始终复制 生成操作:资源(resources) ③在项目中引用 在一个页面、窗体或者是控件中,添加一个全局引用。 <Window.Resources> <Style x:Key="FontAwesome"> <Setter Property="TextElement.FontFamily" Value="pack://application:,,,/Reference/Icon/#FontAwesome" /> </Style> </Window.Resources> 三、选择字体图标并应用 打开我们刚刚的下载界面,选择一个我们需要的图标,复制名称。 例如我选取QQ这个图标,复制之后为“fa-qq” 接下来我们打开压缩包中的 css→font-awesome.css 我们用记事本打开即可,打开之后我们按Ctrl+F进行查找,输入我们刚刚复制的“fa-qq”,即可找到。 如图所示: 然后我们把content的内容复制: 复制结果为:\f1d7 由于WPF不能识别到“\” 所以我们将“\”替换为“&#x”再在最后加分号“;”。 最后变为: &#xf1d7; 最后我们在所有显示内容的地方即可已用字体图标; 例如: <Button Content="&#xf1d6;QQ" Style="{DynamicResource FontAwesome}" Margin="42,454,342,76" Background="White" Width="113" Height="48" FontSize="20"/> 显示效果: 注意引用字体图标要添加之前设置好的全局引用。 Style="{DynamicResource FontAwesome}"

C# .net 6 通用文件哈希修改 项目源码(快速开发框架开源版)

源码下载地址见文章末尾 ①基于最新.net 6 winform(C#语言,需要使用VS2022编译)框架开发的文件哈希修改工具,可用于各种文件的哈希修改。 ②项目源码没有任何封装,全部开源(UI框架使用开源项目)。 ③适合有C#语言基础的人群使用。 ④通过学习本项目可以学习到快速开发框架的全部技巧。 ⑤本项目可以作为快速开发框架模板,只需简单修改就可以开发出自己的软件工具。 源码下载地址

java培训:Netty的内存管理

前言 正是 Netty 的易用性和高性能成就了 Netty,让其能够如此流行。而作为一款通信框架,首当其冲的便是对 IO 性能的高要求。 不少读者都知道 Netty底层通过使用Direct Memory,减少了内核态与用户态之间的内存拷贝,加快了IO速率。但是频繁的向系统申请Direct Memory,并在使用完成后释放本身就是一件影响性能的事情。为此,Netty内部实现了一套自己的内存管理机制,在申请时,Netty会一次性向操作系统申请较大的一块内存,然后再将大内存进行管理,按需拆分成小块分配。而释放时,Netty并不着急直接释放内存,而是将内存回收以待下次使用。 这套内存管理机制不仅可以管理Directory Memory,同样可以管理Heap Memory。 内存的终端消费者——ByteBuf 这里,我想向读者们强调一点,ByteBuf和内存其实是两个概念,要区分理解。 ByteBuf是一个对象,需要给他分配一块内存,它才能正常工作。 而内存可以通俗的理解成我们操作系统的内存,虽然申请到的内存也是需要依赖载体存储的:堆内存时,通过byte[], 而Direct内存,则是Nio的ByteBuffer(因此Java使用Direct Memory的能力是JDK中Nio包提供的)。 为什么要强调这两个概念,是因为Netty的内存池(或者称内存管理机制)涉及的是针对内存的分配和回收,而Netty的ByteBuf的回收则是另一种叫做对象池的技术(通过Recycler实现)。 虽然这两者总是伴随着一起使用,但这二者是独立的两套机制。可能存在着某次创建ByteBuf时,ByteBuf是回收使用的,而内存却是新向操作系统申请的。也可能存在某次创建ByteBuf时,ByteBuf是新创建的,而内存却是回收使用的。 因为对于一次创建过程而言,可以分成三个步骤: 获取ByteBuf实例(可能新建,也可能是之间缓存的)向Netty内存管理机制申请内存(可能新向操作系统申请,也可能是之前回收的)将申请到的内存分配给ByteBuf使用 本文只关注内存的管理机制,因此不会过多的对对象回收机制做解释。 Netty中内存管理的相关类 Netty中与内存管理相关的类有很多。框架内部提供了PoolArena,PoolChunkList,PoolChunk,PoolSubpage等用来管理一块或一组内存。 而对外,提供了ByteBufAllocator供用户进行操作java培训。 接下来,我们会先对这几个类做一定程度的介绍,在通过ByteBufAllocator了解内存分配和回收的流程。 为了篇幅和可读性考虑,本文不会涉及到大量很详细的代码说明,而主要是通过图辅之必要的代码进行介绍。 针对代码的注解,感兴趣的网友可加我微信:xttblog2,免费获取! PoolChunck——Netty向OS申请的最小内存 上文已经介绍了,为了减少频繁的向操作系统申请内存的情况,Netty会一次性申请一块较大的内存。而后对这块内存进行管理,每次按需将其中的一部分分配给内存使用者(即ByteBuf)。这里的内存就是PoolChunk,其大小由ChunkSize决定(默认为16M,即一次向OS申请16M的内存)。 Page——PoolChunck所管理的最小内存单位 PoolChunk所能管理的最小内存叫做Page,大小由PageSize(默认为8K),即一次向PoolChunk申请的内存都要以Page为单位(一个或多个Page)。 当需要由PoolChunk分配内存时,PoolChunk会查看通过内部记录的信息找出满足此次内存分配的Page的位置,分配给使用者。 PoolChunck如何管理Page 我们已经知道PoolChunk内部会以Page为单位组织内存,同样以Page为单位分配内存。 那么PoolChunk要如何管理才能兼顾分配效率(指尽可能快的找出可分配的内存且保证此次分配的内存是连续的)和使用效率(尽可能少的避免内存浪费,做到物尽其用)的? Netty采用了Jemalloc的想法。 首先PoolChunk通过一个完全二叉树来组织内部的内存。以默认的ChunkSize为16M, PageSize为8K为例,一个PoolChunk可以划分成2048个Page。将这2048个Page看作是叶子节点的宽度,可以得到一棵深度为11的树(2^11=2048)。 我们让每个叶子节点管理一个Page,那么其父节点管理的内存即为两个Page(其父节点有左右两个叶子节点),以此类推,树的根节点管理了这个PoolChunk所有的Page(因为所有的叶子结点都是其子节点),而树中某个节点所管理的内存大小即是以该节点作为根的子树所包含的叶子节点管理的全部Page。 这样做的好处就是当你需要内存时,很快可以找到从何处分配内存(你只需要从上往下找到所管理的内存为你需要的内存的节点,然后将该节点所管理的内存分配出去即可),并且所分配的内存还是连续的(只要保证相邻叶子节点对应的Page是连续的即可)。 上图中编号为512的节点管理了4个Page,为Page0, Page1, Page2, Page3(因为其下面有四个叶子节点2048,2049,2050, 2051)。 而编号为1024的节点管理了2个Page,为Page0和Page1(其对应的叶子节点为Page0和Page1)。 当需要分配32K的内存时,只需要将编号512的节点分配出去即可(512分配出去后会默认其下所有子节点都不能分配)。而当需要分配16K的内存时,只需要将编号1024的节点分配出去即可(一旦节点1024被分配,下面的2048和2049都不允许再被分配)。 了解了PoolChunk内部的内存管理机制后,读者可能会产生几个问题: PoolChunk内部如何标记某个节点已经被分配?当某个节点被分配后,其父节点所能分配的内存如何更新?即一旦节点2048被分配后,当你再需要16K的内存时,就不能从节点1024分配,因为现在节点1024可用的内存仅有8K。 为了解决以上这两点问题,PoolChunk都是内部维护了的byte[] memeoryMap和byte[] depthMap两个变量。 这两个数组的长度是相同的,长度等于树的节点数+1。因为它们把根节点放在了1的位置上。而数组中父节点与子节点的位置关系为: 假设parnet的下标为i,则子节点的下标为2i和2i+1 用数组表示一颗二叉树,你们是不是想到了堆这个数据结构。 已经知道了两个数组都是表示二叉树,且数组中的每个元素可以看成二叉树的节点。那么再来看看元素的值分别代码什么意思。 对于depthMap而言,该值就代表该节点所处的树的层数。例如:depthMap[1] == 1,因为它是根节点,而depthMap[2] = depthMap[3] = 2,表示这两个节点均在第二层。由于树一旦确定后,结构就不在发生改变,因此depthMap在初始化后,各元素的值也就不发生变化了。 而对于memoryMap而言,其值表示该节点下可用于完整内存分配的最小层数(或者说最靠近根节点的层数)。 这话理解起来可能有点别扭,还是用上文的例子为例。

文献管理工具EndNote使用

edited by nrzheng 模板下载 先新建图书馆。要放东西,首先要新建“仓库”。之后就把所有东西都放在这里。新建之后会有两个文件。分别是:znr_Library.Data和znr_Library.enl。 搜索文献,放到EndNote中。到知网或者IEEE等网站。搜索想要的文献之后,点击引用,用EndNote方式引用。这时候会下载一个文件。不同网站下载的文件类型不一样。但是都用EndNote打开就可以。导入进去这个文件就可以删了,他会自己保存到你的图书管的。 附PDF。一样,下载对应的PDF,然后在EndNote中选择刚刚导入的文献信息。在文献浏览区可以附PDF。浏览选择刚刚下载的PDF即可添加进去。这里一样会把PDF保存在图书馆。之后就可以一起迁移。 在word中若要直接引用EndNote,则需设置一个插件,但是有时候插件未显示,解决方法如下:点击文件—选项—加载项—转到,选择EndNote,如果这里没有就点添加,然后到EndNote的安装路径中选择Configue EndNote.exe , 一直next,点击Cite While You Write add-in for Mircosoft Office。 引用参考文献。这里可以到endnote里edit->output style->open style manager中选择要导出的模板,比如number,先进行导出格式的调整。 改段落中引用的上标。 改参考文献中的显示方法。记得加缩进的时候右下角可以调整是缩进一行还是缩进所有 当然还有其他很多种然后保存之后选择要引用的文献。然后打开word,将光标移动到要引用的句子那里。点击上方的endnoteX9,然后选择insert citation->insert selected citation。记得style要选择上一步改的那个。然后点更新引用即可。 引用完之后可以统一修改格式,如下所示: 在移除或者添加PDF之后已经要记得同步一下。 要添加新的引用格式,要把下载的格式文件ens保存在C:\Users\95619\Documents\EndNote\Styles中。如果没有这个文件夹,就在endnote中原有的格式随便改一个保存之后,就会出现这个文件夹。或者可以直接保存在endenote安装路径的style中

自己用curl写一个断点续传工具(windows安装Git Bash环境也可以用)

自己用curl写一个断点续传工具(windows安装Git Bash环境也可以用) 起因文件准备本机下载的脚本 起因 公司内网太垃圾,名义上是全国所有公司都用一个内网,但是不同地区之间的网速真是无语,50K/秒,这是回到拨号时代了吗。要把一个1G的wps企业版文件从其他城市下载到本地,靠浏览器基本没戏,断了n次后就放弃了。只能通过断点续传了,但是不想装迅雷之类的,想着自己搞一个断点续传弄一下就可以了。 文件准备 因为原始的文件是在公司云盘上,貌似不支持断点续传,主要是懒得实验,就先在其他城市的服务器上下载好文件,然后搭建nginx,作为文件服务器。nginx的配置如下: server { listen 888; server_name localhost; location /files { alias D:\Download\files; autoindex on; } } 用浏览器试一下,应该可以看到文件了: http://10.10.10.10:888/files 本机下载的脚本 一个简单的bash脚本,用到了awk和curl,都是基础命令,windows下完全可以不用装cygwin,直接下载、安装git bash就可以了。 URL=http://10.10.10.10:888/files/wps.zip FNAME=wps.zip BLOCKSIZE=`echo | awk '{print 1024*1024}'` POS=0 DONE=0 touch $FNAME rm $FNAME while [ "$DONE" != "1" ] do POS2=`echo $POS $BLOCKSIZE | awk '{print $1+$2-1}'` curl $URL -r $POS-$POS2 > $FNAME.part if (( $? )) then echo fail, try again... sleep 1 continue fi CHECK=`grep "

Mysql面试基础知识(全)

来源: 作者:程序员大彬 链接:MySQL面试题总结_笔经面经_牛客网 来源:牛客网 本文目录: 事务的四大特性?数据库的三大范式事务隔离级别有哪些?索引 什么是索引?索引的优缺点?索引的作用?什么情况下需要建索引?什么情况下不建索引?索引的数据结构Hash索引和B+树索引的区别?为什么B+树比B树更适合实现数据库索引?索引有什么分类?什么是最左匹配原则?什么是聚集索引?什么是覆盖索引?索引的设计原则?索引什么时候会失效?什么是前缀索引?常见的存储引擎有哪些?MyISAM和InnoDB的区别?MVCC 实现原理?快照读和当前读共享锁和排他锁大表怎么优化?MySQL 执行计划了解吗?bin log/redo log/undo logbin log和redo log有什么区别?讲一下MySQL架构?分库分表什么是分区表?分区表类型分区的问题?查询语句执行流程?更新语句执行过程?exist和in的区别?MySQL中int(10)和char(10)的区别? truncate、delete与drop区别?having和where区别?什么是MySQL主从同步?为什么要做主从同步?乐观锁和悲观锁是什么?用过processlist吗? 作者:程序员大彬 链接:MySQL面试题总结_笔经面经_牛客网 来源:牛客网 一、事务的四大特性? 事务特性ACID:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚。一致性是指一个事务执行之前和执行之后都必须处于一致性状态。比如a与b账户共有1000块,两人之间转账之后无论成功还是失败,它们的账户总和还是1000。隔离性。跟隔离级别相关,如read committed,一个事务只能读到已经提交的修改。持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。 二、数据库的三大范式 第一范式1NF 确保数据库表字段的原子性。 比如字段 userInfo: 广东省 10086' ,依照第一范式必须拆分成 userInfo: 广东省 userTel:10086两个字段。 第二范式2NF 首先要满足第一范式,另外包含两部分内容,一是表必须有一个主键;二是非主键列必须完全依赖于主键,而不能只依赖于主键的一部分。 举个例子。假定选课关系表为student_course(student_no, student_name, age, course_name, grade, credit),主键为(student_no, course_name)。其中学分完全依赖于课程名称,姓名年龄完全依赖学号,不符合第二范式,会导致数据冗余(学生选n门课,姓名年龄有n条记录)、插入异常(插入一门新课,因为没有学号,无法保存新课记录)等问题。 可以拆分成三个表:学生:student(stuent_no, student_name, 年龄);课程:course(course_name, credit);选课关系:student_course_relation(student_no, course_name, grade)。 第三范式3NF 首先要满足第二范式,另外非主键列必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。 假定学生关系表为Student(student_no, student_name, age, academy_id, academy_telephone),主键为"学号",其中学院id依赖于学号,而学院地点和学院电话依赖于学院id,存在传递依赖,不符合第三范式。 可以把学生关系表分为如下两个表:学生:(student_no, student_name, age, academy_id);学院:(academy_id, academy_telephone)。 2NF和3NF的区别? 2NF依据是非主键列是否完全依赖于主键,还是依赖于主键的一部分。3NF依据是非主键列是直接依赖于主键,还是直接依赖于非主键。 三、事务隔离级别有哪些? 先了解下几个概念:脏读、不可重复读、幻读。

常用导航坐标系 及 转换关系 (理论+程序)

一、坐标系定义与符号约定 在捷联惯导中,涉及到多种坐标系,其中 惯性坐标系、地心地固坐标系、导航坐标系 的示意图如下: 下面给出常用的坐标系的定义 : 1)惯性坐标系(i 系): 以地球质心为原点, 轴指向地球自转轴, 轴位 于赤道面指向空间任意点, 轴与其构成右手系。 该坐标系不随地球自转而转动, 但是由于地球质心绕太阳公转以及太阳系绕银河系公转,因此,该系 不是绝对惯 性系, 然而这些影响十分微弱,低于惯导的噪声水平, 因而可以忽略不计,该系 可以认 为 是一个惯性系。 2)地心地固系(e 系): 与大地测量中的 ECEF 系一致 理解:某一时刻,载体在e系中的坐标 在 i 系的表达,可通过方向余弦矩阵( Direction Cosine Matrix, DCM) 实现,其表达如下: 3)地理坐标系 (Geographic Coordinate System): 是使用三维球面来定义地球表面位置,以实现通过 经纬度 对地球表面点位引用的坐标系。 一个地理坐标系包括 角度测量单位、本初子午线和参考椭球体三部分。在球面系统中,水平线是等 纬度线或纬线。垂直线是等经度线或经线。地理坐标系依据其所选用的本初子午线、参考椭球的不 同而略有区别。地理坐标系可以确定地球上任何一点的位置。首先将地球抽象成一个规则的逼近原 始自然地球表面的椭球体,称为参考椭球体,然后在参考椭球体上定义一系列的经线和纬线构成经 纬网,从而达到通过经纬度来描述地表点位的目的。需要说明的是经纬地理坐标系不是平面坐标系, 因为度不是标准的长度单位,不可用其直接量测面积长度。 地理坐标系 与 地心地固系(e 系)之间的转换关系如下: 程序如下: Eigen::MatrixXd llh2ecef(Eigen::MatrixXd data) // transform the llh to ecef { Eigen::MatrixXd ecef; // the ecef for output ecef.

IDEA如何打断点调试

文章目录 1. 设置断点2. 调试3. 调试的基本操作3.1 step over3.2 step into 跟 Force step into3.3 step out3.4 resume program3.5 mute breakpoints3.6 view breakpoints3.6 条件断点 编写代码的时候,有时候我们需要跟踪代码的运行情况,使用断点调试就是一个不错的方法,接下来介绍一下如何在IDEA中使用断点进行调试 1. 设置断点 直接在你需要打断点的代码的行号区域,点击,即可设置断点,如图所示 这里补充一下对断点的理解:断点打在代码的前面,例如11行的断点打在第11行代码的前面,意味着,当程序运行到11行代码的断点时,第11行代码其实并未运行 2. 调试 点击绿色的三角形进行运行程序,点击绿色的小瓢虫就是运行调试程序 程序就会进入调试界面,代码行处的断点标记,都变成了红色的箭头,蓝色的部分表示现在程序所停的行数 最下面的就是调试窗口,调试窗口的左边部分是方法栈,即越下面的方法是越早被调用的,调试窗口的右边部分是变量的值 3. 调试的基本操作 3.1 step over 在调试窗口的上方,含义为:进入下一步,如果当前行断点是一个方法,则不进入当前方法体内。即从代码行A,跳到下一行代码A + 1,并执行原来A行代码 例如: 现在执行到第12行代码(12行未执行),当前的map里只有一个元素,我们可以在下面的Variables中确认只有一个元素 当我们点击step over时:第12行内容被执行,map的size变为2,程序来到第13行 3.2 step into 跟 Force step into 这两个都是表示:进入下一步,如果当前行断点是一个方法,则进入当前方法体内。但有一点区别,step into 只针对自定义的方法,如果对应的方法是官方库的方法,并不会进入方法体内。但Force step into,无论方法是什么方法,都会进入到方法体中 举例: 当执行到第15行,一个自定义的函数时: 使用 step into 则进入了该方法体内 但如果是这种官方库的方法,则无法进入: 此时,如果需要进入到方法体中,则需要使用Force step into: 这里进入到hashmap中 3.3 step out 跳出,即我们在方法体中运行时,不想继续一行一行的运行,想直接回到上一层的方法中,则使用step out跳出

响应了WM_SetCursor消息,如何改变鼠标形状

响应了WM_SetCursor消息,这时, 改变鼠标形状的代码必须在这个消息里处理,在其他地方使用SetCursor已经不起作用了。 这个消息处理函数包含三个参数: afx_msg BOOL OnSetCursor( CWnd* pWnd, UINT nHitTest, UINT message ); pWnd 是消息处理者的窗口,一般NULL 表示当前对话框 nHitTest 鼠标处于窗口的哪一部分 我们可以使用pWnd->GetDlgCtrlID() 来获得当前鼠标所在位置的控件ID 比如,我们要想每个控件上的鼠标形状都不一样 ,怎么写呢? 可以用如下方式实现: BOOL CShowImageDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) { switch (pWnd->GetDlgCtrlID()) { case IDC_MOVE: SetCursor(LoadCursor(NULL,IDC_HAND)); break; case IDC_CSTATIC_PICTURE: SetCursor((HCURSOR)::LoadImage(NULL,"res//XiangPi.ico",IMAGE_ICON,20,20,LR_LOADFROMFILE)); break; ...... Default: SetCursor(LoadCursor(NULL,IDC_ARROW)); break; } return CDialog::OnSetCursor(pWnd, nHitTest, message); } 需注意的是: CStaic控件的属性Notify 必须要设置为TRUE 才能使得 当鼠标在 CStatic上时改变形状。 但是,当CStatic的属性Notify设置为TRUE时,其父窗口也就是包含这个控件的对话框就不能响应鼠标消息了,比如:不能响应左键按下消息 鼠标移动消息等。 有没有办法,既能使得光标可以改变形状,又能响应鼠标消息呢? 网上查时,很多人都说自己写一个继承自CStaic的类,在新类中处理鼠标消息,但是我只想修改鼠标形状,却还要再写个类,实在是有些麻烦。 有好的办法? 有。 方法是: 利用::GetCursorPos(pointPos); 获得光标所在的位置,然后判断光标是否在控件内 BOOL CShowImageDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) { // TODO: 在此添加消息处理程序代码和/或调用默认值 CPoint pos; ::GetCursorPos(&pos); if(m_erase) { if(m_bControlUnit){ m_image.

HIT机器学习实验四降维R语言参考代码

##引入包 library(scatterplot3d) library(RSpectra) library(jpeg) library(animation) library(rgl) ##一键清空 rm(list=ls()) ##样本个数 num<-100 ##维度 v<-3 ##降维后维度 k<-2 ##设置x,y,z轴的旋转角度 angle1<-20/180*pi angle2<-15/180*pi angle3<-10/180*pi ##生成符合高斯分布的数据 x1<-rnorm(100,mean=1,sd=1.8) x2<-rnorm(100,mean=2,sd=1.9) x3<-rnorm(100,mean=4,sd=1.7) ##数据旋转 Rx<-matrix(c(1,0,0, 0,cos(angle1),-sin(angle1), 0,sin(angle1),cos(angle1)),nrow=3,ncol=3,byrow=TRUE) Ry<-matrix(c(cos(angle2),0,sin(angle2), 0,1,0, -sin(angle2),0,cos(angle2)),nrow=3,ncol=3,byrow=TRUE) Rz<-matrix(c(cos(angle3),-sin(angle3),0, sin(angle3),cos(angle3),0, 0,0,1),nrow=3,ncol=3,byrow=TRUE) X<-matrix(c(x1,x2,x3),nrow=v,ncol=num,byrow=TRUE) X<-Rz%*%Ry%*%Rx%*%X XX<-X ##显示原始数据的分布 scatterplot3d(X[1,],X[2,],X[3,],main='1.4.1') plot3d(XX[1,],XX[2,],XX[3,],col=rainbow(12),size=5) ##对样本正则化 for(i in 1:v){ total<-0 for(j in 1:num){ total<-total+X[i,j] } total<-total/num X[i,]<-X[i,]-total } ##特征值分解 C<-X%*%t(X) ev<-svd(X) vec<-ev$v[,order(ev$d,decreasing = TRUE)] val<-ev$d[order(ev$d,decreasing = TRUE)] ##取前k个特征向量 P<-t(vec[,1:k]) ##计算低维坐标系的投影 Y<-P%*%t(X)%*%XX plot(Y[1,],Y[2,],main='1.4.3', xlab='x1', ylab='x2',col="red") ##重构样本集 YY<-matrix(0,nrow=v,ncol=num)

HIT机器学习实验三聚类R语言参考代码

library(scatterplot3d) ##一键清空 rm(list=ls()) ##打印颜色的函数 color<-function(Y1,num){ colo<-rep("black",num); cl<-c("green","red","blue","yellow") for (i in 1:num){ colo[i]<-cl[Y1[i]] } return (colo) } ##K-means聚类 kmeans<-function(num,k,v,Y,X,Y2,e){ ##从样本集中选择k个样本为初始均值向量 samp<-sample(1:num,k) for (i in 1:k){ Y[,i]<-X[,samp[i]] } repeat{ for (i in 1:num){ ##计算样本与各均值向量的距离 distance<-rep(0,k) for(j in 1:k){ distance[j]<-norm(matrix(X[,i]-Y[,j])) } ##根据最近的均值向量确定各样本的标记 Y2[i]<-which.min(distance) } ##更新均值向量 oldY<-Y Y<-matrix(rep(0,v*k),nrow=v,ncol=k,byrow=TRUE) for(i in 1:num){ Y[,Y2[i]]<-Y[,Y2[i]]+X[,i] } numt<-rep(0,k) for(i in 1:k){ numt[i]<-sum(Y2==i) } for(i in 1:k){ Y[,i]<-Y[,i]/numt[i] } ##若变化小于精度,返回 cat(norm(oldY-Y)) if(norm(oldY-Y)<e) break; } return (list(one=Y2,two=Y)) } P<-function(x,Y,xfc,v){

HIT机器学习实验二逻辑回归R语言参考代码

##一键清空 rm(list=ls()) ##Sigmoid函数 Sigmoid<-function(z){ return (1/(1+exp(-z))) } ##计算p(y=1|x) P1<-function(x,w){ return (1-Sigmoid(t(w)%*%x)) } ##计算梯度函数 l1<-function(x,w,d,n,y){ i<-0 h<-cbind(rep(0,n+1)) repeat{ i<-i+1 h<-h-x[,i]%*%(y[i,]-P1(x[,i],w))/d if(i==d){ break } } return (h) } ##计算梯度函数(带惩罚项) L1<-function(x,w,d,n,y,k){ i<-0 h<-cbind(rep(0,n+1)) repeat{ i<-i+1 h<-h-x[,i]%*%(y[i,]-P1(x[,i],w))/d if(i==d){ break } } return ((h+k*w)) } ##生成海森矩阵函数 l2<-function(x,w,d,n){ i<-0 h<-matrix(0,nrow=n+1,ncol=n+1) repeat{ i<-i+1 h<-h+x[,i]%*%t(x[,i])%*%(P1(x,w)[1,1]*(1-P1(x,w))[1,1]*diag(n+1))/d if(i==d){ break } } return (h) } ##生成海森矩阵函数(带惩罚项) L2<-function(x,w,d,n,k){ i<-0 h<-matrix(0,nrow=n+1,ncol=n+1) repeat{ i<-i+1 h<-h+x[,i]%*%t(x[,i])%*%(P1(x,w)[1,1]*(1-P1(x,w))[1,1]*diag(n+1))/d if(i==d){ break } } return (h+k*diag(n+1)) } ##牛顿法优化函数

hive学习小结

目录 一、函数学习1、concat拼接函数2、concat_ws()3、FROM_UNIXTIME函数4、UNIX_TIMESTAMP()函数5、NVL()函数6、group by分组7、collect_set函数8、size函数9、sumif函数的语法格式 二、SQL正则表达式1、元字符2、正则表达函数2.1 `regexp_like(x,pattern[,match_option])`2.2 regexp_instr(x,pattern[,start[,occurrence[,return_option[, match_option]]]]) 2.3 REGEXP_SUBSTR(x,pattern[,start[,occurrence[, match_option]]]) 2.4 REGEXP_REPLACE(x,pattern[,replace_string[,start[,occurrence[, match_option]]]]) 三、hive数仓数据重复性检查1、如何快速确认某一字段是否有重复值1.1 cnt 没有去重,order_cnt 去重, 如果得到结果相同,则表是没有重复1.2 根据待确认字段进行分组,订单号不能有大于1的情况,就代表没有重复1.3 如果数据有重复,如何查找出来重复的字段信息呢? 2、如何去除重复值2.1 hive表中某些数据是整行的重复,而且字段过多时:2.2 两行数据只有一个字段不一样:2.3 当表中字段不多,而且数据是某些字段重复,可通过row_number():2.4 在某些情况中我们不是需要全部字段,而是仅仅过滤出某些不重复的字段: 3、row_number() OVER (PARTITION BY COL1 ORDER BY COL2) 四、常见Shell快捷操作 一、函数学习 1、concat拼接函数 将多个字符串连接成一个字符串。 concat(str1, str2,…) 返回结果为连接参数产生的字符串,如果有任何一个参数为null,则返回值为null。 但是输入sql语句麻烦了许多,三个字段需要输入两次逗号,如果10个字段,要输入九次逗号…麻烦死了啦,有没有什么简便方法呢?——于是可以指定参数之间的分隔符的concat_ws()来了!!! 2、concat_ws() 和concat()一样,将多个字符串连接成一个字符串,但是可以一次性指定分隔符~(concat_ws就是concat with separator) concat_ws(separator, str1, str2, …) 说明:第一个参数指定分隔符。需要注意的是分隔符不能为null,如果为null,则返回结果为null。 3、FROM_UNIXTIME函数 FROM_UNIXTIME(unix_timestamp,format) unix_timestamp为需要处理的时间戳(该参数是Unix 时间戳),可以是字段名,也可以直接是Unix 时间戳字符串。format为需要转换的格式 mysql官方手册的解释为:返回’YYYY-MM-DD HH:MM:SS’或YYYYMMDDHHMMSS 格式值的unix_timestamp参数表示,具体格式取决于该函数是否用在字符串中或是数字语境中。若format 已经给出,则结果的格式是根据format 字符串而定。format的格式和日常的编程语言的时间格式是保持一致的。 mysql> select FROM_UNIXTIME(1344954515,'%Y-%m-%d %H:%i:%S'); +-----------------------------------------------+ | FROM_UNIXTIME(1344954515,'%Y-%m-%d %H:%i:%S') | +-----------------------------------------------+ | 2012-08-14 22:28:35 | +-----------------------------------------------+ 1 row in set (0.

Greedy algorithm

贪心算法的基本思想: 贪心总是作出当前看来最好的选择,也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。 贪心算法的基本要素: 1.贪心选择性质: 所谓贪心选择性质是指求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是贪心算法可行的第一个基本要素,也是与dp的主要区别。 a. dp通常以自下而上的方式解各种子问题,而贪心算法则通常以自顶向下的方式进行,以迭代的方式作出相继的贪心选择,每作一次贪心选择就将所求问题简化为规模更小的子问题。 b. 对于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所作的贪心选择最终导致问题的整体最优解。 2.最优子结构性质(上篇dp已经介绍) Activity-Selection Problem(活动选择问题) Problem Description :Given a set A = {a1, a2, …, an} of n activities with start and finish times (si, fi), 1 ≤ i ≤ n, select maximal set S of “non-overlapping” activities. 通俗: 调度竞争共享资源的多个活动的问题,目标是选出一个最大的互相兼容的活动集合。假定有一个 n 个活动的集合 S={a1,a2,a3…,an},这些活动使用同一个资源(例如同一个阶梯教室),而这个资源在某个时刻只能供一个活动使用。每个活动 ai 都有一个开始时间 si 和一个结束时间 fi,其中 si<fi<无穷。如果被选中,活动 ai 发生在半开时间区[si,fi)期间。如果两个活动 ai 和 aj满足[si,fi)和[sj,fj)不重叠,则称它们是兼容的。也就是说,若 si>=fj,或sj>=fi,则 ai 和 aj 是兼容的。在活动选择问题中,希望选出一个最大兼容活动集。 DP思想: 用S(1, i)表示啊a1~ai的最大兼容活动集合问题,首先假设其子问题空间是一维的, 即 S(1, i)的最优解由 S(1, i-1)的最优解构成。但是发现 S(1, i)的最优解可能是由 S(2, i-1) 或是 S(3,i-1)的最优解构成。因此,会发现子问题空间是一维是不够的, 子问题空间是二维的;其子问题空间是二维的,对于活动 S(i, j), 需要做出 j-i-1 种选择;