我理想中的下一代个人计算设备

昨晚看WWDC18,苹果在介绍iOS12时第一个介绍的就是AR软件的更新和改进。但是在我看来,目前在手机和平板上使用AR产品是反直觉和不自然的。用手举起一个手机或者一块板子玩AR游戏或者使用地图导航是很奇怪的,很多时候甚至是脱裤子放屁。更加直观和自然的方式是眼镜类的产品。

我于两年前在LOFTER上更新了一点想法:

我觉得,下一代计算设备会像一个眼镜一样,它和google glass类似(所以我希望Google不要放弃这个项目啊)AR技术将在现实场景上叠加信息。例如物品价格,实体路线图,甚至是鸟的种类和相关信息,这些功能的实现取决于开发者的开发,就像智能手机一样,可以在固定的地方购买下载程序安装到自己的眼镜中。

而它的主要的交互方式就是语言交互,配合一些基本的手势,可能我们现在觉得在大街上一个人说话有些奇怪,要是再加上一些手势动作就像一个神经病一样。但是人人都变得这样就不会觉得奇怪了。可能移动电话才普及的时候人们也觉得在大街上一个人说话很奇怪。

这样一款产品为了续航大多数计算都在云端进行因此需要高速便宜的移动网络支持,而交互方式需要机器有很强的智能。现在炒的很火的技术诸如ar vr技术,人工智能,高速移动网络,语音识别与交互都会集中在这一款产品之上。这款产品还会运用诸如骨传导将声音由眼镜架传到耳朵,或者在支付和身份验证的时候用虹膜扫描。它会追踪记录我们的每一个行动,包括身体状况,与每个人的会面,每天的进食、饮水等情况,这需要众多传感器和更安全的存储和通信系统。

我发现,现在的技术都在指向这样一款产品

现在看来,我仍然没有改变我的想法。只是觉得,如果在电池和网络没有大的革新的情况下,将这款眼镜产品作为像Apple Watch一样的手机的附属产品,计算和连接互联网都由手机完成,或许是一个不那么激进的方案。

Python机器学习入门(2.1)

本章主要探讨一些监督学习的算法,因为内容较多,学一点就更新一点。本节主要是K近邻和线性模型。

首先,监督学习问题分为两种,一是分类,二是回归。如垃圾邮件的学习识别就是分类问题,而房价预测就是回归问题。在监督学习中,我们通过利用训练集使程序能够对没有见过的数据进行预测的过程就是泛化的过程。在进行训练之前,我们首先要识别数据的某些特征,将他们作为训练的内容。过于关注细节,使得模型在训练集上表现很好,但是泛化到测试集上效果很差就代表过拟合,而无法抓住数据特征,使得模型在训练集上效果就很差就表示欠拟合。模型复杂度越高,训练精度越高,但是泛化能力可能先提高后下降,这就需要我们进行取舍。有效数据集越大,我们就能构建一个更复杂的模型。

下面开始介绍几种不同的算法:

k近邻

这种算法就是第一章预测花的种类所用到的算法。首先是k近邻分类。对于设定只有一个邻居的时候,算法就将离需要预测的点最近的那个点作为结果输出。对于多个邻居的时候,算法就会进行投票(计算有多少个邻居属于类别1,多少个邻居属于类别2……),最后选出票数最多的作为结果输出。

其次就是k近邻回归,类似的,单一邻居输出最近邻的目标值,多邻居时输出这些邻居的平均值。

k近邻算法很好理解,但是如果训练集很大,速度就会很慢。这种算法不太适用于很多特征值都是0的情况。

线性回归模型

线性模型利用输入特征的线性函数进行预测。对于一般的的回归问题,线性模型预测的一般公式是:y = w[0]*x[0]+w[1]*x[1]+……+w[p]*x[p]+b。其中x[n]代表特征,w代表相应特征给定的参数,b也是需要给定的参数。如果特征只有一个的话,就是高中学的直线方程。

第一个回归方法是线性回归,又称为普通最小二乘法。就是模型寻找参数w和b,使得预测值减去实际值的平方和除以样本数最小。对于一维数据集来说,以内模型非常受限,所以很容易欠拟合。对于高维数据集,经常会发生过拟合的情况。岭回归就是常见的替代方法。

