对NG-单变量线性回归算法的代码重写
以下是一名课少闲的来学吴恩达的机器学习的大三菜鸡,对于第二章单变量线性回归部分作业的代码重现,如果您是初学者想理解机器学习课程的作业,这里可以给您一些启发理解
当然本人能力有限,代码肯定存在不完善,日后一定会继续改善更新
题目描述:在本部分的练习中,您将使用一个变量实现线性回归,以预测食品卡车的利润。假设你是一家餐馆的首席执行官,正在考虑不同的城市开设一个新的分店。该连锁店已经在各个城市拥有卡车,而且你有来自城市的利润和人口数据。
您希望使用这些数据来帮助您选择将哪个城市扩展到下一个城市。
数据集链接(数据在第一个文件内,需要自己查找):ex1data.txt
第一步:导入相应库
import pandas as pd #导入pandas,numpy库
import numpy as ny
import matplotlib.pyplot as plt
import seaborn as sns #seaborn就是在matplotlib基础上面的封装,方便直接传参数调用
第二步:读取数据
df = pd.read_csv('D:\machine learning\Linear learing\data1\ex1data1.csv',names=['人口','利润'])
# pd.read_csv的作用是将csv文件读入并转化为数据框形式,有非常多的参数,用到时可查阅文档
这一步遇到的问题,首先read_csv读取的是csv文件,需要将txt类型转换为csv,其次,文件夹尽量保持英文习惯,否则中文也会报错
df.head() #默认读取前五行,在这里查看一下自己读取的数据集
output:
人口 利润
0 6.1101 17.5920
1 5.5277 9.1302
2 8.5186 13.6620
3 7.0032 11.8540
4 5.8598 6.8233
df.info() #查看索引等信息
output:
<class ‘pandas.core.frame.DataFrame’>
RangeIndex: 97 entries, 0 to 96
Data columns (total 2 columns):
人口 97 non-null float64
利润 97 non-null float64
dtypes: float64(2)
memory usage: 1.6 KB
第三步:数据可视化,绘制散点图观察原始数据
sns.lmplot('人口','利润',data=df,size=6,fit_reg = False)
#fit_reg:拟合回归参数,如果fit_reg=True则散点图中则出现拟合直线
plt.show()
第四步:计算代价函数(二重点之一,有小细节)
需要用到课程中的假设函数和代价函数公式
def computecost(X,y,theta):
h = np.power((X*theta.T) - y,2)
J = np.sum(h)/(2*len(X)) #分母记得加括号!!!否则,因为这个,计算顺序错误,代价函数无比大hhhh
return J
提示:在写算法的过程中,括号的使用对算法执行顺序很重要,本人便因为括号的缺失导致代价函数的诡异庞大hh
以下一步同样重要,只有添加了这一列1,才能够让X与theta能够通过矩阵来进行运算
df.insert(0,'ONE',1) #在第0列插入表头为“ONE”的列,数值为1
接下来是从数据集df中得到想要的X,y
X=df.iloc[:,0:2] #2是取不到的
y = df.iloc[:,2:3] #看提示
提示:y = df.iloc[:,2:3]而不是y = df.iloc[:,2],虽然看起来取得一样,但后者得到的是一行数据
X.head()
OUTPUT:
ONE 人口
0 1 6.1101
1 1 5.5277
2 1 8.5186
3 1 7.0032
4 1 5.8598
y.head()
OUTPUT:
利润
0 17.5920
1 9.1302
2 13.6620
3 11.8540
4 6.8233
接下来这一步很重要,本人经常遗漏并且不熟练
#代价函数是应该是numpy矩阵,所以我们需要转换X和Y,然后才能使用它们。 我们还需要初始化theta。
X = np.matrix(X.values)
y = np.matrix(y.values)
theta = np.matrix(np.array([0,0]))
computecost(X,y,theta)
OUTPUT:
32.072733877455676
第五步:梯度下降(来确定合适的theta)
1.梯度下降算法(最大的重点!)
def gradient_descent(X,y,theta,alpha,alters):
temp=np.matrix(np.zeros(theta.shape)) #一开始没写,没初始化这两个,马上报错
cost=np.zeros(alters) ##初始化代价函数值为0数组,元素个数为迭代次数
for i in range(alters):
error = (X*theta.T) - y
for j in range(2):
term = np.multiply(error, X[:,j])
#temp[0,j] = theta[0,j] - ((alpha * np.sum(term))/len(X))
temp[0,j] = theta[0,j] - ((alpha / len(X)) * np.sum(term)) #!!导致最终结果千差万别的根源!!一定要按照顺序!!!
theta = temp
cost[i] = computecost(X,y,theta)
return theta,cost
2.初始化变量
alpha=0.01
iters=1500
3.运行梯度下降算法 得到合适的theta
g,cost = gradientDescent(X,y,theta,alpha,,iters) #让g,coat分别等于函数两个返回值
g
output:matrix([[-3.78806857, 1.18221277]])
cost
outputLarray([ 6.73719046, 5.93159357, 5.90115471, …, 4.47803526,
4.47803143, 4.47802761])
computecost(X, y, g)
4.4780276098799705
第六步:绘制线性模型
x = np.linspace(df.人口.min(),df.人口.max(),100)#以人口最小值为起点,最大值为终点,创建元素个数为100的等差数列
f = g[0,0] + (g[0,1] * x) #f是假设函数H
fig, ax = plt.subplots(figsize=(12,8))#以其他关键字参数**fig_kw来创建图
#figsize=(a,b):figsize 设置图形的大小,b为图形的宽,b为图形的高,单位为英寸
ax.plot(x, f, 'r', label='Prediction') #设置点的横坐标,纵坐标,用红色线,并且设置Prediction为关键字参数
ax.scatter(df.人口, df.利润, label='Traning Data') #以人口为横坐标,利润为纵坐标并且设置Traning Data为关键字参数
ax.legend(loc=2) #legend为显示图例函数,loc为设置图例显示的位置,loc=2即在左上方
ax.set_xlabel('Population') #设置x轴变量
ax.set_ylabel('Profit') #设置x轴变量
ax.set_title('Predicted Profit vs. Population Size') #设置表头
plt.show()
output:
第七步:代价数据可视化
ax=sns.tsplot(data=cost,err_style='ci_band',interpolate=False,ci=[10,50,90],n_boot=iters) #函数参数解释见笔记
ax.set_xlabel("inters")
ax.set_ylabel("cost")
plt.show()
总结:线性回归算法是ML算法中的基础,代价函数和梯度下降算法是本篇的重点。
作为一名ML菜鸟,本人深刻感受到随着时间推移对于算法的进步理解,这也是令人喜悦吧,希望继续,go on