Sinet v1.0.7.04 更多数据类型 Numpy更新

因为蜜獾大佬说这个库确实是有点冗杂,并且文件大小因为一些人工智能项目的加入显得很臃肿,因此之后会专门开几个专刊将Sinet拆分成数据类型和库的形式,但这个系列还是会照常更新。

写在最前

Sinet库经过四次迭代之后总代码量超过14000+行(包括YAML的话),确实是有点臃肿,打包大小约为100m+,所以拆分肯定是要有的,因此我之后会发几个专刊将现有Sinet拆分。由于Sinet是持续更新并且相互之间有些依赖关系比较复杂,我个人更喜欢Sinet包含所有,因此在专刊中关于一些类可能会有功能上的删减。为了更好地体验,建议自己去理解源码去选择合适的搭配,我个人感觉源码整体上还是比较美观的。

重要更新概览

这次主要更新了Numpy和一些Python常用的基础函数

看下面关于贝叶斯推断Python部分源码和AHK源码的比较

Python
import numpy as *
def words2Vec(vecList, inputWords) :
	resultVec = [0] * len(vecList)
	for word in inputWords :
		if word in vecList :
			resultVec[vecList.index(word)] += 1
		else :
			print('没有发现此单词')
	
	return array(resultVec)
AHK
words2Vec(vecList, inputWords)
{
    resultVec := List(0)
    resultVec.multiple(vecList.Length)
    
    For word in inputWords
    {
        if Sinet.In(vecList, word) !== "Not Found"
            resultVec[Sinet.List.Index(vecList, word) - 1] += 1
        
        else
            print('没有发现此单词')
    }
    
    return Numpy.array(resultVec)
}

可以看到在代码层面对于各类Python的语句都有着转换函数。这也是Sinet创造的初衷。再看一段更相似的,除了在四则运算时需要用到函数外,其余功能基本复刻。

def trainNB(trainMatrix, trainClass) :
	numTrainClass = len(trainClass)
	numWords = len(trainMatrix[0])
	
	p0Num = ones(numWords)
	p1Num = ones(numWords)

	p0Words = 2.0
	p1Words = 2.0

	for i in range(numTrainClass) :
		if trainClass[i] == 1 :
			p1Num += trainMatrix[i]
			p1Words += sum(trainMatrix[i])
		else :
			p0Num += trainMatrix[i]
			p0Words += sum(trainMatrix[i])

	p0Vec = log(p0Num / p0Words)
	p1Vec = log(p1Num / p1Words)

	pClass1 = sum(trainClass) / float(numTrainClass)
	return p0Vec, p1Vec, pClass1
AHK
trainNB(trainMatrix, trainClass)
{
    numTrainClass := trainClass.Length
    numWords := trainMatrix[0].array.Length
    
    p0Num := Numpy.ones([numWords])
    p1Num := Numpy.ones([numWords])
    
    p0Words := 2.0
    p1Words := 2.0
    
    For i in Range(numTrainClass)
    {
        if trainClass[i] == 1
        {
            p1Num := Numpy.Plus(p1Num, trainMatrix[i])
            p1Words += Numpy.sum(trainMatrix[i])
        }
        
        else
        {
            p0Num := Numpy.Plus(p0Num, trainMatrix[i])
            p0Words += Numpy.sum(trainMatrix[i])
        }
    }
    
    p0Vec := Numpy.log(Numpy.Div(p0Num, p0Words))
    p1Vec := Numpy.log(Numpy.Div(p1Num, p1Words))
    
    pClass1 := Numpy.sum(trainClass) / float(numTrainClass)
    
    Return [p0Vec, p1Vec, pClass1]
}

顺便附一张运行结果图,这个是NLP类的贝叶斯推断。

Sinet v1.0.7.04 更多数据类型 Numpy更新

更新日志

v1.0.6.29
1.更新Sinet类
(1)引入Sinet.Algorithm.LucasKanad(Number:=-1,Video:=0,Show:=”mask”)用于进行稀疏光流跟踪。无返回值。
Show参数包括mask,Frame,Img。
(2)引入大量CV2.。。_Init()函数,用于初始化OpenCV相关类。
(3)引入Sinet.CV2.DNNImage(Image,Type:=”Caffe”,Model:-1,Show:=1)函数调用DNN进行图像检测分类。

v1.0.6.30
1.更新Sinet类
(1)引入Sinet.CV2.ImageMatch(Image,ImageTemp,Compare:=0,Show:=1)函数用于在Image中匹配ImageTemp。
返回值为一个List()类型列表,依次包含x、y、Width、Height。若Compare参数为1,则返回值包含匹配图与原图的相似度。
**注意Image大小需大于ImageTemp。建议使用前自行估计Temp在原图中大小,进行CV2.Resize(Temp,Width,Height)。

