VV机器学习入门笔记(一)—python的简单线性回归实现
(准备提桶跑路?)菜鸟的进修之路。这是自己这几天的学习成果,写一篇博客记录一下,便于以后的复习。
文章目录
线性回归(吴恩达机器学习例题)
吴恩达机器学习的线性回归例题分为单变量的和多变量的线性回归这两个问题。对于对想入门机器学习的新手来说,吴恩达的机器学习是一门很好的课程,强烈推荐这门课程!!!下面开始本菜鸟的学习之路介绍。
一、问题
**问题一:**假如你是一家餐厅的CEO,你正在考虑在不同的城市开一家餐厅。该连锁店已经在各个城市有了卡车,并且你已经有了来自城市的利润和人口数据。您希望使用这些数据来帮助您选择下一步要扩展到哪个城市。文件ex1data1.txt包含用于我们的线性回归问题的数据集。第一列是一个城市的人口第二列是这个城市的食品卡车的利润。利润为负值表示亏损。
**问题二:**假设你要卖房子你想知道一个好的市场价格是多少。一种方法是首先收集最近出售的房屋的信息,然后制作一个房价模型。文件ex1data2.txt包含俄勒冈州波特兰市的房价训练数据集。第一栏是房子的面积(平方英尺),第二栏是卧室数,第三栏是房子的价格。
问题一很显然是一个单变量的线性回归问题,问题二是一个多变量的线性回归问题,接下来我们将利用python来实现这两个问题。
二、单变量线性回归
1.引入的库介绍
代码如下:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
numpy 库支持大量的维度数组和矩阵运算,对数组运算提供了大量的数学函数库!pandas是一个强大的分析结构化数据的工具集;它的使用基础是Numpy(提供高性能的矩阵运算)。Python的matplotlib是一个是做数据可视化的强大的画图库。
2.python实现流程
2.1原始数据处理
代码如下:
ex0 = pd.read_csv(r'文件路径', names=['population','profit'])
ex0.insert(0, '$x_0$', 1) #添加一列,列名为x0
2.2读取数据及代价函数
读取数据的代码如下:
def get_dataset(filename):
xdata = np.mat(filename.iloc[:, :-1].values)
ydata = np.mat(filename.iloc[:, -1].values).T
return xdata, ydata
说明,iloc[start:end],索引[开始:结束],左闭右开。例如iolc[ : ,1 : -1],取值为第二列到倒数第二列的所有行数据。
代价函数和梯度下降函数的代码实现:
#代价函数实现
def costfunction(x, y, theta):
csf = np.power(((x @ theta) - y), 2)
return np.sum(csf) / (2 * len(x))
#梯度下降函数
def gradientDescent(x, y, theta, alpha, iters):
cost_list = []
for i in range(iters):
theta = theta - (x.T @ (x @ theta - y)) * alpha / len(x)
cost = costfunction(x, y, theta)
cost_list.append(cost)
return theta, cost_list
2.3可视化
def plotshow(filename):
xdata, ydata = get_dataset(filename)
fig, ax = plt.subplots(figsize=(6, 4)) # 绘出图片比例为6:4
plt.scatter(xdata.A[:, 1], ydata.A, c='b', s=5) #xdata.A是将矩阵转化为列表,s指的是点的大小
ax.set_xlabel('Population')
ax.set_ylabel('Profit')
ax.set_title('The original data Fig')
plt.show()
scatter函数包含的参数可以有很多,这里只举例,c表示为“颜色”,marker表示为“标记”,s是指点的大小,另外linewidths等变量参数。根据数据集得到的散点图如下所示:
直线拟合代码:
def plotReg(filename):
xdata, ydata = get_dataset(filename)
fig, ax = plt.subplots(figsize=(6, 4)) # 绘出图片比例为6:4
plt.scatter(xdata.A[:, 1], ydata.A, c='b',s=5) # xdata.A是将矩阵转化为列表,s指的是点的大小
final_theta , cost = gradientDescent(xdata, ydata, theta, alpha, iters)
yHat = xdata @ final_theta
ax.set_xlabel('Population')
ax.set_ylabel('Profit')
ax.set_title('Predicted Profit vs. Population Size')
plt.plot(xdata[:, 1], yHat, c='r')
plt.show()
计算数值是否稳定可视化代码:
def iters_cost():
fig, ax = plt.subplots(figsize=(8, 4))
ax.plot(np.arange