线性回归作业

#调用一些库
import numpy as np   #numpy能够实现矩阵计算
import pandas as pd  #pandas能够实现数据分析
import matplotlib.pyplot as plt  #matplotlib能够绘制各种图表
path='data1.txt'  #定义变量path,如果把文件放到根目录下,那么panth=文件名就可以了  常规的处理办法是path="文件绝对路径+文件名"


#读取数据集  使用pandas里面的read_csv函数  此函数可以读取 .csv  .txt 等格式的文件 
#read_csv函数传入的第一个参数为path(数据集的绝对路径)
#第二个参数是header=None 本题读取.txt类型的文件 但是该文件没有标题行(类似表格的列名),那么就需要指定header=None,从而避免第一行被当成了标题行
#第三个参数是给数据集添加标题行  如果不写names=['Population','Profit']  那么默认标题行为 0 和 1
data=pd.read_csv(path,header=None,names=['Population','Profit'])


#预览一下 head函数是显示前五行  同理tail函数显示的是倒数五行
data.head()
PopulationProfit
06.110117.5920
15.52779.1302
28.518613.6620
37.003211.8540
45.85986.8233
data.describe() #describe函数是展示一下数据的一些信息  这个可以去掉
PopulationProfit
count97.00000097.000000
mean8.1598005.839135
std3.8698845.510262
min5.026900-2.680700
25%5.7077001.986900
50%6.5894004.562300
75%8.5781007.046700
max22.20300024.147000
#画图  plot函数


#第一个参数是图的种类scatter是散点图的意思
#第二、第三个参数是x轴y轴的值
#第四个参数是指定图片的大小(可修改)
data.plot(kind='scatter', x='Population', y='Profit', figsize=(14,10))
#展示画的图
plt.show()


在这里插入图片描述

#定义代价函数  我们的目标就是要让代价函数越小越好!(你可以把代价函数理解称“误差”)

#power函数:乘方运算
#.T是矩阵的转置
#sum函数:求和
#len函数:返回列表的长度
#传入三个参数X Y theta 

#我们不用关心代价函数为什么要这样定义
#只要把代价函数的数学公式用python敲出来就好

def computeCost(X,Y,theta):
    
    inner=np.power(((X*theta.T)-Y),2)
    
    return np.sum(inner)/(2*len(X))#返回的是代价函数的值
#训练集中添加一列,以便我们可以使用向量化的解决方案来计算代价和梯度。
data.insert(0, 'Ones', 1)

#预览一下数据
data.head()
OnesPopulationProfit
016.110117.5920
115.52779.1302
218.518613.6620
317.003211.8540
415.85986.8233
#变量初始化

#要从文件中将X和Y的值分离出来

cols = data.shape[1]#shape[1]是矩阵的第二维长度,也就是列数

#iloc函数的用法
#比如iloc[ : , 0:2 ] 第一个“:”是遍历的意思  第二个“0:2” 是从是第0、1列 
#因为在python中“:”是左闭右开的区间  0:2 等价于[0,2)

X = data.iloc[:,0:cols-1]#X是原矩阵去掉最后一列组成的的矩阵

Y = data.iloc[:,cols-1:cols]#Y是最后一列组成的矩阵
#预览一下X
X.head()#head()是观察前5行
OnesPopulation
016.1101
115.5277
218.5186
317.0032
415.8598
#预览一下Y
Y.head()
Profit
017.5920
19.1302
213.6620
311.8540
46.8233
#np.matrix函数:创建一个新的相同的矩阵。当修改新矩阵时,原来的矩阵不会改变。
#values函数:获取值

X = np.matrix(X.values)
Y = np.matrix(Y.values)

#np.array函数:创建一个数组
#然后再用np.matrix把它转成矩阵
theta = np.matrix(np.array([0,0]))
#查看一下它们的形状
X.shape, theta.shape, Y.shape
((97, 2), (1, 2), (97, 1))
#梯度下降函数

#alpha是学习速率,iters是迭代次数()
def gradientDescent(X, Y, theta, alpha, iters):
    
    #np.zeros是产生一个给定形状和类型的用0填充的数组
    temp = np.matrix(np.zeros(theta.shape))#定义一个和theta相同形状的零矩阵
    
    parameters = int(theta.ravel().shape[1])#ravel函数:ravel是散开的意思,就是把theta第二列散开成一维数组
                                            #这个函数产生的是副本,不会改变原来的theta矩阵
    
    cost = np.zeros(iters)
    
    #以下是梯度下降公式的实现
    
    for i in range(iters):
        error = (X * theta.T) - 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  #定义学习速率为0.01
iters = 1000  #定义迭代次数为1000
#以上两个参数涉及机器学习的更深层次的知识,可以先不做深究
g, cost = gradientDescent(X, Y, theta, alpha, iters)
#使用gradientDescent函数:得到theta矩阵,赋值给g;得到代价函数的一系列数值,并赋值给cost列表
computeCost(X, Y, g)  #这里得到的是代价函数的最小值
4.515955503078914
x = np.linspace(data.Population.min(), data.Population.max(), 100)#np.linspace函数:以均匀步长生成数字序列 100是指有100个点

f = g[0, 0] + (g[0, 1] * x)  # f=b+kx  g[0,0]是b  g[0,1]是k

fig, ax = plt.subplots(figsize=(12,8))
ax.plot(x, f, 'r', label='Prediction')  #(x轴,y轴,红色,图例:左上角那个)
ax.scatter(data.Population, data.Profit, label='Traning Data')  #(x轴是Population,y轴是Profit,图例:左上角那个)
ax.legend(loc=2)#lengend是设置图例的位置、大小......这里给loc参数赋值为2,就是放在图片这个位置(没搞懂)

ax.set_xlabel('Population')#设置x轴是Population
ax.set_ylabel('Profit')#设置y轴是Profit
ax.set_title('Predicted Profit vs. Population Size')#设置标题
plt.show()#展示图表


在这里插入图片描述

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值