import time
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
A = pd.read_table('01.txt',header=None,usecols = (0,1,2))
# 插入一列 1
A.insert(0,'insert',1)
# 规划一 特征值调整到 0-1
# A.iloc[:,1]=(A.iloc[:,1]-A.iloc[:,1].mean() )/(A.iloc[:,1].max()-A.iloc[:,1].min())
# A.iloc[:,2]=(A.iloc[:,2]-A.iloc[:,2].mean() )/(A.iloc[:,2].max()-A.iloc[:,2].min())
X = np.mat(A.iloc[:,:3])
y = np.mat(A.iloc[:,3]).T
m,n = X.shape
# 初始参数
params = np.mat([1.0,1.0,1.0]).T
alpha = 0.001 #学习率
times = 1000 #迭代次数
# sigmoid 函数
def sigmoid(inX):
return 1.0/(1+np.exp(-inX))
J = []
# 迭代参数 梯度下降
for i in range(times):
error_col = sigmoid(X*params) - y
params[0] = params[0] - alpha*sum( error_col )
params[1] = params[1] - alpha*sum(np.multiply(error_col,X[:,1]))
params[2] = params[2] - alpha*sum(np.multiply(error_col,X[:,2]))
J.append(sum( np.multiply(error_col,error_col) )[0,0] )
print(params)
# 可视化
# 收敛图像
x1 = range(0,times,1) # 起始值 终止值 步长
plt.subplot(121),plt.plot(x1,J,'r--'),plt.title('J - Itera'),plt.xlabel('Itera Times'),plt.ylabel(' J ')
# 拟合函数图像
x2=np.linspace(-4,4,50) #开始值 终止值 元素个数
plt.subplot(122),plt.plot(A[A.iloc[:,3]==1].iloc[:,1],A[A.iloc[:,3]==1].iloc[:,2],'b*'),plt.plot(A[A.iloc[:,3]==0].iloc[:,1],A[A.iloc[:,3]==0].iloc[:,2],'ro'),plt.plot(x2,params[0,0]+params[1,0]*x2+params[2,0]*x2,'g--')
plt.show()