首页
统计
关于
Search
1
Win10安装mingw64配置最新版gcc与gfortran环境
605 阅读
2
李芒果空岛-1.20.1-发展记录-05
580 阅读
3
108第一届中国象棋比赛
537 阅读
4
Savitzky-Golay滤波器原理-01
533 阅读
5
史瓦西黑洞最内稳定圆轨道计算
498 阅读
默认分类
技术经验
工作学习
娱乐爱好
闲言碎语
登录
Search
标签搜索
天文
Minecraft
李芒果空岛
空间物理学
macOS
数值计算
非线性最小二乘
typecho
Python
GSL
gcc
迭代法
Fortran
Halo
朗谬尔波
Langmiur
环法自行车赛
短波通信
PTCG
Win10
Washy
累计撰写
76
篇文章
累计收到
1
条评论
首页
栏目
默认分类
技术经验
工作学习
娱乐爱好
闲言碎语
页面
统计
关于
搜索到
76
篇与
的结果
2025-05-23
多张PNG合并成GIF
0 前言 最近的工作想生成一个GIF动画,但是使用python进行合并生成时,总是会遇到颜色失真的情况。百度+询问AI,给出了Pillow库和imageio库的方案,但不管如何调整参数都不会改善失真的情况。最终发现可以使用ffmpeg来解决,在此记录下。 1 安装ffmpeg M1 Mac可以使用Homebrew工具直接安装(网络需要魔法),首先更新下Homebrew brew update brew upgrade 安装ffmpeg brew install ffmpeg 等待安装结束后,使用如下命令打印版本号,输出版本号则安装成功 ffmpeg -version 2 编写Python脚本 终端中调用ffmpeg不太方便,使用python编写一个脚本进行PNG图片合并,如下 # coding: utf-8 # author: Washy # date: 2025/05/23 import os # 将需要合并的图片路径按顺序存储 def pngfilepath2txt(filepath, txtfilepath='png2gif.txt'): # 列举指定目录下的所有png filePng = [item for item in os.listdir(filepath) if item.endswith('.png')] # 对png名称进行排序 filePng = sorted(filePng) # 将路径存储为txt with open(txtfilepath, 'w') as f: for item in filePng: f.write(f"file '{filepath}/{item}'\n") # 生成终端命令 def get_ffmpeg_cmd(fps, outfilepath, txtfilepath='png2gif.txt'): # 每秒帧数 cmd0 = '-r %d ' % fps # concat cmd1 = '-f concat ' # 需要处理的文件路径 cmd2 = '-i %s ' % txtfilepath # 调色板 cmd3 = '-filter_complex ' \ + '"split[v1][v2]; [v1]palettegen[pal]; [v2][pal]paletteuse=dither=sierra2_4a" ' # 输出文件名 - 重名自动覆盖 cmd4 = outfilepath + ' -y' return 'ffmpeg ' + cmd0 + cmd1 + cmd2 + cmd3 + cmd4 # 主函数 def png2gif_main(pngfoldpath, giffilepath, fps=5, txtfilepath='png2gif.txt'): # 将png图片路径存储为txt pngfilepath2txt(pngfoldpath, txtfilepath) # 获取终端命令 cmd = get_ffmpeg_cmd(fps, giffilepath, txtfilepath) try: # 运行终端命令 os.system(cmd) except: raise Exception('ERROR: Create gif-file failed!') else: # 删除txt os.remove(txtfilepath) if __name__=="__main__": # 待合并png存储文件夹 pngfoldpath = "imgs/images" # 生成gif存储路径 giffilepath = '01.gif' # 帧率 fps = 5 # 生成gif png2gif_main(pngfoldpath, giffilepath, fps) 3 效果展示 python库合并结果 ffmpeg合并结果 参考 使用Python生成gif颜色失真。如何避免? ffmpeg之图片转gif
2025年05月23日
11 阅读
0 评论
0 点赞
2025-05-14
Zotero 7的安装与简单配置
0 前言 不知什么缘故,电脑偶尔会莫名其妙的卸载Zotero,昨天还用的好好的,今天就发现被卸载了。感觉是跟App Clear & Uninstall这个软件有关,上次莫名其妙的被卸载,也是用这个软件卸载过一个其他的软件。总之,再次被迫重新安装Zotero,然后发现Zotero 7已经不再支持ZotFile插件,去GitHub看了下发现ZotFile最后一次更新是2022年。众所周知,不会更新的工具,被淘汰只是早晚的事。好消息是发现了一个可以替代的插件。 之前在CSDN上写过的Zotero 6的安装教程已经落后,本博客基于之前的博客进行了更新修改。 2025/05/20 发现被卸载的原因了,App Clear & Uninstall会默认把Zotero判定为残留文件,因此在选择清理残留文件时,无意中就会把Zotero清理掉。 1 Zotero 7的安装与简单配置 1.1 下载 前往官网点击Download按钮跳转至下载界面。此处,以Mac版为例。截图如下 新版Zotero的图标比以前好看多了。同样的,右侧为浏览器插件,个人不太喜欢用那么多的插件,所以没装。 1.2 安装 双击下载好的Zotero-7.0.15.dmg文件,将Zotero拖拽至Drag Here to Install,如下图所示 打开启动台,当出现Zotero图标时,即为安装完成,此时可关闭安装界面。 1.3 同步设置 点击菜单栏Zotero-设置-同步输入账号密码(第一次使用先创建账号) 成功登录后如下图所示,取消勾选红框部分 每个账号官方仅提供了100M的云存储空间,在不额外购买的情况下,同步PDF附件显然是不够用的。我采用的方式是Zotero云同步项目信息,OneDrive同步附件(也可以使用其他的网盘),再通过相对位置链接到附件。 点击菜单栏Zotero-设置-高级-文件和文件夹,更改根目录为网盘文件夹下附件PDF的存储位置 1.4 其他 介绍下我喜欢使用的设置,仅供参考 点击菜单栏Zotero-设置-常规,取消勾选红框部分 2 插件 2.1 Attanger 简介:用于管理附件,自动将PDF(或其他文件)重命名,移动和附加到Zotero项目。ZotFile插件的替代品,功能类似。 链接:https://github.com/MuiseDestiny/zotero-attanger 安装:菜单栏Zotero-工具-插件,点击右上角设置符号Insatll Add-on from File,选择刚下载好的.xpi文件。 配置:菜单栏Zotero-设置-Attanger,更改【靶路径】根目录为1.3节最后一步根目录位置。为了兼容之前ZotFile插件修改过的文件,设置【子目录】为空,同时取消下方的单选框。 设置重命名规则:为了与ZotFile插件遗留文件命名方式保持一致,在点击【设置重命名规则】后,可以采用如下命名规则 {{ if {{ authorsCount > 2 }} }} {{ authors max="2" join="_" suffix="_et-al_" }} {{ else }} {{ authors join="_" suffix="_" }} {{ endif }} {{ year suffix="_" }} {{ title truncate="200" }} 需要注意authorsCount在7.1的版本才会支持,但当前版本为7.0.15(2025-05-14),所以该命名规则下与ZotFile还是有一点区别的。如果之前没使用过ZotFile插件,可以参照官方文档自定义命名规则。
2025年05月14日
11 阅读
0 评论
1 点赞
2025-04-12
简单的卧室布局设计
最近卧室移除了一个衣柜并增加了一个梳妆台,之前的布局显得很拥挤且不舒服。因此,在网上随便找一个在线平面设计平台简单绘制了卧室布局。根据设计调整后,房间舒适度增加了不少。下面是调整前后的对比。 调整前 调整后 2D 3D
2025年04月12日
21 阅读
0 评论
1 点赞
2025-04-07
对短波通信选频的思考
0 前言 最近几年接触并参与了几个短波通信选频的项目,从算法实现到服务界面设计,都有过深度参与的经历。但受限于各种因素,每次的设计在我看来都不是那么的完善和人性化。基于自己的经验和一些思考,简单谈下自己的一些认知和想法。 1 什么是短波通信选频 1.1 简要背景 1901年古列尔莫·马可尼(Guglielmo Marconi)首次实现跨洋通信的壮举,直接推动了无线通信技术的发展与实用化。随着现代对电离层反射的研究,短波(3–30 MHz)因F层反射效率高、损耗低,成为跨洋通信的主流频段。 1.2 简要原理 短波通信实际上是利用地面-电离层形成的类似波导管的结构,使得电磁波在电离层和地面之间来回反射,从而传播到几百甚至上千公里的距离。 1.3 选频场景 可以用以下两种场景覆盖选频的需求 当我们知道发射站、接收站位置以及电离层参数信息时,我们就可以通过理论或经验公式计算得到两地之间的可通频率范围,从而再根据理论或经验计算得到最佳的通信频率。 当我们知道发射站位置、通信频率以及电离层参数信息时,我们就可以通过理论或经验公式计算该频率可以传播到的空间范围,再根据损耗等参数信息,得到当前通信频率的最佳通信位置区间。 1.4 需要哪些技术和数据 电磁波传播路径计算:射线追踪技术、QPS模型下的传播路径公式、马丁等效原理、国际电联组织(ITU-R)提供的经验公式等 用途:根据站点位置、通信频率、电离层参数等信息,理论计算或经验估算电磁波的传播路径,从而判断当前频率是否有效 比较:从我的经验来看,以上这些技术所提供的结果不会有太大的区别,通常来说选择一种即可 成熟度:以上这些技术都比较成熟 电磁波损耗计算:这一块目前我只使用过ITU-R提供的经验公式进行过计算 用途:辅助判断电磁波的损耗是否严重,具体哪个可通频率的损耗最小 成熟度:在ITU-R官方文档中可查询,比较成熟 电离层参数:根据使用的技术不同,需求的具体参数也不同 射线追踪:通信时刻的三维电离层网格化数据(经度$\times$纬度$\times$高度) QPS模型下的传播路径公式:通信时刻的三维电离层网格化数据(经度$\times$纬度$\times$高度) 马丁等效原理:通信时刻反射点位置的电子密度剖面(若需要计算任意链路,约等于需要通信时刻的三维电离层网格化数据) ITU-R:通信时刻反射点位置的foF2、foF1、foE和M(3000)F2(若需要计算任意链路,约等于需要通信时刻前述各个参数的二维Map数据) 重要程度:由于选频技术已经非常成熟且区别不会很大,所以输入数据的好坏是影响选频结果好坏的关键所在。好的数据才能产出好的结果,差的数据什么技术也不好使。 分类:在应用场景,经常会出现现报和预报,选频的现报和预报则只与数据的现报和预报有关。现报:通常利用探测设备实时探测的电离层参数信息,实时同化处理成所需要的三维或二维电离层网格化数据,由于数据处理的复杂性,必然会存在一定的时间延迟;预报:通常利用已有的电离层模型,通过改变输入时间等参数,让模型输出所需要的三维或二维网格化数据,众所周知,目前的电离层模型准确度都不够高,所以预报结果只会是一个大致的估算结果,在电离层平静期可能不会有较大差距。 成熟度:无论哪种技术,对电离层参数的需求基本都是通信时刻全球(或重点区域)的三维或二维网格化数据。即便是现报,由于电离层探测设备不可能全空间覆盖,生成指定时刻准确的三维或二维网格化数据也是一件非常困难的事情。 2 工程化技术的选择 虽然前面提到了电离层三维网格化数据获取的困难性,但在一定误差范围内还是能做一些事情的。 2.1 选频技术的选择 首先,个人对纯经验模式是没那么推崇的,虽然可能效果短期内看起来还不错,但上限很有限且不够物理,所以排除ITU-R经验公式和马丁等效定理;其次,工程化过程中计算效率非常重要,过于复杂而导致时效性很差是得不偿失的,所以排除射线追踪技术(叠甲:对于优化很好、计算效率很高的射线追踪代码,肯定是优先考虑的)。那么就只剩下了QPS模型下的传播路径计算公式。 QPS模型是将电子密度剖面分为一段一段的抛物线,通过最小二乘拟合,得到一组最符合实际剖面的分段解析公式。将电子密度剖面解析的目的是对电磁波传播路径进行积分计算时,方便积分得到解析解。 QPS模型是上世纪提出的方法,从我目前的认知来看,或许完全不需要弄得这么复杂,当前数值方法很多且很成熟,直接使用数值解可能会更加的简单有效。 2.2 电离层参数的获取 现报 对于存在观测数据的情况,对观测数据进行同化处理,得到三维或二维网格化数据是一种很容易想到的方向。我对同化技术没有过研究,只了解之前项目用过的一种非常简单的方法。不过,同化技术已经发展了很多年,应该是有很多比较成熟的论文可以参考的。 预报 从我的经验来看,预报往往才是用户最想要的内容。很多时候,我们都是想提前知道未来某个时刻的通信状况如何。但这一点却是这个工程中最难的一点。 一种比较简单的处理方法是直接使用某个电离层模型未来时刻的输出作为对电离层参数的预报,这个方法在之前的项目中采用了很多次。 另外一种可能的方法是利用已有的电离层参数信息,采用深度学习等手段,训练生成未来时刻的电离层参数,就是不清楚对于三维空间网格,这种方法的难度和计算量会不会太大。 还有一种可能的方法是通过预报电离层模型输入参数,然后利用预报的模型输入参数驱动模型,从而生成预报的电离层参数,但我也从未对此进行过研究和调研。 结合现报的一种可能方法是通过预报观测台站位置的电离层数据,得到预报的台站数据,然后利用现报的同化模型,使用预报的台站数据同化得到预报的三维或二维网格化电离层参数。 2.3 选频结果 短波通信计算中有很多频率,如最大可用频率(MUF)、最低可用频率(LUF)、最高可能频率(HPF)、最佳工作频率(OWF)等,从我的经验来看,计算MUF和LUF就足够了,太多的频率参数反而会让用户很困惑。 除了频率外,大圆距离、传播模式、时延、损耗等也是比较重要的信息,能提供一定的辅助判断,最好也是能够输出的。 3 界面设计及展示思路 3.1 选频界面 对于1.3节中提到的第一个选频场景,可以设计如下界面: 通信时间:能够选择到某一天即可,不需要具体到时刻 发射站位置:可以直接输入经纬度坐标,也可以在地图中选点 接收站位置:可以直接输入经纬度坐标,也可以在地图中选点 开始计算:点击后,将上述表单信息传递给后端算法处理,自动计算通信时间那一天24h所有时刻的选频结果,时间分辨率最低1小时最高15分钟即可 折线图展示框:横坐标0至24h,纵坐标频率,折线图展示计算结果即可。如果能够计算损耗,采用二维彩图的形式将LUF到MUF之间的损耗或信噪比展示出来,效果会更好。 一次性计算24h的选频结果参考了VOACAP的设计思路,同时选频有明显的日变化,一天的数据也更有利于展示,使展示结果更加的美观。 对于现报和预报的区分,我觉得不需要在界面上显示出来,设定好时间后,让后台算法自动区分识别即可,这种处理可以避免前端过多冗余、复杂的选项。 3.2 指定频率传播范围 对于1.3节中提到的第二个选频场景,可以设计如下界面: 通信时间:需要具体到某个时刻,与电离层数据的时间分辨率有关(如30分钟) 通信频率:指定某个通信频率,3~30MHz之间 发射站位置:可以直接输入经纬度坐标,也可以在地图中选点 开始计算:点击后,将上述表单信息传递给后端算法处理,自动计算通信时间发射站向四周辐射的选频结果 二维地图展示:以发射站为中心,展示四周可通信范围,大致应该是个环状结构。如果可以计算损耗或信噪比,则对可通范围进行上色处理,效果会更好。 3.3 小结 个人觉得选频界面有上面两个就足够了,当然也可以根据需求自定义一些界面,如典型链路、电离层参数展示等界面。 4 后记 短波通信选频很多时候可能并不能够满足用户的所有需求,还需要一些对短波通信环境判断的辅助手段,如根据太阳活动、地磁活动等数据的反应,分析处理成一份有一定时效性和简单易懂结论的报告或指数。之前也参与了一部分相关内容的项目,也有一些思考和想法,以后有时间再写一写。 个人觉得研究应该是带着解决某个问题或疑问的目的去进行的,最终结果应该是实实在在的为某个问题的解决提供了帮助,或者解开了心中对未知领域的部分疑惑。过于追求新颖、独特,带来的未必就是有用的、有效的、实在的内容。 记得初中有一次数学课,老师讲解证明两个直角三角形全等的问题(已知斜边和直角边相等),给了两种证明方法。激发了不少同学提出新解法的兴趣,然后大家一起提出了好几种证明过程复杂且冗余的方法(我贡献了两三个= =),比如先用勾股定理计算另外一条直角边,再通过arctan计算斜边旁边的一个角,然后通过SAS证明全等。作为一时思考的乐趣固然很有意思,但从实际角度来说,HL定理已经是前人总结后最简单有效的方法了。
2025年04月07日
25 阅读
0 评论
1 点赞
2025-04-03
浅谈小智AI项目
0 前言 几个月前,B站Up主牛逼的虾米开源了小智AI项目,在互联网上掀起了轩然大波,很多人下场跟风制作。在接触了一些信息后,浅谈下我对这个项目的认知。 1 小智AI是什么 虾哥开源的小智AI是一个实时语音对话项目,用户可以通过麦克风与AI进行实时对话。 硬件:主要包括麦克风、扬声器、显示器和ESP32芯片。麦克风用来接入用户的语音,扬声器用来播放AI的回答,显示器用来实时显示AI回答的文字,芯片则是调度处理各种硬件的输入输出以及调用各种模型。 软件:主要包括语音转文本、大语言模型(LLM)和文本转语音(TTS)。语音转文本用来对麦克风输入的语音进行识别,并转为文本信息;LLM在输入上一步得到的文本信息后,经过分析处理返回输出文本并通过显示器展示;此外,输出文本还将经过TTS模型,转化为特定的音色进行输出并通过扬声器播放。 2 目前存在的一些问题 目前市面上基本都倾向于将小智AI做的很小,基本在AirPods充电盒的尺寸附近。这也就导致硬件部分包含电池的话,会使得电池所能占据的体积非常有限,也就意味着电池容量的续航很有限。以我购买的虾哥C3版本为例,充满电只够连续对话5分钟左右,使得不得不一直插着电源线,与便携反而背道而驰。 软件方面,由于目前LLM发展极为迅速,GPT、千问、DeepSeek等作为“大脑”,已经能够达到非常“聪明”的程度。同时,商业化TTS模型方面表现也极为出众,可以从目前各种AI配音的沙雕动画、小说等感受到。但语音转文本模型在我实际体验下来不是那么的友好。由于语音存在方言、口音差异、同音词、发音不准等各方面的问题,使得语音识别结果不是那么的准确。特别是在进行跨语种交流时,识别效果极为差劲,经常反复重复了好几遍也没有识别准确, 3 可能存在的市场需求 语音陪伴:该项目主要功能就是能够连续对话,所以作为无聊时的聊伴再合适不过了。 英语家教:通过TTS选择合适的音色之后,可以发出非常标准的英语,因此在一些时候用来学习英语口语是非常不错的。同理,也可以用来学习任意语种。 实时翻译:如出国旅游的时候,随身携带一个进行实时翻译,应该还是比较方便的。 4 项目开源地址 小智AI 小智AI服务器
2025年04月03日
54 阅读
0 评论
1 点赞
2024-09-27
【GFZ】地磁指数与太阳指数
0 前言 介绍如何下载德国地学中心GFZ提供的地磁行星3小时Kp指数、相关地磁指数和太阳指数。 1 GFZ-FTP 1.1 Kp_ap_Ap_SN_F107 Python爬虫源码如下 import os import socket from ftplib import FTP from ftplib import error_perm ##----------------------------------------------------------------------## # INFO: ftp网站连接 ##----------------------------------------------------------------------## # Outputs: # ftp - ftp根目录 ##----------------------------------------------------------------------## # author: Washy # date: 2024/09/27 ##----------------------------------------------------------------------## def ftp_connect(): # FTP站点 host = 'ftp.gfz-potsdam.de' # 端口号 port = 21 # 文件夹路径 folderpath = '/pub/home/obs/Kp_ap_Ap_SN_F107' ftp = FTP() ftp.encoding = 'utf-8' try: ftp.connect(host, port) ftp.login() ftp.cwd(folderpath) except(socket.error, socket.gaierror): # ftp 连接错误 print("ERROR: cannot connect [{}:{}]".format(host, port)) return None except error_perm: # 用户登录认证错误 print("ERROR: user Authentication failed ") return None return ftp def is_ftp_file(ftp_conn, filename): try: if filename in ftp_conn.nlst(os.path.dirname(filename)): return True else: return False except error_perm: return False # 连接服务器 ftp = ftp_connect() # 需要下载的文件名 filename = "Kp_ap_Ap_SN_F107_2024.txt" # 下载文件 with open(filename, 'wb') as f: ftp.retrbinary('RETR ' + filename, f.write, 1024) # 断开服务器 ftp.close() 下载的数据格式示例如下 # PURPOSE: This file distributes the geomagnetic planetary three-hour index Kp and associated geomagnetic indices as well as relevant solar indices. # LICENSE: CC BY 4.0, except for the sunspot numbers contained in this file, which have the CC BY-NC 4.0 license # SOURCE: Geomagnetic Observatory Niemegk, GFZ German Research Centre for Geosciences # PLEASE CITE: Matzka, J., Stolle, C., Yamazaki, Y., Bronkalla, O. and Morschhauser, A., 2021. The geomagnetic Kp index # and derived indices of geomagnetic activity. Space Weather, https://doi.org/10.1029/2020SW002641 # # Kp, ap and Ap # The three-hourly equivalent planetary amplitude ap is derived from Kp and the daily equivalent planetary amplitude Ap is the daily mean of ap. # Kp is unitless. Ap and ap are unitless and can be multiplied by 2 nT to yield the average geomagnetic disturbance at 50 degree geomagnetic latitude. # Kp, ap and Ap were introduced by Bartels (1949, 1957) and are produced by Geomagnetic Observatory Niemegk, GFZ German Research Centre for Geosciences. # Described in: Matzka et al. (2021), see reference above. # Data publication: Matzka, J., Bronkalla, O., Tornow, K., Elger, K. and Stolle, C., 2021. Geomagnetic Kp index. V. 1.0. GFZ Data Services, # https://doi.org/10.5880/Kp.0001 # Note: the most recent values are nowcast values and will be replaced by definitive values as soon as they become available. # # International Sunspot Number SN # The international sunspot number SN (written with subscript N) is given as the daily total sunspot number version 2.0 introduced in 2015. # The sunspot data is available under the licence CC BY-NC 4.0 from WDC-SILSO, Royal Observatory of Belgium, Brussels. Described in: # Clette, F., Lefevre, L., 2016. The New Sunspot Number: assembling all corrections. Solar Physics, 291, https://doi.org/10.1007/s11207-016-1014-y # Note: the most recent values are preliminary and replaced by definitive values as soon as they become available. # # F10.7 Solar Radio Flux # Local noon-time observed (F10.7obs) and adjusted (F10.7adj) solar radio flux F10.7 in s.f.u. (10^-22 W m^-2 Hz^-1) is provided by # Dominion Radio Astrophysical Observatory and Natural Resources Canada. # Described in: Tapping, K.F., 2013. The 10.7 cm solar radio flux (F10.7). Space Weather, 11, 394-406, https://doi.org/10.1002/swe.20064 # Note: For ionospheric and atmospheric studies the use of F10.7obs is recommended. # # Short file description (for a detailed file description, see Kp_ap_Ap_SN_F107_format.txt): # 40 header lines, all starting with # # ASCII, blank separated and fixed length, missing data indicated by -1.000 for Kp, -1 for ap and SN, -1.0 for F10.7 # YYYY MM DD is date of UT day, days is days since 1932-01-01 00:00 UT to start of UT day, days_m is days since 1932-01-01 00:00 UT to midday of UT day # BSR is Bartels solar rotation number, dB is day within BSR # Kp1 to Kp8 (Kp for the eight eighth of the UT day), ap1 to ap8 (ap for the eight eighth of the UT day), Ap, SN, F10.7obs, F10.7adj # D indicates if the Kp and SN values are definitive or preliminary. D=0: Kp and SN preliminary; D=1: Kp definitive, SN preliminary; D=2 Kp and SN definitive # # # The format for each line is (i stands for integer, f for float): #iii ii ii iiiii fffff.f iiii ii ff.fff ff.fff ff.fff ff.fff ff.fff ff.fff ff.fff ff.fff iiii iiii iiii iiii iiii iiii iiii iiii iiii iii ffffff.f ffffff.f i # The parameters in each line are: #YYY MM DD days days_m Bsr dB Kp1 Kp2 Kp3 Kp4 Kp5 Kp6 Kp7 Kp8 ap1 ap2 ap3 ap4 ap5 ap6 ap7 ap8 Ap SN F10.7obs F10.7adj D 2024 01 01 33603 33603.5 2596 25 0.667 0.333 0.667 1.333 2.000 3.000 3.333 4.000 3 2 3 5 7 15 18 27 10 54 135.7 131.2 1 2024 01 02 33604 33604.5 2596 26 2.667 2.333 0.667 2.000 2.333 2.667 2.000 0.667 12 9 3 7 9 12 7 3 8 66 142.1 137.4 1 2024 01 03 33605 33605.5 2596 27 2.667 2.667 1.000 1.667 1.667 2.667 3.333 3.000 12 12 4 6 6 12 18 15 11 57 140.2 135.5 1 2024 01 04 33606 33606.5 2597 1 1.333 0.667 1.667 0.667 0.667 1.333 1.000 2.667 5 3 6 3 3 5 4 12 5 98 125.8 121.6 1 2024 01 05 33607 33607.5 2597 2 2.000 1.667 0.333 1.000 1.333 1.667 0.333 0.333 7 6 2 4 5 6 2 2 4 117 152.7 147.6 1
2024年09月27日
342 阅读
0 评论
1 点赞
2024-08-06
K-means聚类算法原理
0 前言 聚类是数据处理中常用的分析方法,此处简单介绍下K-means聚类算法原理。 1 K-means算法 1.1 算法简介 K-means标准算法是1957 年史都华·劳埃德(Stuart Lloyd)作为一种脉冲码调制的技术所提出,但直到1982年才被贝尔实验室公开出版在“ IEEE Transactions on Information Theory”中,原始文献为“Least square quantization in PCM”。术语“k-均值”于1967年才被詹姆斯·麦昆(James MacQueen) 在文献“Some methods for classification and analysis of multivariate observations”中提出,描述 K-means算法的完整理论并进行了详细的研究。 1.2 算法思想 K-means算法,又称K均值算法,其中K表示聚类簇数,means表示取每个簇所有数据的均值作为该簇的中心(或者称质心)。K-means算法的核心思想是将数据集中的n个对象划分为K个聚类,使得每个对象到其所属聚类的中心(或称为均值点、质心)的距离之和最小。这里所说的距离通常指的是欧氏距离,但也可以是其他类型的距离度量。 1.3 算法流程 对于待分类的数据X,随机选取K个簇中心 计算各个数据与各个簇中心的“距离”,并将各个数据划分至相距最近的簇 根据划分好的簇,计算每个簇的数据均值作为新的簇中心 重新计算所有数据与新的簇中心的“距离”,并重新分类 重复上述步骤,直至收敛 1.4 数学表达 假设存在一系列散点$X_i = (x_i,y_i)$,需要将其划分至$K$个簇 随机选择$K$个簇中心$(x_j,y_j)$,其中$j=1,2,\dots,K$ 计算$X_i$到各个簇中心的欧式距离(也可以是其他距离,此处以欧式距离为例),并将$X_i$划分至$r_{i,j}$最小的簇$S_k$ $$ r_{i,j} = \sqrt{(x_i-x_j)^2 + (y_i - y_j)^2}, \quad j=1,2,\dots,K. $$ 重新计算每个簇的均值作为新的簇中心 $$ x_k = \sum_{x_i \in S_k} x_i / N(S_k), \quad y_k = \sum_{y_i \in S_k} y_i / N(S_k), \quad k = 1,2,\dots,K. $$ 其中$S_k$表示第$k$个簇所包含的数据,$N(S_k)$表示第$k$个簇所包含的数据个数。 重复上述步骤,直至新的簇中心与旧的簇中心没有差异 1.5 实例演示 import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import make_classification # 定义数据集 X, _ = make_classification(n_samples=1000, n_features=2, n_informative=1, n_redundant=0, n_clusters_per_class=1, random_state=1) # 根据欧氏距离将数据X分成两类 def rho_p1_p2(X,p1,p2): nums = X.shape[0] l1 = [] l2 = [] for idx in np.arange(nums): rho1 = np.linalg.norm(X[idx,:] - p1) rho2 = np.linalg.norm(X[idx,:] - p2) if rho1<rho2: l1.append(idx) else: l2.append(idx) return l1,l2 # 随机中心一 p1 = np.array([-2,-2]) # 随机中心二 p2 = np.array([2,2]) # 绘图 plt.figure(figsize=[15,8],dpi=300) # 第一幅图为原始数据 plt.subplot(2,3,1) plt.scatter(X[:,0],X[:,1]) for idx in np.arange(20): # 根据当前簇中心进行分类 l1,l2 = rho_p1_p2(X,p1,p2) # 计算新的簇中心 tmp1 = np.mean(X[l1,:],0) tmp2 = np.mean(X[l2,:],0) # 每进行一次分类绘制一次分类后的图像 plt.subplot(2,3,idx+2) plt.scatter(X[l1,0],X[l1,1]) plt.scatter(X[l2,0],X[l2,1]) # 判断中心是否发生变化 if np.linalg.norm(tmp1-p1)<1e-6 and np.linalg.norm(tmp2-p2)<1e-6: print(idx) break # 将簇中心替换为新的簇中心 p1 = tmp1 p2 = tmp2 plt.show() 可以看出随着迭代此次数的增加,数据逐渐被分为两类。 2 拓展 2.1 “距离”计算方法 曼哈顿距离(Manhattan Distance) $$ d(x,y) = \sum_{i=1}^n \vert x_i - y_i \vert $$ 欧几里得距离(Euclidean Distance) $$ d(x,y) = \sqrt{\sum_{i=1}^n (x_i - y_i)^2} $$ 切比雪夫距离(Chebyshev Distance) 切比雪夫距离起源于国际象棋中国王的走法,国际象棋中国王每次只能往周围的8格中走一步,那么如果要从棋盘中A格(x1,y1)走到B格(x2,y2)最少需要走几步?你会发现最少步数总是max(|x2-x1|,|y2-y1|)步。 $$ d(x,y) = \max \vert x_i - y_i \vert $$ 闵氏距离(Minkowski Distance) 对于点$x=(x_1,x_2,\dots,x_n)$ 与点$y=(y_1,y_2,\dots,y_n)$,闵氏距离可以用下式表示: $$ d(x,y) = \left( \sum_{i=1}^n \vert x_i - y_i \vert^p \right)^{1/p} $$ 闵氏距离是对多个距离度量公式的概括性的表述,p=1退化为曼哈顿距离;p=2退化为欧氏距离;切比雪夫距离是闵氏距离取极限的形式。 参考 K均值(K-means)聚类算法(Python3实现代码) python机器学习 | 聚类算法之K-Means算法介绍及实现 【机器学习-14】K-means聚类算法:原理、应用与优化 全面归纳距离和相似度方法(7种)
2024年08月06日
219 阅读
0 评论
0 点赞
2024-06-21
Ubuntu安装gcc及gsl库
1 安装gcc 使用如下命令安装gcc,等待安装成功即可 sudo apt install gcc 若提示报错,大概率是没有更改镜像源,可参考博客Ubuntu修改源进行修改 2 安装gsl 前往GSL官网下载GSL-latest最新版本,可从下面任意链接进入FTP网站 最近的GNU镜像 GNU FTP主站点 将压缩包解压至任意路径 打开终端进入解压路径,使用如下命令进行安装,等待安装成功即可 ./configure sudo make sudo make install 如果./configure步骤提示找不到命令,则是因为权限不够,使用sudo chmod +x configure命令添加权限即可 参考 linux命令行为什么输入sudo ./configure提示找不到命令
2024年06月21日
206 阅读
0 评论
1 点赞
2024-06-21
Ubuntu修改源
0 前言 记录下Ubuntu使用的一些基本操作。 1 修改源 使用默认源会因为网络问题无法正常更新、安装包等,因此需要修改为国内镜像,国内镜像链接如下(任选一个即可): # 清华 http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ # 中科大 http://mirrors.ustc.edu.cn/ubuntu/ # 阿里云 http://mirrors.aliyun.com/ubuntu/ # 网易 http://mirrors.163.com/ubuntu/ 1.1 直接修改 使用如下命令打开文件,并将其中所有的链接修改为国内源链接 sudo vi /etc/apt/sources.list 1.2 代码修改 使用如下命令,将【默认源】修改为【清华源】 sudo sed -i 's/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list 如果源已被修改,只需对应替换链接,如将【清华源】修改为【中科大源】 sudo sed -i 's/mirrors.tuna.tsinghua.edu.cn/mirrors.ustc.edu.cn/g' /etc/apt/sources.list 2 更新包管理器 修改为国内源之后,使用如下命令更新包管理器 sudo apt-get update sudo apt-get upgrade 参考 Ubuntu修改源镜像方法(22.04也能用)附带常用源镜像地址 终端一行命令更换ubuntu国内镜像源
2024年06月21日
207 阅读
0 评论
1 点赞
2024-06-17
Mac安装gsl库及配置
0 前言 前段时间在Mac上运行C程序,需要调用gsl库,使用过程中遇到一些问题,在网上找了不少博客才解决,在此记录下。 1 安装gsl库 首先需要安装Homebrew和gcc,可参考Mac安装Homebrew和M1芯片Mac安装gcc 使用brew命令安装gsl(2024-06版本为2.7.1) brew install gsl 等待安装完成即可 默认安装路径为/opt/homebrew/Cellar/gsl/2.7.1 2 配置gsl库 进入终端,打开根目录下的.zprofile文件 vim .zprofile 在文件末尾添加头文件路径至C检索目录 export C_INCLUDE_PATH=$C_INCLUDE_PATH:/opt/homebrew/Cellar/gsl/2.7.1/include 在文件末尾添加链接库至检索C/C++目录 export LIBRARY_PATH=$LIBRARY_PATH:/opt/homebrew/Cellar/gsl/2.7.1/lib 保存并关闭文件,然后重新加载 source .zprofile 在终端输入如下命令(cpp-13是因为我安装的gcc版本是13.x),如果能看到/opt/homebrew/Cellar/gsl/2.7.1/include路径,则说明头文件路径已经能够被检索 cpp-13 -v 在终端输入如下命令,返回值一致则说明链接库已经配置成功 # 命令 gsl-config --libs # 返回值 -L/opt/homebrew/Cellar/gsl/2.7.1/lib -lgsl -lgslcblas 3 补充 3.1 clang与GNU GCC M1 Mac默认安装有clang用于编译C程序,因此直接使用gcc调用的是clang,测试如下 # 命令 gcc -v # 返回值 Apple clang version 15.0.0 (clang-1500.3.9.4) Target: arm64-apple-darwin23.4.0 Thread model: posix InstalledDir: /Library/Developer/CommandLineTools/usr/bin 如果想调用GNU GCC,则需要加上版本号,如13.x版本加上-13,测试如下 # 命令 gcc-13 --version # 返回值 gcc-13 (Homebrew GCC 13.2.0) 13.2.0 Copyright (C) 2023 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 确定GNU GCC的版本号,可以用gfortran的版本查看,返回值中13.2.0即为当前安装的GNU GCC版本 # 命令 gfortran --version # 返回值 GNU Fortran (Homebrew GCC 13.2.0) 13.2.0 Copyright (C) 2023 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. clang与GNU GCC在某些命令上存在差异,因此是不能直接互相替代的,比如-fopenmp命令在前者会报错 3.2 其他调用方式 如果不使用第2节的配置,可以使用-I和-L直接指定头文件和链接库路径,只需在编译时加入如下命令即可 -I/opt/homebrew/Cellar/gsl/2.7.1/include -L/opt/homebrew/Cellar/gsl/2.7.1/lib 参考 cmake 添加头文件目录,链接动态、静态库 LINUX中编译C/C++指定头文件和链接库的搜索路径 【C++编译】gcc的-l参数和-L参数 GCC -l选项:手动添加链接库
2024年06月17日
410 阅读
0 评论
1 点赞
1
2
...
8