moluuser's Blog - Python
type: channel
link: https://archive.moluuser.com/tag/Python
items: 聚类算法概述
items: GPT-2中文文本训练及生成
items: Django入门
items: PHP调用Python
items: Python批量生成体育笔记
items: Python处理DNA序列
items: Python+PyQt+SQLite实现的小程序

聚类算法概述
type: item
date: 2021-01-23T08:23:00+00:00
description: 什么是聚类？使用场景算法解析聚类算法一种典型的无监督学习算法，主要用于将相似的样本自动归到一个类别中。在聚类算法中根据样本之间的相似性，将样本划分到不同的类别中，对于不同的相似度计算方法，会得到不同的聚类结果，常用的相似度计算方法有欧式距离法。聚类算法与分类算法最大的区别聚类算法是无监督的学习算法，而分类算法属于监督的学习算法。无监督：无标签有监督：有标签K-MeansK-Means算法接受一个参数K，表示将数据集中的数据分成K个聚类。在同一个聚类中，数据的相似度较高；而不同聚类的数据相似度较低。K-Means算法的步骤为：步骤一：选择任意K个数据，作为各个聚类的质心，（质心也可以理解为中心的意思），执行步骤二。步骤二：对每个样本进行分类，将样本划分到最近的质心所在的类别，执行步骤三。步骤三：取各个聚类的中心点作为新的质心，执行步骤二进行迭代。迭代的结束条件当新的迭代后的聚类结果没有发生变化。当迭代次数达到预设的值。流程作为新质心，重新聚类，一次上述流程。收敛：设置指定迭代次数。当质心变化微乎其微时。由于每次都要计算所有样本与每一个质心之间的相似度，故在大规模的数据集上，K-Means算法的收敛速度比较慢。测试代码：import numpy as np import matplotlib.pyplot as plt from sklearn import metrics from sklearn.datasets import make_blobs # X为样本特征，Y为样本簇类别， 共1000个样本，每个样本4个特征，共4个簇，簇中心在[-1,-1], [0,0], [1,1], [2,2]， 簇方差分别为[0.4, 0.2, 0.2] X, Y = make_blobs(n_samples=1000, n_features=2, centers=[[-1, -1], [0, 0], [1, 1], [2, 2]], cluster_std=[0.4, 0.2, 0.2, 0.2], random_state=9) plt.scatter(X[:, 0], X[:, 1], marker='o') plt.show() from sklearn.cluster import KMeans y_pred = KMeans(n_clusters=2, random_state=9).fit_predict(X) plt.scatter(X[:, 0], X[:, 1], c=y_pred) plt.show() # 用Calinski-Harabasz Index评估的聚类分数 print(metrics.calinski_harabasz_score(X, y_pred)) from sklearn.cluster import KMeans y_pred = KMeans(n_clusters=3, random_state=9).fit_predict(X) plt.scatter(X[:, 0], X[:, 1], c=y_pred) plt.show() print(metrics.calinski_harabasz_score(X, y_pred)) from sklearn.cluster import KMeans y_pred = KMeans(n_clusters=4, random_state=9).fit_predict(X) plt.scatter(X[:, 0], X[:, 1], c=y_pred) plt.show() print(metrics.calinski_harabasz_score(X, y_pred))结果：效果衡量SSE：误差平方和SSE(左图) < SSE(右图)肘部法Elbow method就是“肘”方法：对于n个点的数据集，迭代计算k from 1 to n，每次聚类完成后计算每个点到其所属的簇中心的距离的平方和。平方和是会逐渐变小的，直到k=n时平方和为0，因为每个点都是它所在的簇中心本身。在这个平方和变化过程中，会出现一个拐点也即“肘”点，下降率突然变缓时即认为是最佳的K值。import numpy as np from sklearn.cluster import KMeans from scipy.spatial.distance import cdist import matplotlib.pyplot as plt # 生成数据 cluster1 = np.random.uniform(0.5, 1.5, (2, 10)) cluster2 = np.random.uniform(3.5, 4.5, (2, 10)) X = np.hstack((cluster1…

