欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

吴恩达机器学习ex1 python实现

程序员文章站 2022-06-16 20:19:42
...

这个项目包含了吴恩达机器学习ex1的python实现

1.输出一个5*5的单位矩阵

import numpy as np
A=np.eye(5)
A.shape
(5, 5)

2. 单变量的线性回归

根据城市人口数量,预测开小吃店的利润 数据在ex1data1.txt里,第一列是城市人口数量,第二列是该城市小吃店利润。

2.1导入数据并查看数据分布

导入数据,原数据中无标题,故header=None,路径也可以用r’ xxxxx ‘

import pandas as pd
import matplotlib.pyplot as plt
data =pd.read_csv("C:\\Users\\xxx\\Desktop\\机器学习\\machine-learning-ex1\\ex1\\ex1data1.txt",header=None,names=['population','profit'])

这里有两种画图方式

# plt.scatter(data.iloc[:,0],data.iloc[:,1],marker='x',color='r')
# plt.xlabel('population')
# plt.ylabel('profit')
data.plot(kind='scatter',x='population',y='profit',marker='x',color='r')
<matplotlib.axes._subplots.AxesSubplot at 0x17f8fe99908>

吴恩达机器学习ex1 python实现

2.2梯度下降

2.2.1数据预处理

插入一行数据,代表x0,X代表特征向量,y代表标签

X=data.iloc[:,:-1]
y=data.iloc[:,2:]
X.head()
x0 population
0 1 6.1101
1 1 5.5277
2 1 8.5186
3 1 7.0032
4 1 5.8598
y.head()
profit
0 17.5920
1 9.1302
2 13.6620
3 11.8540
4 6.8233

代价函数是应该是numpy矩阵,故转化为矩阵类型,并初始化theta

X=np.matrix(X.values)
y=np.matrix(y.values)
theta=np.matrix(np.array([0,0]))
X.shape,y.shape,theta.shape
((97, 2), (97, 1), (1, 2))

2.2.2 定义模型

根据公式定义代价函数
吴恩达机器学习ex1 python实现

def computeCost(X, y, theta):
    inner = np.power((( X*theta.T) - y), 2)
    return np.sum(inner) / (2 * len(X))

computeCost(X, y, theta)

32.072733877455676

根据公式实现梯度下降
吴恩达机器学习ex1 python实现

def gradientDescent(X,y,theta,alpha,iters):
    temp=np.matrix(np.zeros(theta.shape))
    parameters=int(theta.ravel().shape[1])
    #ravel()方法将数组维度拉成一维数组
    cost=np.zeros(iters)
    
    for i in range(iters):
        error=(X*theta.T)-y
        #(h(θ)-y)的平方
        for j in range(parameters):
            term =np.multiply(error,X[:,j])
            temp[0,j]=theta[0,j]-((alpha/len(X))*np.sum(term))
            
        theta=temp
        cost[i]=computeCost(X,y,theta)
        
    return theta,cost
            
            
alpha=0.01
iters=1500

2.3 模型预测及数据展示

根据数据计算最优theta

g,cost=gradientDescent(X,y,theta,alpha,iters)
g
matrix([[-3.63029144,  1.16636235]])

进行预测

predict1 = [1,3.5]*g.T
print("predict1:",predict1)
predict2 = [1,7]*g.T
print("predict2:",predict2)
predict1: [[0.45197679]]
predict2: [[4.53424501]]

数据展示

x=np.linspace(data.population.min(),data.population.max(),100)
#linspace相当于在啊arg1和arg2中产生arg3个数
f=g[0,0]+(g[0,1]*x)

fig,ax=plt.subplots(figsize=(12,8))
#相当于fig = plt.figure()   ax = fig.add_subplot(1,1,1)
ax.plot(x,f,'r',label='prediction')
ax.scatter(data.population,data.profit,label='Traning Data')
ax.legend(loc=1)
#loc表示图标相应的位置
ax.set_xlabel('population')
ax.set_ylabel('profit')
ax.set_title('Predicted Profit vs. Population Size')
plt.show()

吴恩达机器学习ex1 python实现

3. 多变量的线性回归

根据已有数据,建立模型,预测房屋的售价,ex1data2.txt里的数据,第一列是房屋大小,第二列是卧室数量,第三列是房屋售价

3.1数据预处理

data2 =pd.read_csv("C:\\Users\\xxx\\Desktop\\机器学习\\machine-learning-ex1\\ex1\\ex1data2.txt",header=None,names=['Size', 'Bedrooms', 'Price'])
data2.head()
Size Bedrooms Price
0 2104 3 399900
1 1600 3 329900
2 2400 3 369000
3 1416 2 232000
4 3000 4 539900

归一化处理,目的是让梯度下降的速度更快

data2=(data2-data2.mean())/data2.std()
data2.head()
Size Bedrooms Price
0 0.130010 -0.223675 0.475747
1 -0.504190 -0.223675 -0.084074
2 0.502476 -0.223675 0.228626
3 -0.735723 -1.537767 -0.867025
4 1.257476 1.090417 1.595389
data2.insert(0,'ones',1)
X2=data2.iloc[:,:-1]
X2.head()
y2=data2.iloc[:,3:]
X2 = np.matrix(X2.values)
y2 = np.matrix(y2.values)
theta2 = np.matrix(np.array([0,0,0]))

3.2模型预测

g2, cost2 = gradientDescent(X2, y2, theta2, alpha, iters)
g2
matrix([[-1.10856950e-16,  8.84042349e-01, -5.24551809e-02]])

3.3正规方程

利用正规方程解出向量θ
吴恩达机器学习ex1 python实现

def normalEqn(X,y):
    theta=np.linalg.inv(X.T*X)*X.T*y
    return theta

final_theta2=normalEqn(X, y)
final_theta2
matrix([[-3.89578088],
        [ 1.19303364]])

4.一些注意事项

  1. 注意数据格式的转换;
  2. 对于 np.array 对象

元素乘法 用 a*b 或 np.multiply(a,b) ,

矩阵乘法 用 np.dot(a,b) 或 np.matmul(a,b) 或a.dot(b)

  1. 对于 np.matrix 对象

元素乘法 用 np.multiply(a,b)

矩阵乘法 用 a*b 或 np.dot(a,b) 或 np.matmul(a,b) 或 a.dot(b)。