<>必做部分:(主要参考了黄海广老师的文档)
import numpy as np import matplotlib.pyplot as plt import pandas as pd df = pd.
read_csv('ex1data1.txt', names=['population', 'profit']) data = df #def 
normalize_feature(df): #return df.apply(lambda column: (column - column.mean()) 
/ column.std())#特征缩放 def get_X(df):#读取特征 ones = pd.DataFrame({'ones': np.ones(
len(df))})#ones是m行1列的dataframe data = pd.concat([ones, df], axis=1) # 
合并数据,根据列合并 axis: 需要合并链接的轴,0是行,1是列 return data.iloc[:, :-1] def linear_cost(theta
, X , y): m = X.shape[0] #样本数 inner = X @ theta - y #与目标的差值即h(theta),inner算出来为一行
 square_sum= inner.T @ inner #h(theta)的平方 cost = square_sum/(2*m) return cost 
def gradient(theta, X, y): m = X.shape[0] inner = X.T @ (X@theta - y) 
#X仅有仅有一个特征,恒为1的不算,即该语句算的是更新theta1时,损失函数对theta1的求导 return inner/m def 
batch_gradient_decent(theta, X, y, epoch, alpha=0.02): cost_data = [linear_cost(
theta, X, y)] for _ in range(epoch): #_仅是一个循环标志,在循环中不会用到 theta = theta - alpha *
 gradient(theta, X, y) cost_data.append(linear_cost(theta, X, y)) return theta, 
cost_data X= get_X(df) y = df.values[:, 1] theta = np.zeros(df.shape[1]) epoch =
6000 final_theta, cost_data = batch_gradient_decent(theta, X, y, epoch) b = 
final_theta[0] k = final_theta[1] plt.scatter(data.population, data.profit, 
label="Training data") plt.plot(data.population, data.population*k + b, label=
"Prediction") plt.xlabel('population') plt.ylabel('profit') plt.legend(loc=2) 
forecast= float(input('population')) predict_profit = forecast*k+b print(
predict_profit) plt.scatter(forecast, predict_profit, marker='+', c='red') plt.
show() 
 我预测值(forecast)输入的23,用红色标记了
 <>选作部分
import numpy as np import matplotlib.pyplot as plt import pandas as pd ax = plt
.axes(projection='3d') df = pd.read_csv('ex1data2.txt', names=['square', 
'bedrooms', 'price']) def normalize_feature(df): return df.apply(lambda column: 
(column - column.mean()) / column.std()) def get_X(df):#读取特征 ones = pd.DataFrame
({'ones': np.ones(len(df))})#ones是m行1列的dataframe data = pd.concat([ones, df], 
axis=1) # 合并数据,根据列合并 axis: 需要合并链接的轴,0是行,1是列 return data.iloc[:, :-1] def lr_cost
(theta, X, y): m = X.shape[0]#m为样本数 inner = X @ theta - y # R(m*1),X @ 
theta等价于X.dot(theta) square_sum = inner.T @ inner cost = square_sum / (2 * m) 
return cost def gradient(theta, X, y): m = X.shape[0] #样本个数 inner = X.T @ (X @ 
theta- y) # (m,n).T @ (m, 1) -> (n, 1),X @ theta等价于X.dot(theta) return inner / m
def batch_gradient_decent(theta, X, y, epoch, alpha=0.01): cost_data = [lr_cost(
theta, X, y)] for _ in range(epoch): theta = theta - alpha * gradient(theta, X, 
y) cost_data.append(lr_cost(theta, X, y)) return theta, cost_data def normalEqn(
X, y): #正规方程 theta = np.linalg.inv(X.T@X)@X.T@y#X.T@X等价于X.T.dot(X) return theta 
data= normalize_feature(df) #特征缩放 y = data.values[:, 2] X = get_X(data) ax.
scatter(X['square'], X['bedrooms'], y, alpha=0.3) plt.xlabel('square') plt.
ylabel('bedrooms') ax.set_zlabel(r'$prices$') epoch = 500 alpha = 0.01 theta = 
np.zeros(X.shape[1]) #在该问题中X有三个特征(1,square,bedrooms),所以theta初始为三个零 final_theta, 
cost_data= batch_gradient_decent(theta, X, y, epoch, alpha=alpha) D = 
final_theta[0] A = final_theta[1] B = final_theta[2] Z = A*X['square'] + B*X[
'bedrooms'] + D ax.plot_trisurf(X['square'], X['bedrooms'], Z, linewidth=0, 
antialiased=False) predict_square = float(input('square:')) predict_square = ((
predict_square- df.square.mean())/df.square.std()) predict_bedrooms = float(
input('bedrooms')) predict_bedrooms = ((predict_bedrooms - df.bedrooms.mean())/
df.bedrooms.std()) p = A * predict_square + B*predict_bedrooms + D ax.scatter(
predict_square, predict_bedrooms, marker='+', c='red') p = p * df.price.std() + 
df.price.mean() print('I predict the prices is :') print(p) plt.show() 
输入为
 square=1635
 bedrooms=3
 I predict the prices is :
 292611.913236568
 理论上说预测的点应该在所画的平面上,但实际却不在,可能是因为我平面画的不对。预测结果可以使用。