GPT-2中文文本训练及生成
type: item
date: 2020-10-24T02:20:00+00:00
description: 前排感谢这个开源项目：https://github.com/Morizeyao/GPT2-Chinese记录下运行以上项目的流程。运行环境导入语料由于使用单一文本进行训练，只需要把数据集放置在./data/train.json即可。如果需要合并txt文本，使用批处理type *.txt>>all.txt即可。模型训练python train_single.py --raw文本生成python ./generate.py --length=400 --nsamples=4 --prefix=xxx --fast_pattern --save_samples --save_samples_path=/mnt/xx参数说明--length：参数为生成文本的长度。 --prefix：生成文章的开头。 --fast_pattern：如果生成的length参数比较小，速度基本无差别，默认不采用fast_pattern方式。 --save_samples：默认将输出样本直接打印到控制台，传递此参数，将保存在根目录下的samples.txt。 --save_samples_path：可自行指定保存的目录，默认可递归创建多级目录，不可以传递文件名称，文件名称默认为samples.txt。结果这里model使用的是hughqiu训练生成模型，感谢分享。Others可能需要修改的地方在train.py中： #lines = json.load(f) lines = f.readlines() #full_tokenizer.max_len = 999999其他类似开源项目https://github.com/hughqiu/GPT2-Chinesehttps://github.com/jianyq/Tong-Musichttps://github.com/GaoPeng97/transformer-xl-chinesehttps://github.com/yangjianxin1/GPT2-chitchat

Django入门
type: item
date: 2020-07-15T09:00:00+00:00
description: BeginPython下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。项目目录结构 |--project |--__init__.py 空文件 |--settings.py 项目的配置文件 |--urls.py 路由定义 |--wsgi.py 与服务器对接 本地化settings.py内 LANGUAGE_CODE = 'en-us' TIME_ZONE = 'UTC' 修改为： LANGUAGE_CODE = 'zh-hans' TIME_ZONE = 'Asia/Shanghai' 新建静态目录网站通常需要提供类似图片，JavaScript 或 CSS 的额外文件服务。在 Django 中，我们将这些文件称为“静态文件”。Django 提供了 django.contrib.staticfiles 帮你管理它们。添加以下配置： STATIC_URL = '/static/' # 新建static文件夹 STATICFILES_DIRS = os.path.join(BASE_DIR, "static") 数据库配置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'mydatabase', 'USER': 'mydatabaseuser', 'PASSWORD': 'mypassword', 'HOST': '127.0.0.1', 'PORT': '5432', } } 详见：https://docs.djangoproject.com/zh-hans/3.0/ref/settings/#std:setting-DATABASES服务启动python manage.py runserver 0.0.0.0:8080外部访问：ALLOWED_HOSTS = ['*']创建APPpython manage.py startapp user创建后项目目录会存在user文件夹Hello world在user/views.py内 from django.http import HttpResponse def index(request): return HttpResponse('Hello World!') 在urls.py内 from user import views urlpatterns = [ path('admin/', admin.site.urls), path('', views.index), ] 在Django2.0前用url(r'正则表达式', '视图函数')路由在 settings.py内的 ROOT_URLCONF = 'untitled1.urls'找到 urls.py路由表路由传参在views内 def show_article(requset, num, name): return HttpResponse(str(num)+name) 在urls内 path('article/<int:num><str:name>', views.show_article), [scode type="share"]函数 path() 具有四个参数，两个必须参数：route 和 view，两个可选参数：kwargs 和 name。现在，是时候来研究这些参数的含义了。path() 参数： routeroute 是一个匹配 URL 的准则（类似正则表达式）。当 Django 响应一个请求时，它会从 urlpatterns 的第一项开始，按顺序依次匹配列表中的项，直到找到匹配的项。这些准则不会匹配 GET 和 POST 参数或域名。例如，URLconf 在处理请求 https://www.example.com/myapp/ 时，它会尝试匹配 myapp/ 。处理请求 https://www.example.com/myapp/?page=3 时，也只会尝试匹配 myapp/。path() 参数： view当 Django 找到了一个匹配的准则，就会调用这个特定的视图函数，并传入一个 HttpRequest 对象作为第一个参数，被“捕获”的参数以关键字参数的形式传入。稍后，我们会给出一个例子。path() 参数： kwargs任意个关键字参数可以作为一个字典传递给目标视图函数。本教程中不会使用这一特性。path() 参数： name为你的 URL 取名能使你在 Django 的任意地方唯一地引用它，尤其是在模板中。这个有用的特性允许你只改一个文件就能全局地修改某个 URL 模式。[/scode]主子路由在APP里新建 urls.py主路由中…

