机器学习 学习笔记一
两种类型学习算法 监督学习和无监督学习
监督学习(Supervised Learning)
需要数据集分为两类
(1)回归问题,Regression problem(如:预测房价的数据图),
对于里面每个数据,算法都知道对应的正确房价,这套房子卖出的价格,算法的结果就是算出更多的价格。
(2)分类问题,Classification problem(如:肿瘤良性恶性的数据图),
对于肿瘤的良性恶性进行分类,算法的结果就是判断新的病人的胸部肿瘤是良性还是恶性。
(对未来结果进行预测,对未来结果进行分类)
无监督学习(Unsupervised Learning)
不需要人为来输入标签
(1)聚类,(如:谷歌新闻,每天都在收集不同的新闻,将他们聚集在一起。)
2.变量线性回归
是一种通过属性的线性组合来进行预测的线性模型,其目的是找到一条直线或者一个平面或者更高维的超平面,使预测值与真实值之间的误差最小化
符号约定
m | 代表训练集中样本的数量 |
---|---|
n | 代表特征的数量 |
x | 代表特征/输入变量 |
y | 代表目标变量/输出变量 |
(x,y) | 代表训练集中的样本 |
(x(i),y(i)) | 代表第i个观察样本 |
代价函数、损失函数、目标函数
1.损失函数(Loss Function)度量单样本预测的错误程度,损失函数值越小,模型就越好。常用的损失函数包括:0-1损失函数、平方损失函数、绝对损失函数、对数损失函数等。
2.代价函数(Cost Function)度量全部样本集的平均误差。常用的代价函数包括均方误差、均方根误差、平均绝对误差等。
3.目标函数(Object Function)代价函数和正则化函数,最终要优化的函数。
定义代价函数公式如下:
3.梯度下降
1.批量梯度下降(Batch Gradient Descent,BGD)梯度下降的每一步中,都用到了所有的训练样本
2.随机梯度下降(Stochastic Gradient Descent,SGD)梯度下降的每一步中,用到一个样本,在每一次计算之后便更新参数 ,而不需要3.首先将所有的训练集求和
3.小批量梯度下降(Mini-Batch Gradient Descent,MBGD)梯度下降的每一步中,用到了一定批量的训练样本
批量梯度下降
公式:
梯度下降法-特征缩放
在遇到多维特征问题的时候,要保证特征具有相近的尺度,帮助梯度下降法更快地收敛
梯度下降法-续写率
梯度下降法的每次迭代收到学习率的影响,如果学习率α过小,则达到收敛所需的迭代次数会非常高;如果学习率α过大,每次迭代可能不会减小代价函数,可能会越过局部最小值导致无法收敛。
通常可以考虑尝试些学习率:
𝛼 = 0.01,0.03,0.1,0.3,1,3,10
代码:
下面展示一些 python
代码。
//线性回归练习,通过梯度下降减少代价
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
#导入数据
data=pd.read_csv('data/regress_data1.csv')
# print(data.head())
# print(data.describe())
#绘制数据图
data.plot(kind='scatter',x='人口',y='收益',figsize=(12,8))
plt.xlabel('人口',fontsize=18)
plt.ylabel('收益',rotation=0,fontsize=18)
#plt.show()
#梯度下降实现线性回归,以最小化代价函数
def computeCost(X,y,w):
# inner=np.power(((X*w.T)-y),2)
# return np.sum(inner)/ (2*X.shape[0]) #shape[0]矩阵的行数
inner = np.power(((X * w.T) - y), 2)# (m,n) @ (n, 1) -> (n, 1)
# return np.sum(inner) / (2 * len(X))
return np.sum(inner) / (2 * X.shape[0])
#在训练集中添加一列
data.insert(0,'Ones',1)
#变量初始化
cols=data.shape[1]
X=data.iloc[:,:cols-1] #所有行,去掉最后一列
y=data.iloc[:,cols-1:] #所有行,最后一列
# print(X.head())
# print(y.head())
#转为numpy矩阵
X=np.matrix(X.values)
y=np.matrix(y.values)
w=np.matrix(np.array([0,0]))
print(computeCost(X,y,w))
#批量梯度下降
def batch_gradientDescent(X,y,w,alpha,iters):
temp=np.matrix(np.zeros(w.shape))
parameters=int(w.ravel().shape[1])
cost=np.zeros(iters)
for i in range(iters):
error=(X*w.T)-y
for j in range(parameters):
term=np.multiply(error,X[:,j])
temp[0,j]=w[0,j]-((alpha/len(X))*np.sum(term))
w=temp
cost[i]=computeCost(X,y,w)
return w,cost
#初始化参数
alpha=0.01
iters=1000
g,cost=batch_gradientDescent(X,y,w,alpha,iters)
print(g)
#计算训练模型的代价函数
print(computeCost(X,y,g))
#绘制线性模型及护具,只管地看出它的拟合
x=np.linspace(data['人口'].min(),data['人口'].max(),100)
f=g[0,0]+(g[0,1]*x)
fig,ax=plt.subplots(figsize=(10,6))
ax.plot(x,f,'r',label='预测值')
ax.scatter(data['人口'],data['收益'],label='训练数据')
ax.legend(loc=2)
ax.set_xlabel('人口',fontsize=18)
ax.set_ylabel('收益',rotation=0,fontsize=18)
ax.set_title('预测收益和人口规模',fontsize=18)
plt.show()
fig,ax=plt.subplots(figsize=(10,8))
ax.plot(np.arrange(iters),cost,'r')
ax.set_xlabel('迭代次数',fontsize=18)
ax.set_ylabel('代价',rotation=0,fontsize=18)
ax.set_title('误差和训练Epoch数',fontsize=18)
plt.show()