import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore")
f = open('C:\\Users\\admin\\Desktop\\梯度下降\\data\\LogiReg_data.txt')
# header = None, csv文件中第一行是列名,不是数据
# names = [],自己设置列名
pdData = pd.read_csv(f, header=None, names=['Exam 1', 'Exam 2', 'Admitted'])
# 输出文件的前五行
print(pdData.head())
# 输出数据的维度 (100,3) 2维:100表示数据个数有100个,3表示每个样本有3列
print(pdData.shape)
# 指定正例,样本数据中,若Admitted列为1,则为positive
positive = pdData[pdData['Admitted'] == 1]
# 指定负例,样本数据中,若Admitted列为0,则为negative
negative = pdData[pdData['Admitted'] == 0]
# figsize:指定画图的大小,长 10和宽 5
# 建立一个fig对象,建立一个axis对象
fig,ax=plt.subplots(figsize=(10,5))
#scatter:画散点图,label:标签,c:颜色(b蓝色,r红色),marker:散点图中点的样子
ax.scatter(positive["Exam 1"],positive["Exam 2"],s=30,c='b',marker='o',label='Admitted')
ax.scatter(negative["Exam 1"],negative["Exam 2"],s=30,c='r',marker='x',label='Not Admitted')
ax.legend()
# 设置横坐标下的文本
ax.set_xlabel("Exam 1 Score")
# 设置纵坐标旁的文本
ax.set_ylabel("Exam 2 Score")
# plt.show()
def sigmoid(z):
return 1 / (1 + np.exp(-z))
#创建一个包含20个等间距值-10到10的向量
nums = np.arange(-10, 10, step=1)
fig, ax = plt.subplots(figsize=(12,4))
ax.plot(nums, sigmoid(nums), 'r')
# plt.show()
# 预测函数,矩阵相乘
def model(X, theta):
return sigmoid(np.dot(X, theta.T))
# 在 dataFrames 中新增加一列,这一列的值全为 1
pdData.insert(0, 'Ones', 1)
# 将数据的 Pandas表示转换为可用于进一步计算的数组
orig_data = pdData.as_matrix()
cols = orig_data.shape[1]
X = orig_data[:,0:cols-1]
y = orig_data[:,cols-1:cols]
# 构造 一行三列 的theta参数
theta = np.zeros([1, 3])
# 定义损失函数 , 对数似然函数去负号
# left: 输入 x 和 theta , 求sigmoid值 得 a -> 求 a 的对数值,得 b -> 与 y 相乘
# right: 输入 x 和 theta , 求sigmoid值 得 a -> 求 1 - a 的对数值,得 b -> 与 1 - y 相乘
# 损失函数的值 -> 平均损失值 : sum(left - right)/x的数量
def cost(X, y, theta):
left = np.multiply(-y, np.log(model(X, theta)))
right = np.multiply(1 - y, np.log(1 - model(X, theta)))
return np.sum(left - right) / (len(X))
print(cost(X, y, theta))
# 计算梯度
# 对theta求偏导
def gradient(X, y, theta):
# 占位:设置梯度的大小,和theta的维度是一样的
grad = np.zeros(theta.shape)
# ravel()扁平化操作,把多维数组变成一维数组
error = (model(X, theta) - y).ravel()
for j in range(len(theta.ravel())): # for each parmeter
# X[:,j] 冒号代表全体样本,j取第j列
term = np.multiply(error, X[:, j])
# 算最终值 求和再除以个数
grad[0, j] = np.sum(term) / len(X)
return grad
网友评论