PHP调用Python
type: item
date: 2020-05-25T02:20:00+00:00
description: Begin想把之前的体育日记生成的Python脚本部署到线上，一开始想用Java，发现一头雾水啊，改用PHP，前端用的 bootstrap把Python脚本改为接收参数una = sys.argv[1] uno = sys.argv[2] ute = sys.argv[3] usex = sys.argv[4]PHP根据用户表单输入构造命令使用 shell_exec($cmd);来执行Python脚本用 zip命令打包// 这个函数是在网上查到的，找不到出处了 // 避免同一个学号多次使用而重复 function getRandomStr($len, $special=true){ $chars = array( "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" ); if($special){ $chars = array_merge($chars, array( "!", "@", "#", "$", "?", "|", "{", "/", ":", ";", "%", "^", "&", "*", "(", ")", "-", "_", "[", "]", "}", "<", ">", "~", "+", "=", ",", "." )); } $charsLen = count($chars) - 1; shuffle($chars); //打乱数组顺序 $str = ''; for($i=0; $i<$len; $i++){ $str .= $chars[mt_rand(0, $charsLen)]; //随机取出一位 } return $str; } $ran = $uno.getRandomStr(5, false).'.zip'; $zipcmd = 'zip -q -r '.$ran.' '.$uno; shell_exec($zipcmd);使用 shell_exec注意如果 php.ini中配置了使用安全模式，则无法使用。如果 php.ini中禁用的了该函数，也无法使用效果

