机器学习(吴恩达)第二周作业的python实现

ex1.py:

# coding=UTF-8

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D #绘制3D坐标的函数
import threading
import myFun

## Machine Learning Online Class - Exercise 1: Linear Regression

#  Instructions
#  ------------
#
#  This file contains code that helps you get started on the
#  linear exercise. You will need to complete the following functions
#  in this exericse:
#
#     warmUpExercise.m
#     plotData.m
#     gradientDescent.m
#     computeCost.m
#     gradientDescentMulti.m
#     computeCostMulti.m
#     featureNormalize.m
#     normalEqn.m
#
#  For this exercise, you will not need to change any code in this file,
#  or any other files other than those mentioned above.
#
# x refers to the population size in 10,000s
# y refers to the profit in $10,000s
#

## Initialization
# clear ; close all; clc

## ==================== Part 1: Basic Function ====================
# Complete warmUpExercise.m
print('Running warmUpExercise ... ')
print('5x5 Identity Matrix: ')
print(myFun.warmUpExercise())

input("按回车继续:")

## ======================= Part 2: Plotting =======================
print('Plotting Data ...')
data = np.loadtxt('ex1data1.txt', delimiter=',')
# print("显示data的shape:")
# print(data.shape)  #显示data的shape
X = data[:, 0]
y = data[:, 1]
# 下面两句是对X,y进行整形,整形的目的是化一维为二维(哪怕二维数组中只有一行),因为只有在二维数组中才有行与列的区分
X = np.reshape(X, (X.shape[0], 1))
y = np.reshape(y, (y.shape[0], 1))
# print(X.shape,y.shape)

m = y.shape[0]  # 获取行数
# print(m)

# Plot Data
# Note: You have to complete the code in plotData.m
# 下面二行是给绘图函数单开线程运行,以达到绘图后不用关闭图主程序也能继续运行的目的,args为参数;
# 但目前有个问题:图像关闭后会产生一个Tcl_AsyncDelete异常
# t1 = threading.Thread(target=myFun.plotData, args=(X, y))
# t1.start()
myFun.plotData(X, y)
input("按回车继续:")

## =================== Part 3: Cost and Gradient descent ===================

X = np.c_[np.ones(m), data[:, 0]]  # Add a column of ones to x
# print(X)
theta = np.zeros((2, 1))  # initialize fitting parameters(注意此处theta的初始化方法,theta是2*1大小数组
# print(theta.shape)
# Some gradient descent settings
iterations = 1500
alpha = 0.01

print('Testing the cost function ...')
# compute and display initial cost
J = myFun.computeCost(X, y, theta)
print('With theta = [0 ; 0]\nCost computed = ' + repr(J))
print('Expected cost value (approx) 32.07')

# further testing of the cost function
J = myFun.computeCost(X, y, np.array([[-1], [2]]))
print('\nWith theta = [-1 ; 2]\nCost computed = ' + repr(J))
print('Expected cost value (approx) 54.24\n')

input("按回车继续:")

print('\nRunning Gradient Descent ...')
# run gradient descent
(theta, J_history) = myFun.gradientDescent(X, y, theta, alpha, iterations)
# print("debug:" + repr(J_history))
# print("debug:" + repr(J_history.shape))
# print theta to screen
print('Theta found by gradient descent:')
print(theta)
print('Expected theta values (approx)')
print("-3.6303\n  1.1664\n")
# Plot the linear fit
# hold on; # keep previous plot visible
plt.scatter(X[:, 1], y, label='Training data', color='r', s=50, marker="x")  # s参数代表符号大小
plt.plot(X[:, 1], np.dot(X, theta), 'b-', label='Linear regression', linewidth=2)
plt.xlabel('population')
plt.ylabel('revenue')
plt.legend()
plt.show()
# legend('Training data', 'Linear regression')
# hold off # don't overlay any more plots on this figure

# Predict values for population sizes of 35,000 and 70,000
predict1 = np.dot([[1, 3.5]], theta)  # 注意此处构建theta参数的方法,numpy中[1,3.5]是个一维数组,但[[1,3.5]]是个二维数组(只不过这个二维数组只有一行罢了)
print('For population = 35,000, we predict a profit of ' + repr(predict1 * 10000))
predict2 = np.dot([[1, 7]], theta)
print('For population = 70,000, we predict a profit of ' + repr(predict2 * 10000))

print('Program paused. Press enter to continue.')
input("按回车继续:")

## ============= Part 4: Visualizing J(theta_0, theta_1) =============
print('Visualizing J(theta_0, theta_1) ...')

# Grid over which we will calculate J
theta0_vals = np.linspace(-10, 10, 20)
theta1_vals = np.linspace(-1, 4, 20)

# initialize J_vals to a matrix of 0's
J_vals = np.zeros((theta0_vals.shape[0] , theta1_vals.shape[0]))

