Blog Archive

Wednesday, August 29, 2018

高晓松:仍是此间少年


路,走了44年,方向却不止一边。行装,偏爱黑色,内心,却仍是此间少年。护照,48页,但每个终点都值得赞颂千篇。旅程左右万里,时差却最多一天。世事,上下千年,却偏要说出瞬间。2013,世间依旧很大,大到可以《晓说》”。
  《晓说》片头的这段话不知听过多少遍,不知不觉已经跟高晓松的片子一起走过了二年。的确,世界仍旧很大,每个终点成了起点。不是每个人都有高晓松的自信、自傲、自省和自嘲的本事。但是每次听他侃过大千世界之后,内心里便多了一些豁达、感恩和勇敢。只有走过青春的人,才会感激年长。成长对于每个人来说,都是财富。恨衰老的人,从来就没弄懂过青春。在高晓松身上,我们读到了人生曲线,那么漂亮的弧线,中年返璞归真便是少年。44岁的高晓松,内心里一直很少年。然而,我们很多人却是人未老心先衰。如果你惧怕世界,就来跟高晓松一起《晓说》吧,你会觉得世界其实也没那么可怕,更重要的是我们要懂得如何使内心更强大。
  佳人才子必定多磨难。高晓松生长在标本式的知识分子家庭,外祖父是拿着庚子赔款出洋的留学生。母亲更是才女一位,对古建筑、诗词颇有研究。“人生不只是眼前的苟且,还有诗和远方”,这是母亲指引高晓松人生的箴言。本以为,清华工科毕业的高晓松不做科学家,至少也是个颇有建树的工程师。谁知道,最终我们收获的晓松是一位音乐人、电影导演、词曲作者和写作者的综合体。如今,我又私自给他多定了一个标签:中国脱口秀第一红人。有时,我觉得高晓松是一个矛盾的细胞体,随时有分裂的可能性。年轻时,他说青春如丧;中年时,他说仍是此间少年;待到年老,我猜他会说童心未眠吧。他骄傲到令自己平庸。他说如果不做那些选秀节目的评委,他哪有钱养活自己做音乐。他的脱口秀节目好看就好看在语速极快,不容观众多想,中英文混杂,这是思维敏捷的表现。一口京腔配一口自成一派的美语,这样的混搭也只能是高晓松出品,就像他多极了的身份。
  《晓说3》主要是在讲美国。美国人对于枪支的态度(《枪口下的美国》?美国的工会都干什么(《无比强大的美国工会》)?如何看待美国大选(《政治也娱乐》)?中国人在美国过得怎么样(《血脉相连的美籍华人》)?当然,为了照顾大多数观众和读者的口味,这本书里也有讲航母的《海上霸主航母》和讲历史的《淞沪会战》。
  以我作为《晓说》的铁杆粉丝的经验,高晓松最有价值的地方是他没有说教,而是告诉你学会思考。比如他讲美国枪支泛滥,美国人却仍然保持着高持枪率,制造各种血腥案件。但是,文中最后一句发人深思:不好也是人民的选择,不能由政府单方面决定。当有朝一日,我们手里有了选择权的时候,我们是否有能力进行好的选择?最让我感动的是书中讲述的北京奥运火炬在美国传递时,中国第一代移民,那些两鬓斑白的人是如何手持红旗高唱五星红旗迎风飘扬保护火炬。我想象着当时的场景,眼睛瞬间湿润了。这是多好的爱国主义教育!祖国,这个词是所有国民的乡愁集散地。千万不要动辄就指责他人不爱国。所有的抱怨、指责甚至漫骂,都是爱国者的爱恨相交之举。最可怕的是冷漠的旁观者,他们才是真的不爱这个国。你永远叫不醒一个装睡的人。
  世界这么大,我们的幸福都是小小的。高晓松说最幸福的时刻是他的车子停在路口等红灯,加州的阳光洒在身旁女儿的脸上,女儿睡得很安静。他希望时间永远停在这一刻。可世界是迷乱的,是动荡的,是纷争的,是不安份的,而我们必须从个人的世界出走去观察,去理解,去体会,去拥抱外面的世界,不论它的善恶。持有这样心态的我们,才会笑着对世界说:不论多老,我心仍是此间少年。

Sunday, August 26, 2018

how to convert current time in date as second or convert time stamp to seconds in bash/linux/ubuntu

Abstract:
1) Human readable time to epoch time:
date +%s #Mon Aug 27 03:38:28 CST 2018 ==> 1535312308
2) epoch time to Human readable time
perl -le 'print scalar localtime $ARGV[0]' 1535312308
Mon Aug 27 03:38:28 CST 2018

