什么是机器学习
Tom Micheal Mitchell给出的定义是:对于某给定的任务T,在合理的性能度量方案P的前提下,某计算机程序可以自主学习任务T的经验E;随着提供合适、优质、大量的经验E,该程序对于任务T的性能逐步提高。即,随着任务的不断执行,精灵的累积会带来计算机性能上的提升。
其中,机器学习的对象有:一个或多个任务Task(T),经验Experience(E)以及性能Performance(P)
换个说法就是,机器学习是人工智能的分支。我们使用计算机设计i个系统,使它能够根据提供的训练数据按照一定的方式来学习;随着训练次数的增加,该系统可以在性能上不毒案学习和改进;通过参数优化的学习模型,能够用于预测相关问题的输出。
机器学习分类
先去做一个简单的模块,在给定一些场景,不断的改进过程,不断学习,才叫做机器学习。所以国际象棋智能系统deepblue虽然叫做人工智能的实现,但不是严格意义上的机器学习,而是更倾向于专家系统。
-
有监督学习:
首先让给定一个物品,再给定一些带标记的样本,去判断这些样本中哪些是符合物品特征的样本。 -
无监督学习:
对于某一些数据或事件做统计,在一定差值范围内,我们认定这些数据或事件是一个新的,就会去学习这个数据或事件。 -
增强学习:
带反馈的学习方法。
举个例子假设有一个网站,其中有很多的用户。做一个社区发帖的网站,根据用户的留言,计算相似度,把这些用户归类形成若干个社区。
假设有10w用户,找一些工作人员,将其中1k个样本标记类别属于什么社区。剩下9k人不用标记,根据实际标记值,将已经标记的标签值
传递到其他样本中去。相当于做了一个标签传递算法,可以说是属于半监督学习的算法。
所以,虽然机器学习分了几类,但是他们之间是有联系的,并不是完全隔离开的。
机器学习的内涵与外延
机器学习,并不是传统上的硬件机器。如果要解释机器学习中的机器,其实更偏向于软件、算法的内容。所以并不能仅仅靠机器学习去制造一个机器人。同样的,机器学习是对在某一个场景下,解决某一个问题或者训练某一个模型,并不能完成大数据存储或者并行计算的内容。那么机器学习具体可以解决的是什么问题?是给定数据的预测问题,其中包括数据清洗/特征选择;确定算法模型/参数优化;以及最后的结果预测。
在实际使用中,机器学习更多时候是在调用数据包中的函数去处理问题和预测结果。
机器学习的一般流程
机器学习方法
- different assumptions on data(对数据的不同假设)
- different scalability profiles at training time(训练时使用不同的可扩展性配置文件)
- different latencies at prediction time(预测时间的不同延迟)
- different model sizes(embedability in mobile devices)(不同模型的大小(可嵌入移动设备))
算法有很多,通过不同的算法构建不同的模型。但是应该选择什么模型需要针对具体问题去认真考虑。因此需要根据问题特征去进行算法模型的匹配,达到最好的学习效果。
机器如何发现新词
-
频数:Count(X)
-
凝固程度
X=A.B
P(A)P(B)vsP(X) -
自由程度
aXb
信息熵H(a),H(b) -
凝固程度和自由程度缺一不可。只考虑凝固程度,会找出“巧克”,“俄罗”,“颜六色”等“半个词”;只考虑自由程度,会把“吃了一顿”,“看了一遍”,“睡了一晚”等中的“了一”提取出来,因为它的左右临字都很丰富。
机器学习初体验
import math
import matplotlib.pyplot as plt
if __name__ =="__main__":
x=[float(i)/100.0 for i in range(1,300)]#x是1-300中的数除以100
y=[math.log(i) for i in x]#log函数
plt.plot(x,y,'r-',linewidth=3,label='log Curve')
a=[x[20],x[175]]
b=[y[20],y[175]]
plt.plot(a,b,'g-',linewidth=2)
plt.plot(a,b,'b*',markersize=15,alpha=0.75)
plt.legend(loc='uppper left')
plt.grid(True)
plt.xlabel('X')
plt.ylabel('Y')
plt.show()
运行结果:
画柱状图,
import numpy
import matplotlib.pyplot as plt
if __name__=="__main__":
u=numpy.random.uniform(0.0,1.0,10000)#一次均值分布
plt.hist(u,80,facecolor='g',alpha=0.75)
plt.grid(True)
plt.show()
times=10000#迭代10000次的图像
for time in range(times):
u+=numpy.random.uniform(0.0,1.0,10000)#0-1之间的均值分布
print (len(u))
u/=times
print (len(u))
plt.hist(u,80,facecolor='g',alpha=0.765)
plt.grid(True)
plt.show()
运行结果:
机器学习算法中的数学
- 线性回归
- rate
- Loss
- EM 算法
- 对图像进行预测和分配GMM
- 图像卷积CNN
- 去均值ICA分离
- SVM:高斯核函数的影响
- Crawler爬取数据
- HMM分词:MLE
- 自然语言处理解决标记问题:最大熵模型
- K-Means/K-Mediods/密度聚类/谱聚类:聚类
- PCA/SVD/ICA:降维
- 与核技术相结合:SVM
- 与聚类、标签传递算法相结合:主题模式pLSA/LDA
- 无向图模型、链式条件随机场解决标记问题:条件随机场
- 与EM、贝叶斯相结合,参数、隐变量的学习:变分推到Variation Inference
- 大规模人工神经网络:深度学习
对数函数的上升速度
import math
import matplotlib.pylab as plt
import numpy as np
if __name__=="__main__":
x=np.arange(0.05,3,0.05)
y1=[math.log(a,1.5) for a in x]
plt.plot(x,y1,linewidth=2,color='#007500',label='log1.5(x)')
plt.plot([1,1],[y1[0],y1[-2]],'r--',linewidth=2)
y2=[math.log(a,2) for a in x]
plt.plot(x,y2,linewidth=2,color='#9f35ff',label='log2(x)')
y3=[math.log(a,3)for a in x]
plt.plot(x,y3,linewidth=2,color='#f75000',label='log3(x)')
plt.legend(loc='lower right')
plt.grid(True)
plt.show()
运行结果:
构造数列{xn}
自然常数e
导数
- 导数就是曲线的斜率,是曲线变化快慢的反应
- 二阶导数是斜率变化快慢的反应,表征曲线凹凸性:二阶导数连续的曲线,往往称之为“光滑”的。
- 根据
可以得到函数f(x)=lnx的导数,再根据换底公式、反函数求导等,得到其他初等函数的导数。
常用函数的导数
泰勒公式
泰勒公式的应用
1.数值计算:初等函数值的计算(在原点展开)
注:在实践中,往往需要做一定程度的变换。
2.计算ex
- 求整数k和小数r,使得 x=kln2+r,|r|<=0.5ln2
- 得到 ex=ek·ln2+r=ek·ln2·er=2k·er
泰勒展开式的应用
import math
import numpy as np
import matplotlib as mpl
import matplotlib.pylab as plt
def calc_e_small(x):
n=10
f=np.arange(1,n+1).cumprod()
b=np.array([x]*n).cumprod()
return np.sum(b/f)+1
def calc_e(x):
reverse=False
if x<0:#处理负数
x=-x
reverse=True
ln2=0.69324718055994530941723212145818
c=x/ln2
a=int(c+0.5)
b=x-a*ln2
y=(2**a)*calc_e_small(b)
if reverse:
return 1/y
return y
if __name__=="__main__":
t1=np.linspace(-2,0,10,endpoint=False)
t2=np.linspace(0,2,20)
t=np.concatenate((t1,t2))
print(t)#横轴数据
y=np.empty_like(t)
for i,x in enumerate(t):
y[i]=calc_e(x)
print('e^',x,'=',y[i],'近似值\t',math.exp(x))
#print ‘误差:’,y[i] -math.exp(x)
mpl.rcParams['font.sans-serif']=[u'SimHei']
mpl.rcParams['axes.unicode_minus']=False
plt.plot(t,y,'r-',t,y,'go',linewidth=2)
plt.title(u'Taylor',fontsize=18)
plt.xlabel('X',fontsize=15)
plt.ylabel('exp(x)',fontsize=15)
plt.grid(True)#生成网格
plt.show()
运行结果:
泰勒公式可以将复杂的函数表示成简答初等函数的组合,简化计算。还可以应用在Gini系数的图像、分类误差率三者之间的关系。
Gini系数的生成
import numpy as np
import matplotlib.pylab as plt
if __name__=="__main__":
p=np.arange(0.001,1,0.001,dtype=np.float)
gini=2*p*(1-p)
h=-(p*np.log2(p)+(1-p)*np.log2(1-p))/2
err=1-np.max(np.vstack((p,1-p)),0)
plt.plot(p,h,'b-',linewidth=2,label='Entropy')
plt.plot(p,gini,'r-',linewidth=2,label='Gini')
plt.plot(p,err,'g-',linewidth=2,label='Error')
plt.grid(True)
plt.legend(loc='upper left')
plt.show()
运行结果:
决策树CART算法就是基于基尼指数特征写的算法。
方向导数
如果函数z=f(x,y)在点P(x,y)是可微分的,那么,函数在该点沿任一方向L的方向发导数都存在,且有:
梯度
梯度方向是函数在该点变化最快的方向,比如,一座解析式为z=H(x,y)的山,在(x0,y0)的梯度是在该点坡度变化最快的方向。
Γ
\Gamma
Γ函数是阶乘在实数上的推广
Γ
(
z
)
=
∫
0
∞
t
z
−
1
e
−
t
d
t
=
(
x
−
1
)
!
,
\Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt=(x-1)!\ ,
Γ(z)=∫0∞tz−1e−tdt=(x−1)! ,
阶乘与gamma函数
# -*- coding: UTF-8 -*-
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from scipy.special import gamma
from scipy.special import factorial
mpl.rcParams['axes.unicode_minus']=False
mpl.rcParams['font.sans-serif']='SiHei'
if __name__=="__main__":
N=5
x=np.linspace(0,N,50)
y=gamma(x+1)
plt.figure(facecolor='w')
plt.plot(x,y,'r-',lw=2)
z=np.arange(0,N+1)
f=factorial(z,exact=True)#阶乘
print(f)
plt.plot(z,f,'go',markersize=8)
plt.grid(b=True)
plt.xlim(-0.1,N+0.1)
plt.ylim(0.5,np.max(y)*1.05)
plt.xlabel(u'X',fontsize=15)
plt.ylabel(u'Gamma(X)-阶乘',fontsize=15)
plt.title(u'阶乘和Gamma函数',fontsize=16)
plt.show()
运行结果:
凸函数
若函数f的定义域dom f为凸集,且满足
一阶可微
若f一阶可微,则函数f为凸函数当且仅当f的定义域dom f为凸集,且
二阶可微
若函数f二阶可微,则函数f为凸函数当且仅当dom为凸集,且
若f是一元函数,上式表示二阶导数大于等于0;若f是多元函数,上式表示二阶导数Hessian矩阵半正定。
凸函数举例
代码实例:
import matplotlib.pyplot as plt
import numpy as np
if __name__=='__main__':
fig=plt.figure()
ax=fig.add_subplot(111)#subplot可以规划figure划分为n个子图,但每条subplot命令只会创建一个子图
u=np.linspace(0,4,1000)#在指定的间隔内返回均匀间隔的数字。
x,y=np.meshgrid(u,u)#从一个坐标向量中返回一个坐标矩阵
z=np.log(np.exp(x)+np.exp(y))
ax.contourf(x,y,z,20)#contourf画三维等高线图的,contourf会对等高线间的区域进行填充
plt.show()
概率论
概率论还有许多知识可以用于机器学习,包括古典概型、条件概率、贝叶斯公式等等。