2.新增类Numpy,原附加于Sinet类中的Numpy同步废弃。(保留在源码中,但不再更新方法)
与Python相比,Numpy类预计不会加入任何类型转换相关的函数方法(这是由于AHK对于数据类型的弱检测性)

3.新增函数Dynloop_Loop(Data)用于解析二维嵌套动态数组的枚举问题。

Data := List(List(1, 2), List(3, 4, 5), List(6, 7, 8, 9))
Lst1 := Dynloop_Loop(Data)
Print Lst1

v1.0.7.01
1.更新Sinet类
(1)优化Sinet.Math.Base函数,现在支持二进制转十进制,同时十进制转二进制结果统一为8的倍数位。
(2)优化Sinet.String.Decode函数,现在Url解码支持中文。
(3)优化Sinet.String.Encode函数,现在Url加密支持中文。
(4)更新Sinet.Algorithm.Curve,引入DTW算法,若求取二维数组相关度,请保证x值一一对应,且y值长度相等。

Print Sinet.Algorithm.Curve([0.5,0.7,0.9,5.4,1.7,6.2],[5.5,3.3,4.5,6.7,5.8,2.1],"DTW")

**注意:取值越接近0相关度越好。
(5)引入Sinet.Algorithm.NLP函数用于收纳NLP相关算法实现。

2.更新Numpy类
(1)通过Numpy.array([…])初始化,类型为Numpy.NDArray
(2)自有属性包括ndim、shape、size
(3)支持通过”:”对该类型数组切片访问和修改值。

a := Numpy.array([[1,2,3],[1,2,3]])
print a["1:2"]

**注意由于AHK对象赋值办法比较弱,目前修改值仅支持三个层次。(最新版本支持无限维)
(4)逐步引入Python类似函数,目前支持Numpy.Sqrt、Numpy.Zeros、Numpy.Ones、Numpy.Size,用法与python一致
同时自写Numpy.Numbers(Shape,Number:=1)Number参数用于设定初始化值。

v1.0.7.02
1.更新Nunpy类
(1)引入自有函数Sum,Reshape。
(2)引入函数Numpy.Plus(NDArray*)用于多NDArray加法。

v1.0.7.03
1.更新Nunpy类
(1)引入自有函数Copy、Ravel、Transpose。
(2)引入函数Numpy.Transpose(NDArray)用于NDArray转置。
(3)优化修改值体验,现在支持无限维度。
(4)更新Numpy.Random类,包括函数Rand,Randn,Randint,(Randi,Randf)。

2.更新Sinet类
(1)引入Sinet.Algorithm.BoxMuller(Number)算法,用于生成符合标准正态分布随机数。
(2)引入Sinet.Random.Randn(Number),用于生成符合标准正态分布的随机数。
(3)引入Sinet.Math.Factorial(Number)用于计算数值阶乘,返回值为字符串(ahk中字符串用于数值计算时会自动转义)
**注意:该函数可进行大数运算,1000阶乘计算耗时约2秒。
(4)引入Sinet.Math.Combination(Population,Individual)和Sinet.Math.Permutation(Population,Individual)用于计算组合数和排列数
参数分别表示总体和个体,返回值为字符串(ahk中字符串用于数值计算时会自动转义)
**注意:该函数可进行大数运算,Sinet.Math.Combination(1000,500)计算耗时为毫秒级。

3.新增类ListNode类,用于进行链表操作。后续会引入Leetcode关于链表的好的算法。

nums := List(1, 4, 2, 7, 8, 5, 4)
head := ListNode(nums[0])
tmp := head
nums.RemoveAt(1)
for i in nums
{
    cur_node := ListNode(i)
    tmp.next := cur_node
    tmp := tmp.next
}
print(head)

while head
{
    print(head.val)
    head := head.next
}

4.新增测试类ProMath,用于解决概率论相关问题。
**注意:该类仅为测试性功能,暂时没有填补实际功能。

P := ProMath()
P["a"] := 0.4
P["a&b"] := 0.3
Print P["b|a"]

v1.0.7.04
1.更新Sinet类
(1)新增Sinet.Functools类,用于承载等同Python的相应功能,目前引入Reduce(Function,IterObj)

lst := [2, 3, 4]
res := Sinet.Functools.reduce(Mul := Lambda(x, y) => x*y, lst)
print(res)

