ML学习基础+笔记 / 元旦快乐 【长期更新】

写在开头

这个博客于其说是博客。。不如说更像OneNote之类的东西了呀,下次弄个离线加个搜索就真的成Note了2333,或者哪天自己心情好写个客户端emm正好可以练手C#

而且大部分的博文,与其说是博文,不如说是手账比较好。毕竟基本都线性更新的。同时也因为博客的不相关性,导致我忘记了之前挖的好多坑。。。看来确实得改一改了。不过在这里之前,我想起了之前好多个文章里都有类似的挖坑宣言,但是似乎好像什么都忘了hhhhh。

不过说到底还是因为利益驱动不够。看来人不能太勤奋。太勤奋的后果就是能把一些好点子给咕了,只要不影响原有功能情况下基本都懒得动他hhhh,这到底是勤奋还是怠惰呢?还是说更新之后的效果和不更新的付出所得不成正比呢emmmm

好吧脑子有点乱,不说这些了。

高三过去了,因为艺考+高考双重打击,让我之前学的ML都忘得差不多了。现在才记起来,准备试着捡起来。我也不知道我能坚持多久,因为我这个专业木有高数。真希望去计算机相关的专业啊。

顺带说下元旦快乐。这也是期末考之前最后快乐的时光了。

期末考要背的东西好多emmm,专业考试倒是完全不方。主要就是讨厌背啊emmmmm。算了,咕咕咕,先研究一波ML先。

本期内容束博主才学浅陋的一点自我总结,如果是随手翻到此博客的朋友们请酌情观看或者阅读,因为没有认真里结果,所以可能会有一些或者许多错误,还望大家多多包涵/指正,感谢大家。

以下是纯概念性理解。

我的理解

监督性学习

首先是需要一定量的数据,用来“教”程序,之后使用不同的特征提取算法,用得出的结果去和那些教来的数据比对。

发现不对,利用梯度下降法,来微调W和basis,也就是跳权重。之后再去计算,和最后的数据去比对,这也就是跑了一次训练。

就这样一直跑下去,直到最后跑出来的数据无限接近于得出的数据。那么这个网络就训练成功了(?)

emmmm就这么简单吗?还是说我理解错了emmmm。

作用范围

两种,一种是用来预测,一种是用来分类。

比方说是f(y) = ax + bx +c ,运用第一种,就能算处无限接近于a,b还有c这几个参数。这样,也就可以预测出f(y)这个函数。

还有一种是,在一组向量空间中,分布着不同的区域,每个区域代表一个分类。

先假设f(y)已经训练完成。

把y当作特征输入,得出不同的结果,然后对比这个数据在向量空间的所处位置,得出一个所选分类。

大多数的数字识别基本都是这样子的。

其中的问题

听说梯度下降那边可能会有很多解法,但是我看书里好像说不能一直是全局最优解,否则会有啥问题来着的?这个记不清了

非监督性学习

这个真的忘了,待我学习一波。。。

线性相关,线性不相关,线性不可分

线性相关主要就是一个激励值(激励函数请看下面)相关问题。类似于Y随着X改变而改变,类似于一个一次函数。

线性不相关主要是因为资源问题而考虑,X和Y所代表的激励不可能无限大下去。会随着某些因素而导致速率变慢甚至停止。一般都是一些特殊的数学函数,常见的鄙俗sigmod等等。

线性不可分大体就是让你一层神经网络区分不了,那么再多套几层的意思咯。(?)

应该吧。等我复习到了的时候再说XD

误差反向传递

这个也忘了。。

激励函数

激励函数的作用就是,更具传入不同的东西,调整当前得到的权重。

比如你目的是区分美女,那么关于是否是妹子的特征被传到这层神经网络时候,会更具激励函数,来瞬间提高/降低所得出来的值并且传到下一层。

如果按照向量空间所代表的分布来看的话,可以想象你最后结果所在的位置,因为这个激励函数结果的暴增/减,而更靠近/远离美女所处的向量空间。

