duangsuse::Echo
412 subscribers
3.85K photos
105 videos
574 files
5.14K links
duangsuse技术相干订阅
这是 @duangsuse 与技术有关的发布频道
duangsuse 的另外有 throws 闲杂频道
@dsuset
转载频道 @dsusep
duangsuse 有coding,github,gitlab帐号和bilibili帐号

极小可能会有批评zf的消息 如有不适可以退出

suse的小站:https://piped.stream
ps 另有别名 popf.rip
ʕ•̀ω•́ʔ✧ 🐶🍎🏠生死🐜
(>ω<)岂因祸福避趋之 一鿕
Download Telegram
duangsuse::Echo
然后可以开始了 from pandas import Series, read_csv iris = read_csv('Iris.csv', encoding='utf-8', parse_dates=[], index_col=False) 然后我们就有了 Iris 数据集的工作实例(working set)(跑 先看看 In [39]: iris.describe() Out[39]: x y z count 150.000000…
分类的准确性有点可怕...:

看来线性回归也... 😟 不过很可惜,verifyRegressionAccuracy 只支持数值表项,看来只能另外写准确率判断了:

errors = testset[testset['w'] != testset['guess']]

In [32]: len(errors) / len(testset) * 100
Out[32]: 8.333333333333332

8.3%
的错误率!

— Question: 同一个 linearreg,那原作者分类的准确率为啥那么低

因为我的『向量化』是 one-hot encoding (独热码编码)的啊!

如果我写完全等价的实践(1,2,3 + round),你猜准确率又是怎么样的?

首先我们的回归结果是转换为文字形式的,试试数值形式:

from pandas import Series, read_csv
iris = read_csv('Iris.csv', encoding='utf-8', parse_dates=[], index_col=False)
iris['id'] = Series().astype(int)


def vectorize(w,i, cname='w', cid='id', iris=iris): iris.loc[iris[cname]== w, cid] = i
vectorize('setosa', 0); vectorize('versicolor', 1); vectorize('virginica', 2)

from sklearn.model_selection import train_test_split
iris_ds = iris.copy()

trainset, testset, trainsetid, testsetid = train_test_split(iris_ds, iris_ds['id'], train_size = 0.6)
del trainset['w'], trainset['id']


from sklearn.linear_model import LinearRegression
from math import floor

lreg = LinearRegression()
lreg.fit(trainset, trainsetid)

testset_truthw, testset_truthid = testset['w'], testset['id']
del testset['w'], testset['id']
testset['predict'] = lreg.predict(testset)
testset['id'] = testset_truthid

from pandas import DataFrame
def verifyRegressionAccuracy(ts: DataFrame, emax: float = 0.1, npredict = 'predict', ntruth = 'real') -> float:
predicteds, truths = ts[npredict], ts[ntruth]
acceptables = [t for (r, t) in zip(truths, predicteds) if abs(t - r) <emax]
return (len(acceptables) / len(predicteds)) *100

verifyRegressionAccuracy(testset, 1.0, 'predict', 'id')

结果是误差 100% 在 1.0 以内。[1]

== 然后再试一次:

vectorize('setosa', 1); vectorize('versicolor', 2); vectorize('virginica', 3)
iris_ds = iris.copy()

trainset, testset, trainsetid, testsetid = train_test_split(iris_ds, iris_ds['id'], train_size = 0.6)

del trainset['w'], trainset['id']

lreg = LinearRegression()
lreg.fit(trainset, trainsetid)

testset_truthw, testset_truthid = testset['w'], testset['id']
del testset['w'], testset['id']

testset['predict'] = lreg.predict(testset)
testset['id'] = testset_truthid

— 修改后的逻辑
In [14]: verifyRegressionAccuracy(testset, 1.0, 'predict', 'id')
Out[14]: 100.0
我们的依然是 100%,然后 0.1 的误差是 48%

然后使用独到的 1,2,3,... 序列:
In [23]: verifyRegressionAccuracy(testset, 1.0, 'predict', 'id')
Out[23]: 100.0 然后 0.1 的误差是 45%

🥺 打脸了。好像完全可以算在误差内嘛...

— 实际情况

所谓打脸是因为我不知道作者要『量回归』还 map 了一次 round
至于 round 之后的误差(即使 round 的结果和之前绝对值线性距离计算的也有很大关系...)... 嘻嘻 🌝

testset['predict'] = testset['predict'].map(round)
verifyRegressionAccuracy(testset, 1, 'predict', 'id')

结果是 96%... 好像又是差不多,欸奇怪了 🤔 真实无解

[1]: 后来发现,我在训练的时候忘记删掉了 id 参数... 它好像找到了一个作弊的方式 🤪
虽然比较辣鸡的算法显然也不能把 id 的系数提高到多少... 但是线性回归或许可以猜出来?
皮了一下午,那么就继续吧....
此书我寒假要找时间吐槽的,但是现在显然没有时间关心它
此书我已经看完了,剩下的内容也都已经阅读。

Sklearn 之类的框架做机器学习并不困难,只要你有点基础知识就可以,作者也说了,算法细节?呵呵

我们先用一个小数据集测试一下被抽象化的每个算法对预测的准确率,然后直接选好模型(虽然比较死,就是基于 Panda 数据表格的,差一点都不行,计算机视觉也不能搞)就开始上线... 然后... 就没有然后了

然后书本上面还有一些其他算法(比如 kNN)的例子,可以自己去 Sklearn 那里看,教程很详细,先溜了。
duangsuse::Echo
#ML #Python 接下来安装一点用于数据分析的东西 pip3 install --user --compile -U pandas matplotlib sklearn 如果有权限你也可以去掉 --user flag,-U 的意思是如果有的话安装更新 我们使用 Python 3,当然,要是有 IPython 和 Spyder 这种为数据分析 REPL 优化的东西就更好了,不过下面直接用 IPython3 现代机器学习算法主要包含概念学习、规则学习、基于解释学习、基于实例学习、遗传学习、强化学习…
还是 sin wave 之类的数据,matplotlib 可以这么用


from math import sin, cos, tan
from numpy import arange, array

from matplotlib import pyplot
from pandas import DataFrame, Series

xs = arange(0, 100, 0.1)
sinys = [sin(x) for x in xs]
cosys = [cos(x) for x in xs]
tanys = [tan(x) for x in xs]

plot.style.use('Solarize_Light2')

DataFrame(array([[xs], [sinys], [cosys], [tanys]]), columns = 'x sin(x) cos(x) tan(x)'.split())
... 不行

def kv(name): return (name, globals()[name])
func_tab = DataFrame.from_items(dict(kv(xs), kv(sinys), kv(cosys), kv(tanys)))
... 不行

waves = DataFrame()
waves['x'] = xs
waves['sin(x)'] = sinys; waves['cos(x)'] = cosys; waves['tan(x)'] = tanys

waves.index.name = 'x'
waves.plot(title='Triangle waves')

就可以得到好看的折线图了,并且非常容易使用

Pandas 的 DataFrame 就是字面意义上的数据框:一打可能有名字(index)的数据序列(pandas.Series)
只需要使用 EDSL(内部领域专属语言)操作它的实例就可以快速获得好看的数据图了,不需要不断去 plot 啊 add seris 再设置 xlabel ylabel 啊,都被良好封装(styles, chart type)了

上面本频道也有过 Ruby + GNUPlot 的版本
说到 tan,tanh 函数(双曲函数和三角函数有一定关系)因为其独特的性质也被人工神经网络当作激活函数。激活函数在神经元被传入信号的时候处理产生一个输出,继续正向传播。人工神经网络在回归的时候不需要运行激活函数,但是学习的时候必须运行激活函数。对于梯度下降学习算法来说,激活函数在其值域上必须是可导的,但是我不是很了解这些东西...
#Kotlin 求大佬解答
Forwarded from duangsuse
这里expression.getValueArgument(2)!!
这里

@TypedIntrinsic(IntrinsicType.WORKER_EXECUTE)
public fun <T1, T2> execute(mode: TransferMode, producer: () -> T1, @VolatileLambda job: (T1) -> T2): Future<T2>

所以我很奇怪为什么它会说

if (irCallableReference?.getArguments().isNotEmpty() ?:false) context.reportCompilationError

显然有参数啊... 难不成 Lambda 的参数还不一样?还分隐式参数和显式参数?
Konan 的 Interop 参数配置: #Kotlin

defFile pkg target

linkerOpts compilerOpts

headers includeDirs linkFiles

dumpParameters

这里可以看到更多
写完了,但是没有用,好像花了两个小时... 一部分时间是处理 Gradle build 的,熟悉插件,然后 Gradle 也不熟练,也就是能用一点 plugin configuration 和 sourceset.... 很菜的
这里直接 identity(null) 是因为 Secured 抽象类已经处理好了这部分状态不需要再去关心
duangsuse::Echo
https://github.com/Trumeet/Desktop #Kotlin 看起来比较简单,我也想默写一个(部分不默写,比如 bitflags) 这次我会用一点面向对象(Mixins)
好像没有使用 Mixin... 因为那个的确是比较麻烦(有可能还要用 CGLib 什么的)
然后这里也的确没啥东西需要 Mixin 的,何况那个抽象类的方法都是 protected 的,从外面看也很像 Mixin 了

Commit 明确了一下 parameter 和返回值的传递,都是没有用处的值
那我再写一个(求别喷为什么不干有意义的事情)

[DuangSUSE@duangsuse]~/Projects% jar tf Yuuta\ \(2\).jar|head -n4
META-INF/MANIFEST.MF
META-INF/
Base64AndDDoS.class
org/
[DuangSUSE@duangsuse]~/Projects% javap -cp Yuuta\ \(2\).jar Base64AndDDoS
Compiled from "Base64AndDDoS.java"
public class Base64AndDDoS {
public Base64AndDDoS();
public static void main(java.lang.String[]) throws java.io.IOException, java.lang.InterruptedException;
}
... 看起来还是不如直接用 Python 之类的写(当然文本处理推荐 Perl)

不过为了方便学习 OkIO, OkHttp 就写点吧...
Forwarded from 永久封存 | Yuuta 台 | 😷 #Pray4Wuhan (Al Pt)
Yuuta.jar
2.1 MB
duangsuse::Echo
Yuuta.jar
反汇编看看,敲重点。

javap -c -cp Yuuta\ \(2\).jar Base64AndDDoS

constructor
public Base64AndDDoS();
啥都没有,就一个 invokespecial (call super)

然后 main, 这里第一个本地表(索引 0)因为是 static 方法就代表 args 对象

aload_0; arraylength: push args.length
ifle goto 9: if (pop <=0) goto truebr
iconst_1
goto 10: goto falsebr
9:truebr
iconst_0
10:falsebr
dup
istore_1

首先看看有没有参数(<=0),如果有(len>0),则 #1 被存储为 int 1,否则 int 0

... 算了,我们来看看如何使用 Kate 以理解程序逻辑为目标阅读 Java 字节码吧。
disasm.javap
7.6 KB
第一条“语句”