date -d "25 JUN 2011" +%Y%m%d
output:
20110625
date +%s


date;date +%S; date +%s
Mon Aug 27 03:38:28 CST 2018
28
1535312308

perl -le 'print scalar localtime $ARGV[0]' 1535312308
Mon Aug 27 03:38:28 CST 2018

how to convert time stamp to seconds in bash
echo "00:20:40" | awk -F: '{ print ($1 * 3600) + ($2 * 60) + $3 }'
output:
1240

how to find the epoch time for specific day:
https://www.epochconverter.com/

reference:
https://unix.stackexchange.com/questions/2987/how-do-i-convert-an-epoch-timestamp-to-a-human-readable-format-on-the-cli

Thursday, August 23, 2018

Find a peak element in a 2D array



https://www.geeksforgeeks.org/find-peak-element-2d-array/
https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-006-introduction-to-algorithms-fall-2011/lecture-videos/MIT6_006F11_lec01.pdf

Alg:

Method 2 : (Efficient)
This problem is mainly an extension of Find a peak element in 1D array. We apply similar Binary Search based solution here.
  1. Consider mid column and find maximum element in it.
  2. Let index of mid column be ‘mid’, value of maximum element in mid column be ‘max’ and maximum element be at ‘mat[max_index][mid]’.
  3. If max >= A[max_index][mid-1] & max >= A[max_index][mid+1], max is a peak, return max.
  4. If max < mat[max_index][mid-1], recur for left half of matrix.
  5. If max < mat[max_index][mid+1], recur for right half of matrix.
Time Complexity : O(rows * log(columns)). We recur for half number of columns. In every recursive call we linearly search for maximum in current mid column.
Auxiliary Space : O(columns/2) for Recursion Call Stack

Saturday, August 11, 2018

Using sed to extract lines in a text file

Abstract: two ways to extract specific files:

  • $ sed -n 2,4p somefile.txt
  • $ sed '2,4!d' somefile.txt
If you write bash scripts a lot, you are bound to run into a situation where you want to extract some lines from a file. Yesterday, I needed to extract the first line of a file, say named somefile.txt.
$ cat somefile.txt
Line 1
Line 2
Line 3
Line 4


This specific task can be easily done with this:
$ head -1 somefile.txt
Line 1


For a more complicated task, like extract the second to third lines of a file. head is inadequate.

So, let's try extracting lines using sed: the stream editor.

My first attempt uses the p sed command (for print):
$ sed 1p somefile.txt
Line 1
Line 1
Line 2
Line 3
Line 4


Note that it prints the whole file, with the first line printed twice. Why? The default output behavior is to print every line of the input file stream. The explicit 1p command just tells it to print the first line .... again.

To fix it, you need to suppress the default output (using -n), making explicit prints the only way to print to default output.
$ sed -n 1p somefile.txt
Line 1


Alternatively, you can tell sed to delete all but the first line.

$ sed '1!d' somefile.txt
Line 1


'1!d' means if a line is not(!) the first line, delete.

Note that the single quotes are necessary. Otherwise, the !d will bring back the last command you executed that starts with the letter d.


To extract a range of lines, say lines 2 to 4, you can execute either of the following:
  • $ sed -n 2,4p somefile.txt
  • $ sed '2,4!d' somefile.txt
Note that the comma specifies a range (from the line before the comma to the line after). What if the lines you want to extract are not in sequence, say lines 1 to 2, and line 4?
$ sed -n -e 1,2p -e 4p somefile.txt
Line 1
Line 2
Line 4
If you know some different ways to extract lines in a file, please share with us by filling out a comment. P.S. Related articles from this blog:

source:
https://linuxcommando.blogspot.com/2008/03/using-sed-to-extract-lines-in-text-file.html

Sunday, August 5, 2018

火爆GitHub:100天搞定机器学习编程(超赞信息图+代码+数据集)



有个“100天搞定机器学习编程”的项目,最近在GitHub上非常火爆。作者不单给出了一组漂亮的信息图,而且还有代码和数据集,非常适合初学者上手。国外网友纷纷表示感谢(并祝楼主好人一生平安),请你也一定收藏好。

还是那句话:你是想喝一辈子糖水,还是想用AI改变世界?