Python批量生成体育笔记
type: item
date: 2020-05-23T10:14:00+00:00
description: Begin因为疫情不开学了，在家上体育课。老师非要写几十篇体育笔记。所以有了这个程序。使用Python-Docx处理Word文件。参照狗屁不通文章生成器的套路生成锻炼的感想。其他的都是固定的写法。一开始试着用了GPT2 Chinese训练好的现成模型，结果发现输入体育相关的关键词返回的是这样的段落这是用言情小说训练出来的模型？？运行结果代码[collapse title="使用到的JSON数据文件" status="false"]{"famous":["爱迪生a，天才是百分之一的勤奋加百分之九十九的汗水。b","毛泽东a，身体是革命的本钱。b","伏尔泰a，生命在于运动。b","查尔斯·史a，一个人几乎可以在任何他怀有无限热忱的事情上成功。b","培根说过，深窥自己的心，而后发觉一切的奇迹在你自己。b","歌德曾经a，流水在碰到底处时才会释放活力。b","戴尔·卡耐基a，多数人都拥有自己不了解的能力和机会，都有可能做到未曾梦想的事情。b","白哲特a，坚强的信念能赢得强者的心，并使他们变得更坚强。b","伏尔泰a，不经巨大的困难，不会有伟大的事业。b","富勒曾经a，苦难磨炼一些人，也毁灭另一些人。b","文森特·皮尔a，改变你的想法，你就改变了自己的世界。b","拿破仑·希尔a，不要等待，时机永远不会恰到好处。b","塞涅卡a，生命如同寓言，其价值不在与长短，而在与内容。b","奥普拉·温弗瑞a，你相信什么，你就成为什么样的人。b","吕凯特a，生命不可能有两次，但许多人连一次也不善于度过。b","莎士比亚a，人的一生是短的，但如果卑劣地过这一生，就太长了。b","笛卡儿a，我的努力求学没有得到别的好处，只不过是愈来愈发觉自己的无知。b","左拉a，生活的道路一旦选定，就要勇敢地走到底，决不回头。b","米歇潘a，生命是一条艰险的峡谷，只有勇敢的人才能通过。b","吉姆·罗恩a，要么你主宰生活，要么你被生活主宰。b","日本谚语a，不幸可能成为通向幸福的桥梁。b","海贝尔a，人生就是学校。在那里，与其说好的教师是幸福，不如说好的教师是不幸。b","杰纳勒尔·乔治·S·巴顿a，接受挑战，就可以享受胜利的喜悦。b","德谟克利特a，节制使快乐增加并使享受加强。b","裴斯泰洛齐a，今天应做的事没有做，明天再早也是耽误了。b","歌德a，决定一个人的一生，以及整个命运的，只是一瞬之间。b","卡耐基a，一个不注意小事情的人，永远不会成就大事业。b","卢梭a，浪费时间是一桩大罪过。b","康德a，既然我已经踏上这条道路，那么，任何东西都不应妨碍我沿着这条路走下去。b","克劳斯·莫瑟爵士a，教育需要花费钱，而无知也是一样。b","伏尔泰a，坚持意志伟大的事业需要始终不渝的精神。b","亚伯拉罕·林肯a，你活了多少岁不算什么，重要的是你是如何度过这些岁月的。b","韩非a，内外相应，言行相称。b","富兰克林a，你热爱生命吗？那么别浪费时间，因为时间是组成生命的材料。b","马尔顿a，坚强的信心，能使平凡的人做出惊人的事业。b","笛卡儿a，读一切好书，就是和许多高尚的人谈话。b","塞涅卡a，真正的人生，只有在经过艰难卓绝的斗争之后才能实现。b","易卜生a，伟大的事业，需要决心，能力，组织和责任感。b","歌德a，没有人事先了解自己到底有多大的力量，直到他试过以后才知道。b","达尔文a，敢于浪费哪怕一个钟头时间的人，说明他还不懂得珍惜生命的全部价值。b","佚名a，感激每一个新的挑战，因为它会锻造你的意志和品格。b","奥斯特洛夫斯基a，共同的事业，共同的斗争，可以使人们产生忍受一切的力量。 b","苏轼a，古之立大事者，不惟有超世之才，亦必有坚忍不拔之志。b","王阳明a，故立志者，为学之心也；为学者，立志之事也。b","歌德a，读一本好书，就如同和一个高尚的人在交谈。b","乌申斯基a，学习是劳动，是充满思想的劳动。b","别林斯基a，好的书籍是最贵重的珍宝。b","富兰克林a，读书是易事，思索是难事，但两者缺一，便全无用处。b","鲁巴金a，读书是在别人思想的帮助下，建立起自己的思想。b","培根a，合理安排时间，就等于节约时间。b","屠格涅夫a，你想成为幸福的人吗？但愿你首先学会吃得起苦。b","莎士比亚a，抛弃时间的人，时间也抛弃他。b","叔本华a，普通人只想到如何度过时间，有才能的人设法利用时间。b","博a，一次失败，只是证明我们成功的决心还够坚强。 维b","拉罗什夫科a，取得成就时坚持不懈，要比遭到失败时顽强不屈更重要。b","莎士比亚a，人的一生是短的，但如果卑劣地过这一生，就太长了。b","俾斯麦a，失败是坚忍的最后考验。b","池田大作a，不要回避苦恼和困难，挺起身来向它挑战，进而克服它。b","…

Python处理DNA序列
type: item
date: 2020-05-21T13:15:00+00:00
description: Begin使用Python处理DNA序列，本质上就是 IO操作和 字符串处理。代码使用菜单和用户进行交互获取DNA序列在https://www.ncbi.nlm.nih.gov/可以下载处理操作生成DNA互补序列本质上是CG, AT的互换生成DNA反向序列reverse字符串即可生成DNA反向互补序列在互补的基础下reverse检测GC含量GC字符占字符串长度的比例DNA转录为RNAT换为U即可运行[collapse title="可测试使用的DNA序列" status="false"]GAGTAGTCCCTTCGCAAGCCCTCATTTCACCAGGCCCCCGGCTTGGGGCGCCTTCCTTCCCCATGGCGGG ACACCTGGCTTCGGATTTCGCCTTCTCGCCCCCTCCAGGTGGTGGAGGTGATGGGCCAGGGGGGCCGGAG CCGGGCTGGGTTGATCCTCGGACCTGGCTAAGCTTCCAAGGCCCTCCTGGAGGGCCAGGAATCGGGCCGG GGGTTGGGCCAGGCTCTGAGGTGTGGGGGATTCCCCCATGCCCCCCGCCGTATGAGTTCTGTGGGGGGAT GGCGTACTGTGGGCCCCAGGTTGGAGTGGGGCTAGTGCCCCAAGGCGGCTTGGAGACCTCTCAGCCTGAG GGCGAAGCAGGAGTCGGGGTGGAGAGCAACTCCGATGGGGCCTCCCCGGAGCCCTGCACCGTCACCCCTG GTGCCGTGAAGCTGGAGAAGGAGAAGCTGGAGCAAAACCCGGAGGAGGCAAGTGAGCTTCGACGGGGTTG GGGTGTGGGGAGGTGGTCATGACAGGGCAGCCTGATGGGGAAGTGGTCACCTGCAGCTGCCCAGACCTGG CACCCAGGAGAGGAGCAGGCAGGGTCAGCTGCCCTGGCCAGGGAGGGGTGTGTATCAACTGCTGGCAGCC CTGGCAGGCAGGGGCCAGGTGGGAAGTGGAAGCTGGATTTCGAAGAGACAACTGCCGGTGAGGGCAGAGC AGCCTGGGAGAGTCGGAAGCTGGCCCAGGCTGGCCTTTGCTCTGGCCCAGCCCTTGTCAGGGTCTCTCAC ATCTCCTAGGCCTGCCCAGGGTCTGGTCACTCATTACTGGCCCAGCACCAGACCCAGCTTGGGGTTGGTT TGAGCCCCTTTTCCCACCCTTAGTCCTGCTTGAAAATTTGACCCTTATCAGACCCAAGATTTTGGCCTTA GGGTTAAGCATAGCCTGAGGGTAAAAACAGTGCTCATTCCAGGATTATTGTTCCTGAAAGTCTAGGGTGT GACTCGTTTCTGATAGGATCTCCTGTTTGGGCTGTGTGTGTGCGCGTTGTGAGCTGGGTTTACCTCCAGT CAAGTATAGGGCTTGTCTTCCCCGGATCTCTGCCTCAGGCCAATGACTGGCCACTGTGTTAAGGTGCACA CCCTGGCACCCCTTGTAGAAAGCTGGATTTTGATTGACTTCAGCCTCAGTTCCAAAGTTGTAAACAAGAA AAATGGTGAGAGATTTCTCCAGGCCATTTGCAAATATAGAGCTGCTGCGGGATTGAAGGCATCCAGCCCT GCTGAGGACTATTAAAGATGTATCTTCCAGTCCTTCAAGGCGACAAGTGTAAGCAATTAGAGATTAAATA CTAAGCCTTGAGACCTCACAGAAAGGTGTGACTGGTTTCTGGAGTGACCGAGAAGCCCCAACCTCTTCGC AGGAGGTCACTGCTGAGCCTTGAATGATAATGGCTGGCAATTGTGGTCCACTTCCTAAGTGCCTGGCTGT GTGCTCCGTTTATACATCATTATCTCATTAACCAGCACAAAATCTCCTAGGGGGAGGTATTATTATCCTA TTTAACGGGTTTTAACTGCTAAATGATGAAGCGAGGATTTGGACCAGTGTTTATTCCAAAACCCCAAAAC AGAATTTGGAAAATCCAAGATAGCAGAGGGCATTTATCAGTTTGAGTTATTGGCTGAGCAGAAGTTGGGG ATGAAAACAGCCTATTTGAAATTGATATGATCAAGCACCATTGAAACACT…

Python+PyQt+SQLite实现的小程序
type: item
date: 2020-05-20T06:19:00+00:00
description: 花一上午帮同学写的期末作业大概写下流程记录下BeginGUI设计使用Qt Designer完成 .ui文件生成py文件 pyuic5 -o xx.py xx.ui代码管理端from PyQt5 import QtCore, QtGui, QtSql, QtWidgets import sys import sqlite3 import os from PyQt5.QtSql import QSqlDatabase, QSqlTableModel from PyQt5.QtWidgets import QApplication, QWidget # 管理界面GUI class manageUI(object): def setupUi(self, Form): Form.setObjectName("Form") Form.resize(1000, 400) Form.setFixedSize(Form.width(), Form.height()) self.tableView = QtWidgets.QTableView(Form) self.tableView.setGeometry(QtCore.QRect(10, 10, 981, 291)) self.tableView.setObjectName("tableView") self.gridLayoutWidget = QtWidgets.QWidget(Form) self.gridLayoutWidget.setGeometry(QtCore.QRect(10, 310, 481, 80)) self.gridLayoutWidget.setObjectName("gridLayoutWidget") self.gridLayout = QtWidgets.QGridLayout(self.gridLayoutWidget) self.gridLayout.setContentsMargins(0, 0, 0, 0) self.gridLayout.setObjectName("gridLayout") self.pushButton = QtWidgets.QPushButton(self.gridLayoutWidget) self.pushButton.setObjectName("pushButton") self.gridLayout.addWidget(self.pushButton, 0, 0, 1, 1) self.pushButton_2 = QtWidgets.QPushButton(self.gridLayoutWidget) self.pushButton_2.setObjectName("pushButton_2") self.gridLayout.addWidget(self.pushButton_2, 1, 0, 1, 1) self.gridLayoutWidget_2 = QtWidgets.QWidget(Form) self.gridLayoutWidget_2.setGeometry(QtCore.QRect(510, 310, 481, 80)) self.gridLayoutWidget_2.setObjectName("gridLayoutWidget_2") self.gridLayout_2 = QtWidgets.QGridLayout(self.gridLayoutWidget_2) self.gridLayout_2.setContentsMargins(0, 0, 0, 0) self.gridLayout_2.setObjectName("gridLayout_2") self.pushButton_3 = QtWidgets.QPushButton(self.gridLayoutWidget_2) self.pushButton_3.setObjectName("pushButton_3") self.gridLayout_2.addWidget(self.pushButton_3, 0, 0, 1, 1) self.pushButton_4 = QtWidgets.QPushButton(self.gridLayoutWidget_2) self.pushButton_4.setObjectName("pushButton_4") self.gridLayout_2.addWidget(self.pushButton_4, 1, 0, 1, 1) self.retranslateUi(Form) QtCore.QMetaObject.connectSlotsByName(Form) def retr…