小小小白刚刚开始学机器学习 ​

需要用到的库

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt


  • 机器学习算法中大部分计算都是用numpy库实现的
    ​ numpy用户手册​​NumPy user guide​
  • pandas库是一个强大的用于分析结构化数据的工具集,基础是numpy
    在这里用于处理CSV文件
  • matplot是python的绘图库,搭配numpy一起使用
1.简单练习

输出5*5的单位矩阵

A = np.eye(5)
print(A)


np.eye()函数:返回一个对角线上全是1,其他全为0的二维数组。

输出

[[1. 0. 0. 0. 0.]
[0. 1. 0. 0. 0.]
[0. 0. 1. 0. 0.]
[0. 0. 0. 1. 0.]
[0. 0. 0. 0. 1.]]


2.单变量的线性回归

根据城市人口数量,预测开小吃店的利润

第一列是城市人口数量,第二列是在该城市开小吃店的利润

2.1 Plotting the Data

# 用绝对路径有问题,不知道为什么,求解答
# data = pd.read_csv('‪D:\\ML\\Machine Learning\\ex1data1.csv', header=None, names=['Population', 'Profit'])
data = pd.read_csv('ex1data1.csv', header=None, names=['Population', 'Profit'])
print(data.head()) # 打印前五行
data.plot.scatter('Population', 'Profit') # 绘制散点图
plt.show()


吴恩达机器学习ex1_代价函数

2.2 Gradient Descent

在已有的数据集上,训练线性回归的参数θ

2.2.1 代价函数公式

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


python3.5以后@为一个操作符,意为矩阵-向量乘法

2.2.2 准备参数X,y,θ

# 在X矩阵中加一列全为1,方便计算
data.insert(0, 'Ones', 1)

# 初始化X和y
cols = data.shape[1]
X = data.iloc[:, 0:-1] # 获取前三列
y = data.iloc[:, cols-1:cols] # 获取最后一列

X = np.array(X.values) # 转化为数组类型
y = np.array(y.values)

print(X.shape) # X和y的维度
y.reshape(len(y), 1)
print(y.shape)

theta = np.zeros((2, 1)) # 初始化θ
print(theta.shape)
firstCost = costFunc(X, y, theta)
print(firstCost)


iloc:即index locate。iloc[行,列] iloc[:,0:-1]是获取前三列的意思(注:左闭右开)

iloc[:,-1]是获取最后一列

np.zeros()返回一个给定形状和类型的用0填充的数组

2.2.3 计算代价函数

firstCost = costFunc(X, y, theta)
print(firstCost)


由于θ初始为0,计算结果为32.07

2.2.4 梯度下降

def gradientDescent(X, y, theta, alpha, iters):
"""
计算梯度下降的参数
:param X:
:param y:
:param theta:
:param alpha: 学习率
:param iters: 迭代次数
:return: theta,costs
"""
costs = []
for i in range(iters):
theta = theta - (alpha / len(X) * X.T @ (X @ theta - y)) # 梯度下降的公式
cost = costFunc(X, y, theta)
costs.append(cost)
if i % 100 == 0:
print(cost)
return theta, costs


alpha = 0.02

iters = 1000

2.3 画出拟合后的直线

x = np.linspace(data.Population.min(), data.Population.max(), 100)  # 从最小值到最大值的100个均匀的点
f = theta[0, 0] + x

fig, ax = plt.subplots() # 用来创建画布
ax.scatter(X[:, 1], y, label='training data')
ax.plot(x, f, 'r', label='predict')
ax.legend() # 设置图像位置
ax.set(xlabel='population', ylabel='profit') # 设置横纵坐标
plt.show() # 显示图像


numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)

返回[start,stop]范围内间隔均匀的num个数

拟合后的图像为

吴恩达机器学习ex1_机器学习_02

3.多变量线性回归


作者:​​inss!w!​


版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!