问耕 栗子 发自 麦蒿寺
量子位 出品 | 公众号 QbitAI
你是想喝一辈子糖水,还是想用AI改变世界?
但怎么想是一回事,怎么做往往是另一回事。学习和健身一样,不少人都停留在口头上,有各种借口不曾付诸实施。
为此,YouTube网红Siraj Raval发起了一个挑战赛:#100DaysOfMLCode。
这个挑战赛意在号召大家行动起来,从参与活动的那天起,每天至少花费1小时的时间来学习提升或者应用编程,连续坚持100天,从而更好的理解和掌握机器学习这个强大的工具。积跬步、至千里。
而且参加这个活动,还要使用#100DaysOfMLCode这个标签,在社交平台每日“打卡”,公开记录自己的工作。
你想在这100天里学到什么,或者完成一个项目全凭自主决定。大家的选择五花八门,其中有一个小哥的学习计划,很快引发大家的关注。
这个小哥名叫Avik Jain(重名的不少),他的百天计划,是从机器学习的基础概念起步,逐层递进,内容比较适合初学者。
这个100天搞定机器学习编程的项目,现在已经是爆红GitHub,很快累积了3000多标星,在Twitter上,也有一大票人热捧这个项目。
同是百天计划,这个有什么特别之处?三点:
1、超赞的学习图片
2、配套的代码
3、相应的数据集
对这个项目的评价,多以awesome、great、fantastic、outstanding、perfect等评价,大家纷纷表示感谢(并祝楼主好人一生平安)。
项目地址在此:
https://github.com/Avik-Jain/100-Days-Of-ML-Code
请你一定收藏好。
目前作者的100天计划,已经进行到第25天,已有的内容包括:
数据预处理、线性回归、逻辑回归、K最邻近算法、支持向量机、深度学习专项课程等,最新的内容已经讲到决策树及实现等。
量子位摘录其中的部分内容,做个示例。

第一天

看上去,真是美好的一天。

第一步:导入一些库


Numpy和Pandas这两个,是非常重要的库。
Numpy里面有各种数学函数,Pandas是用来导入数据集、管理数据集的。
1import numpy as np
2import pandas as pd

第二步:导入数据集


数据集通常是.csv格式。CSV文件,是把表格数据,存储成纯文本。每一行是一个数据记录 (Data Record) 。
在Pandas库里面,用read_csv的方法,来读取本地的CSV文件,每个文件是一个数据帧 (Data Frame) 。
给每个数据帧里的自变量和因变量,分别做矩阵和向量。
1dataset = pd.read_csv('Data.csv')
2X = dataset.iloc[ : , :-1].values
3Y = dataset.iloc[ : , 3].values
第三步:处理缺失数据

我们获取的数据,通常是异构数据。导致缺失数据 (Missing Data) 的原因有很多,需要处理一下,模型的表现才不会减损。
可以把缺失的数据,用整列数据的平均值或者中位数代替。拿sklearn.preprocessing里的Imputer来处理。
1from sklearn.preprocessing import Imputer
2imputer = Imputer(missing_values = "NaN", strategy = "mean", axis = 0)
3imputer = imputer.fit(X[ : , 1:3])
4X[ : , 1:3] = imputer.transform(X[ : , 1:3])
第四步:编码分类数据

分类数据 (Categorical Data) 里的变量,不包含数值,只包含分类标签
比如,是/否,性别,婚姻状态,这样的变量,是没办法当成数值直接运算的。
所以,才需要把它们编码成能够运算的数值。用sklearn.preprocessing里面的LabelEncoder就可以了。
1from sklearn.preprocessing import LabelEncoder, OneHotEncoder
2labelencoder_X = LabelEncoder()
3X[ : , 0] = labelencoder_X.fit_transform(X[ : , 0])
创建个虚拟变量:
1onehotencoder = OneHotEncoder(categorical_features = [0])
2X = onehotencoder.fit_transform(X).toarray()
3labelencoder_Y = LabelEncoder()
4Y =  labelencoder_Y.fit_transform(Y)
第五步:分开训练集和测试集

要把数据集分成两半,一个当训练集,另一个当测试集。
一般来说,可以按80/20这样分,训练集大一些。用sklearn.crossvalidation里面的train_test_split() 来分,就行了。
1from sklearn.cross_validation import train_test_split
2X_train, X_test, Y_train, Y_test = train_test_split( X , Y , test_size = 0.2, random_state = 0)
第六步:特征缩放