(2)引入Sinet.Function.Map(Function,IterObj)用法与原生Python的Map一致。

2.新增Set数据类型,即集合类型,初始化方式为Set([Iterable],…)若输入数据包含字符串,则会将字符串拆分。

x := set('runoob')
print x

(1)新增Calc(Set1,Sign,Set2)函数用于集合运算,返回值为新的集合。
*Sign可选包含”&,|,^,-“

3.更新NLP类
(1)引入BayesianClassify(wordsList,classVec,testWords,function:=”printClass”,tepClass:=1)用于进行贝叶斯推断。

wordsList := [['周六', '公司', '一起', '聚餐','时间'],
             ['优惠', '返利', '打折', '优惠', '金融', '理财'],
             ['喜欢', '机器学习', '一起', '研究', '欢迎', '贝叶斯', '算法', '公式'],
             ['公司', '发票', '税点', '优惠', '增值税', '打折'],
             ['北京', '今天', '雾霾', '不宜', '外出', '时间', '在家', '讨论', '学习'],
             ['招聘', '兼职', '日薪', '保险', '返利']]
classVec := [0, 1, 0, 1, 0, 1]
testWords := ['公司', '聚餐', '讨论', '贝叶斯']
NLP.BayesianClassify(wordsList, classVec, testWords)

4.更新Numpy类
(1)引入函数Numpy.(Add、Sub、Div、Mul)用于四则运算。
(2)引入函数Numpy.Arange用于创建Numpy.NDArray数组,参数与Range一致。
(3)引入函数Numpy.(Plus、Subtract、Divide、Multiple)用于多个同结构NDArray对应加减乘除运算。
(4)引入函数Numpy.(Exp、Log10、Log)用于对NDArray元素进行取对数等运算。
(5)引入自有函数Copy()用于对当前NDArray对象深拷贝。
(6)引入自有函数(Add、Sub、Div、Mul)用于直接对当前NDarray四则运算。
(7)引入自有函数Ravel()用于将当前NDArray对象展平为1维NDarray数组,且对该数组修改不影响源数据。

下载地址

链接: https://pan.baidu.com/s/1igPgrGqlVPjkcZB5N6N9WA?pwd=mono 提取码: mono 复制这段内容后打开百度网盘手机App,操作更方便哦
–来自百度网盘超级会员v5的分享

给TA捐赠
共{{data.count}}人
人已捐赠
其他

按一下开启脚本 再按一下关闭

2022-7-4 9:55:56

其他教程案例

AHK Leetcode系列 1-20

2022-7-7 20:24:19

21 条回复 A文章作者 M管理员
  1. AHK中文社区
    1河许人给您打赏了¥5
  2. AHK中文社区

    提个建议:1.建议添加一些应用说明;2.社区文章是可以修改的,建议对一个分享长期更新,以保证帖子热度可以持续增长。

    • 陌诺Mono

      ok,谢谢建议。主要是每次写的东西比较杂,比较多,在学校没空给注释提示啥的,后边就这个项目算杂项更新,每周把概况说明一下,其他的再重新按数据类型和主要库分成两个模块,给点应用方面的例子啥的,争取建几个长期贴。?

    • AHK中文社区

      可以把功能列出来,方便大家看到就能理解这个库是做什么的

    • 陌诺Mono

      我主要是几个目标吧 第一个是让v2语法更正式化,特别是更贴近python,这样去找一些功能的时候就可以考虑改写python相关内容。 第二个是自己把一些人工智能、图像识别的相关内容移植进来,这样可以看出ahk作为脚本语言上限也不低。 介绍功能的话,会像随机哥那样专门发一个单版面不写更新就把功能列一遍,不过最近考试多,还没时间去整

    • 陌诺Mono

      七月考不考虑加一个Leetcode闯关模块 没这个plan的话我想开个模块,就专门发leetcode的关卡ahk版本写法?

  3. tony5768

    学习,积分

  4. 空

    更新不重开帖子,直接编辑如何?这样我就只用收藏一遍了?

    • 陌诺Mono

      唔,内容太多我怕贴一块太多了 累积更新是为了每个版本都可以留底 我想想吧?

  5. dbgba
    dbgba给您打赏了¥10
  6. 蜜獾哥
    蜜獾哥给您打赏了¥10
  7. 蜜獾哥

    我代表广大小白给大佬十一个大大的赞??????????????????????

    • 陌诺Mono

      其实吧,最新的是v1.0.7.09 社区首页没推荐那个版本 可能是觉得这个更重要叭?

个人中心
购物车
优惠劵
有新私信 私信列表
搜索