# Fill out J_vals
for i in range(0,theta0_vals.shape[0]):
    for j in range(0,theta1_vals.shape[0]):
        t = [[theta0_vals[i]],[theta1_vals[j]]]
        J_vals[i, j] = myFun.computeCost(X, y, t)

# Because of the way meshgrids work in the surf command, we need to
# transpose J_vals before calling surf, or else the axes will be flipped
#J_vals = J_vals.T
#print(J_vals.shape)
# Surface plot
#figure;
fig=plt.figure()#创建一个绘图对象
ax=Axes3D(fig)#用这个绘图对象创建一个Axes对象(有3D坐标)
theta0_vals,theta1_vals=np.meshgrid(theta0_vals,theta1_vals)  #用这两个arange对象中的可能取值一一映射去扩充为所有可能的取样点
plt.title("Visualizing J(theta_0, theta_1)")#总标题
ax.plot_surface(theta0_vals, theta1_vals, J_vals, rstride=1, cstride=1, cmap=plt.cm.coolwarm)#用取样点(x,y,z)去构建曲面
ax.set_xlabel('Ɵ0', color='r')
ax.set_ylabel('Ɵ1', color='g')
ax.set_zlabel('J', color='b')#给三个坐标轴注明
plt.show()#显示模块中的所有绘图对象

#下面代码绘制等高线图
#为等高线填充颜色 10表示按照高度分成10层 alpha表示透明度 cmap表示渐变标准
plt.contourf(theta0_vals,theta1_vals,J_vals,10,alpha=0.75,cmap=plt.cm.hot)
#使用contour绘制等高线
C=plt.contour(theta0_vals,theta1_vals,J_vals,10,colors='black')
#在等高线处添加数字
plt.clabel(C,inline=True,fontsize=10)
plt.scatter(theta[0,0], theta[1,0], color='r', s=50, marker="x")
plt.xlabel('theta0')
plt.ylabel('theta1')
#显示图片
plt.show()


myFun.py:

# coding=UTF-8
import numpy as np
import matplotlib.pyplot as plt


def warmUpExercise():
    A = np.eye(5)  # 5维单位矩阵
    return A


def plotData(x, y):
    # PLOTDATA Plots the data points x and y into a new figure
    #   PLOTDATA(x,y) plots the data points and gives the figure axes labels of
    #   population and profit.
    # ====================== YOUR CODE HERE ======================
    # Instructions: Plot the training data into a figure using the
    #               "figure" and "plot" commands. Set the axes labels using
    #               the "xlabel" and "ylabel" commands. Assume the
    #               population and revenue data have been passed in
    #               as the x and y arguments of this function.
    #
    # Hint: You can use the 'rx' option with plot to have the markers
    #       appear as red crosses. Furthermore, you can make the
    #       markers larger by using plot(..., 'rx', 'MarkerSize', 10);
    plt.scatter(x, y, label="Training data", color='r', s=50, marker="x")  # s参数代表符号大小
    plt.xlabel('population')
    plt.ylabel('revenue')
    plt.legend()
    plt.show()


def computeCost(X, y, theta):
    # COMPUTECOST Compute cost for linear regression
    #   J = COMPUTECOST(X, y, theta) computes the cost of using theta as the
    #   parameter for linear regression to fit the data points in X and y
    # Initialize some useful values
    m = y.shape[0]  # number of training examples
    # You need to return the following variables correctly
    J = 0
    # ====================== YOUR CODE HERE ======================
    # Instructions: Compute the cost of a particular choice of theta
    #               You should set J to the cost.
    predictions = np.dot(X, theta)  # 求X与theta的内积
    # print("predictions's size:",predictions.shape)
    # print("y's size:",y.shape)
    # print("p-y's szie:",(predictions-y).shape)

    sqr = np.power(predictions - y, 2)
    # print(sqr)
    # print("sqr's size:",sqr.shape)
    # print("sum:",np.sum(sqr))
    J = 1 / (2 * m) * np.sum(sqr)
    return J


def gradientDescent(X, y, theta, alpha, num_iters):
    # GRADIENTDESCENT Performs gradient descent to learn theta
    #   theta = GRADIENTDESCENT(X, y, theta, alpha, num_iters) updates theta by
    #   taking num_iters gradient steps with learning rate alpha

    # Initialize some useful values
    m = y.shape[0]  # number of training examples
    J_history = np.zeros((num_iters, 1))

    for iter in range(0, num_iters):
        # ====================== YOUR CODE HERE ======================
        # Instructions: Perform a single gradient step on the parameter vector
        #               theta.
        #
        # Hint: While debugging, it can be useful to print out the values
        #       of the cost function (computeCost) and gradient here.
        #
        predictions = np.dot(X , theta)
        theta = theta - alpha / m * (np.dot((predictions - y).T , X)).T
        #print("de:"+repr(theta))
        # ============================================================
        # Save the cost J in every iteration
        J_history[iter] = computeCost(X, y, theta)
    return (theta,J_history)

 

你可能感兴趣的:(python)