大部分机器学习算法,都会拿两个数据点之间的欧几里得距离 (Euclidean Distance) 做计算。
这样一来,如果一个特征比其他特征的范围值更大,这个特征值就会成为主导。
而我们希望其他特征,也得到同等的重视,所以用特征标准化 (Feature Standardization) 来解决这个问题。
sklearn.preprocessing里面的StandardScalar,就派上用场了。
1from sklearn.preprocessing import StandardScaler
2sc_X = StandardScaler()
3X_train = sc_X.fit_transform(X_train)
4X_test = sc_X.fit_transform(X_test)

第二天

今天,要做的是简单线性回归 (Simple Linear Regression) 。

就是拿已知的那些 (x,y) 数据点,做出一条线性的趋势,来预测其他x值,对应的y。

第一步:数据预处理


其实,就是把第一天做过的事情,复习一下:
· 导入一些库
· 导入数据集
· 处理缺失数据
· 把数据集分成训练集和测试集
· 特征缩放的话,交给库了
 1import pandas as pd
 2import numpy as np
 3import matplotlib.pyplot as plt
 4
 5dataset = pd.read_csv('studentscores.csv')
 6X = dataset.iloc[ : ,   : 1 ].values
 7Y = dataset.iloc[ : , 1 ].values
 8
 9from sklearn.cross_validation import train_test_split
10X_train, X_test, Y_train, Y_test = train_test_split( X, Y, test_size = 1/4, random_state = 0
第二步:拟合训练集

要把数据集,拟合到简单线性回归模型里面去,可以用sklearn.linear_model里面的LinearRegression来解决。
LinearRegression里面,建一个叫做regressor的对象。
然后,把regressor拟合到数据集里去,用fit() 就行了。
1from sklearn.linear_model import LinearRegression
2regressor = LinearRegression()
3regressor = regressor.fit(X_train, Y_train)
第三步:预测结果

现在,用测试集来预测一下。
把输出存到一个向量Y_pred里面。然后,用LinearRegression里面的预测方法,来支配上一步训练过的regressor
1Y_pred Y_pred == regressor.predict(X_test) regressor.predict(X_test)
第四步:可视化

最后一步,就是给预测结果做个可视化。
matplotlib.pyplot做散点图,给训练集和测试集都做一下,看看预测结果是不是接近真实。
训练集可视化:
1plt.scatter(X_train , Y_train, plt.scatter(X_train , Y_train, colorcolor  ==  ''redred'')
2plt.plot(X_train , regressor.predict(X_train), ) plt.plot(X_train , regressor.p color ='blue')
测试集可视化:
1plt.scatter(X_test , Y_test, color = 'red')
2plt.plot(X_test , regressor.predict(X_test), color ='blue')

两件需要提醒的事

总之,大概就是上面这个样子。部分已经放出的信息图集合如下,大家可以预览一下。
如果你也想入门或者提升自己的机器学习能力,不妨试试跟着这个小哥一起学习进步。虽然这个项目全是英文,但并不晦涩高深,说不定还能顺便提高一下英文水平,以后读paper也用得到~
还有两件事,需要提醒一下。
1、这个项目已经开始汉化了
@zhyongquan 在GitHub上已经开始尝试中文版,效果如下图所示。
不过目前只进行了第一天内容的汉化。如果你感兴趣,可以持续关注,或者加入汉化的行动中。地址在此:
https://github.com/Avik-Jain/100-Days-Of-ML-Code/issues/8
2、项目内容不能盲信
尽信书不如无书。这个学习项目,也不是百分百完全正确,比如第四天讲逻辑回归时的右下角配图,就被指出存在错误。
作者也承诺将更新改正这个问题。
就酱。
最后,再发一次这个项目的地址:
https://github.com/Avik-Jain/100-Days-Of-ML-Code
请你一定收藏好,如果能开始学习那就更好啦。
如果这种偏入门的内容不适合你,还有更多进阶或者具体项目实现的100天计划可供参考,希望能帮助你精进。
比方#100DaysOfMLCode挑战赛发起人Siraj Raval,就选择了在100天里,使用机器学习技术,根据气温、降水、植被变化等因素,预测每周的登革热疫情,改善防疫的研究计划和资源分配。
你也可以选择其他项目,或者在Twitter、GitHub等看看别人的100天挑战,有没有你合适跟随的,或者全新启动你的挑战。
对了Siraj Raval还在GitHub和YouTube上发布过很多其他机器学习课程,例如三个月学习机器学习,六周入门深度学习等。
相关地址在此:
https://github.com/llSourcell
总之,原则就是每天进步一点点。
加油。