当然区分这些肯定不只一层解决的事。需要很多层的共同努力,比方说处理脸部的层呀,身材的层呀等等。。所以对于激励函数的选择就很重要啦。

哎好后悔书都在家里。

未完待续

Tags: 笔记, 基础

GalgameOl设计笔记

2017-07-23 00:08

直接提供图片算了,简单粗暴
乱做的示意图.png


2017-07-21 23:15

重大更新,因为不考虑ons引擎,只考虑自己的了,所以得先设计语法,明天zai'shuo


结构如下:

PY后端:

  • manage.py 用户处理websocket事件
  • resolve.py 用于处理引擎

前端就是基础三件套。
目前支持语法
["mov","goto","dwave","bgm","bgmstop","bg","if","SEL","end","fin","gosub"]

可识别语法:
["mov","goto","dwave","print","bgm","lsp","bgmstop","wait","textclear","bg","if","SEL","end","fin","gosub","br"]

通信通过WebSocket通信。

过程:

前端->{dat:游戏脚本路径或者特殊标号}
->后端:

  • 是否第一次运行? 找到第一个游戏段,解析;解析段地址为前端给予的地址
  • 解析

-返回成指定数据格式`
->前端:

  • 数据格式拆包
  • 显示给用户
  • 遇到SEL/END ->发送下一个章节的代码段(代码段在SEL语句里有)->跳转到最上方

后端解析方式:

更具前端返回,判断是否有cs?
有:读取指定的cs段 ; 没有:从第一个cs段开始解析
读入cs端,逐行解析

两个for迭代循环命令,判断语句是否带有上面的可识别命令

遇到执行命令,append到指定的列表中去(bgm,bg,voice等等),并记录文字列表的长度(好让前端知道什么时候显示

如果全都不是,那么认为为文字(文字之前没有任何命令,print什么的都没有,就直接显示)

append到文字列表

持续到逐行全部解析结束
打包成指定数据格式
通过websocket发送给前端

指定数据格式结构:

一段json:

{
    "str":[文本i,文本j....文本n],
    "flag":{用户所包含的文本地址},(这个参数请下一次请求时也请原封不动的传递上来)
    "bgm":{int:资源地址,int:'资源地址'},
    "voice":{int:'资源地址',int:'资源地址'}, 
    "Dwave":{同上},
    "bg":{同上},
    "Next":下一章节标题名,
}

dict格式{int:资源地址},其中int和list 显示文本一一对应。
后期扩展(如特效等等):延长json长度,后面加入更多的特效指令和list对应。
其中,Next一般是SEL语句或者是直接下一章的章节名,如果是SEL语句请更具用户的选择来返回对应的Next。

完整流程:

第一次运行游戏请用ws传递json {"dat":游戏脚本}
同时,ws端将会返回一大段的

{
    "str":[文本i,文本j....文本n],
    "flag":{用户所包含的文本地址},(这个参数请下一次请求时也请原封不动的传递上来)
    "bgm":{i:资源地址,j:'资源地址'},
    "voice":{k:'资源地址',n:'资源地址'},    (ijkl均为int,对应着文本i,j,k,l..)
    "Dwave":{同上},
    "bg":{同上},
    "Next":下一章节标题名,  (这个也请原封不动的传递上来)
}

不同的是Next有时候并不会返回章节名,也许会返回选择支,例如

SEL "敲门","今天这先这样吧","*CA_0","*CA_1"

请更具用户的选择修改给函数传递的cs内容。当然,也有会其他类型的文本

error 说明脚本编写错误,请直接停止游戏,因为脚本无法继续运行下去了

GameEnd/End/Fin 说明已经通关到达结局

传递消息
第二次运行时请传递json {"flag":上一次返回的,"cs",也是上一次返回的} 均为上次返回的值
注意cs可能更具SEL的选择支进行改变
返回的内容同上


2017/5/30更新

程序项目新地址:https://git.oschina.net/gaoshi_team/galgame_server

如你们所见基本没怎么动。

把那个很蠢的函数判断方法换了,用了你个略魔幻的方法
QQ图片20170530181645.png

Tags: 笔记