岭回归的预测公式与线性回归相同,只是对模型对于w的选择加了约束(w应该尽可能小,即w应该尽可能接近0)。直观看来,即每一个特征对结果的输出影响尽可能小。这种约束是正则化的一个例子,正则化是指对模型进行显性约束。在岭回归下,模型的训练集分数一般低于线性回归下的分数,但是测试集分数高于线性回归下的分数,即一般来说泛化性能更好。在小数据集的情况下,线性回归基本学不到什么东西,岭回归效果要好很多。随着数据量的增加,两者的差异逐渐减小。

正则化的另一个例子是Lasso,也是约束w使其靠近0,但是用到的方法不同,lasso会自动忽略一些特征值,即使一些w为0,这样使模型更为容易解释。我们可以通过调整参数alpha的值来确定忽略的强度,当alpha的值很小的时候,约束就很小了,结果与线性回归的结果类似。

线性回归模型首选岭回归,如果参数很多,而只有一些是重要的就可以选择Lasso。

用于分类的线性模型

线性模型用于分类问题主要有两类,一是二分类,二是多分类。二分类主要用这个公式来进行预测:y=w[0]*x[0]+w[1]*x[1]+……+w[p]*x[p]+b>0。这看起来和线性回归的公式类似,只是没有返回一个求和值,而是在值小于0时预测类别-1,大于0预测类别+1。二分类主要通过直线、平面或者超平面来分类两个类别。

最常见的两种分类算法是Logistic回归和线性支持向量机。两个模型都默认使用L2正则化,决定正则化强度的是参数c,c越小正则化越强,w就越趋近于0.

多分类线性模型看起来像二分类的加强版,常见方法是一对多,就是对每个类别进行一次二分类,分为此类别和其他两种情况,尽可能将此类别和其他分开。每一个类别都对应一个二类分类器,使用置信方程:w[0]*x[0]+w[1]*x[1]+……+w[p]*x[p]+b。然后在每一个测试点上运行所有的二类分类器,得到分数最高的作为结果输出。

上图中,三条线中间的部分里的点会分配到最接近的线所在的类别。

线性模型的速度非常快,适用于有大量数据的数据集,特别是对于特征数量大于样本数量的时候。但在更低维的空间中,其他模型的泛化能力可能更好。

 

 

 

Python机器学习入门(1)

趁着前两天世界读书日促销把一直放在购物车里的书清空了,其中就有《Python机器学习基础教程》。今天下午有点时间就读了第一章导论部分。以一个关于花的品种的例子介绍了机器学习的大致流程。接下来我凭自己的理解大概记录一下(表述极其不准确)。

首先机器学习分为了监督学习和无监督学习。导论部分的例子是一个典型的监督学习。监督学习会告诉算法一些数据和结果,比如告诉四个关于花瓣长度的数据,然后再告诉算法这些数据所代表的花。这样经过一定地训练后,算法就能够在你给出一组全新数据时给你反馈预测结果。无监督学习就只告诉数据不告诉结果,过程会更加复杂一些。

本书使用的是scikit-learn这个库,使用anaconda基本只需要conda install scikit-learn就好了,其他诸如pandas这些库都已经内置了。

接下来就是第一个项目,鸢尾花分类,使用的数据是这个库内置的类似于教学数据一样的东西。首先导入数据,通过一些命令查看数据。其实我感觉在做自己的项目的时候将数据下载下来自己就知道数据是什么样子了,只需要确认一下数据的类型和形式就好。接下来就是衡量一下模型是否能成功,通过画散点图等一些骚操作就能把数据表现成如下的形式。虽然代码只有两行,但是里面的参数我是不知道是啥意思的。

图像把4个特征两两组合作图,可以看出区分度还是很高的。

接下来就是找模型,scikit-learn这个库内置了许多算法,这部分作者会在第二章开始介绍。这个导入项目使用了K近邻算法,就是在你给出一组数据之后,算法在加载的数据集里面找到最相似的那个数据,然后把结果赋给新给的数据。至于有几个邻居之类的问题就不是这一章讨论的。

接下来就是把数据分成训练集和测试集,按照经验来说一般是3:1的比例,75%拿来训练,25%拿来测试。scikit-learn专门有一个函数来做这个事情。之后就是训练和作出预测,这个挺简单的,两三行代码就完成了。

最后是评估模型,即是评估预测结果和我们已知结果之间的差距,可以用numpy的mean函数也可以用scikit-learn的score函数。本次测试的结果是0.97,准确度达到了97%,看起来很好了。

第一次接触机器学习,前面有天看了一下Google出的基于自己家的tensorflow的机器学习入门教程,机翻的教程还是比较吃力,找本书来自己照着敲更靠谱些。