美文网首页
线性回归的sklearn、tensorflow和keras实现及

线性回归的sklearn、tensorflow和keras实现及

作者: 马淑 | 来源:发表于2018-08-06 14:27 被阅读51次
线性回归模型表示:

数据集data.txt内容如下:


第1、2列是输入x1, x2,第3列是输出y, y=w1x1+w2x2+b

线性回归模型 - sklearn实现
'''
线性回归模型 - sklearn实现
'''
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score

# 载入数据
data = np.loadtxt('data.txt',delimiter=',',dtype=np.float64)

# 分离训练集和测试集
X=data[:,0:-1]
y=data[:,-1]
X_train, X_test, y_train, y_test = train_test_split (X,y,test_size=0.2, random_state=100)

#模型拟合
model = LinearRegression()
model.fit(X_train,y_train)

#模型预测
y_pred = model.predict(X_test)

#输出结果
print('Intercept: ',model.intercept_)  #截距
print('Coefficients: ',model.coef_)     #权重
print('Mean Squared Error:',mean_squared_error(y_test, y_pred)) 
print('Variance Score ',r2_score(y_test, y_pred))

# 可视化结果
fig=plt.figure()
ax = fig.add_subplot(111,projection='3d')
ax.scatter(X_train[:,0],X_train[:,1],y_train,color='black')
ax.scatter(X_test[:,0],X_test[:,1],y_test,color='blue')
ax.scatter(X_test[:,0],X_test[:,1],y_pred,color='red')

x1_fit, x2_fit = np.meshgrid(np.arange(X[:,0].min(), X[:,0].max(), (X[:,0].max()-X[:,0].min())/100),np.arange(X[:,1].min(), X[:,1].max(), (X[:,1].max()-X[:,1].min())/100) )
x_fit= np.column_stack((x1_fit.flatten(),x2_fit.flatten()))

ax.plot_surface(x1_fit,
                    x2_fit,
                    model.predict(x_fit).reshape(100,100),
                    alpha=.5)

plt.show()

输出结果:


线性回归模型 - Tensorflow实现
'''
线性回归模型 - tensorflow实现
'''
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
from sklearn.model_selection import train_test_split
from sklearn import preprocessing

# 载入数据
data = np.loadtxt('data.txt',delimiter=',')

# 分离训练集和测试集
X=data[:,0:-1].astype(np.float32)
y=data[:,-1].astype(np.float32)

scaler = preprocessing.StandardScaler().fit(X)
print(scaler.mean_, scaler.scale_)
X= scaler.transform(X)
print(X)
X_train, X_test, y_train, y_test = train_test_split (X,y,test_size=0.2, random_state=100)

#模型拟合
with tf.name_scope('Weight'):
        W=tf.Variable(tf.random_normal([2,1]),name='W')
        tf.summary.histogram('weights',W)
with tf.name_scope('biase'):
        b=tf.Variable(tf.zeros([1,1])+0.1,name='b')
        tf.summary.histogram('biase',b)
with tf.name_scope('Wx_plus_b'):
        Wx_plus_b=tf.matmul(X_train,W)+b
        tf.summary.histogram('Wx_plus_b',Wx_plus_b)
 
with tf.name_scope('loss'):
        loss=tf.reduce_mean(tf.square(y_train.reshape(-1,1)-Wx_plus_b))
        tf.summary.scalar('loss',loss)

with tf.name_scope('train'):
        train=tf.train.GradientDescentOptimizer(0.5).minimize(loss)

sess=tf.Session()
merged = tf.summary.merge_all() # pack summary
writer = tf.summary.FileWriter('logs/',sess.graph)
init=tf.global_variables_initializer()
sess.run(init)

for i in range(1000):
        sess.run(train)
        print(sess.run(loss))
        #print(sess.run(Wx_plus_b))
        #print(y_train.reshape(-1,1))
        print(sess.run(W))
        print(sess.run(b))
        result = sess.run(merged)
        writer.add_summary(result,i)

print ("Coefficients of tensorflow (raw input): K=%s, b=%s"% (sess.run(W).flatten() / scaler.scale_, sess.run(b).flatten() - np.dot(scaler.mean_ / scaler.scale_, sess.run(W))))

输出结果:


线性回归模型 - keras实现
'''
线性回归模型 - keras实现
'''
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from keras.models import Sequential
from keras.layers import Dense
from sklearn.model_selection import train_test_split
from sklearn import preprocessing

# 载入数据
data = np.loadtxt('data.txt',delimiter=',')
X=data[:,0:-1].astype(np.float32)
y=data[:,-1].astype(np.float32)


#归一化
scaler = preprocessing.StandardScaler().fit(X)
print(scaler.mean_, scaler.scale_)
X= scaler.transform(X)

# 分离训练集和测试集
X_train, X_test, y_train, y_test = train_test_split (X,y,test_size=0.2, random_state=100)


#可视化
fig=plt.figure()
ax=fig.add_subplot(111,projection='3d')
ax.scatter(X_train[:,0],X_train[:,1],y_train,color='black')
ax.scatter(X_test[:,0],X_test[:,1],y_test,color='blue')

model=Sequential()
model.add(Dense( input_dim=2,output_dim=1))
model.compile(loss='mse', optimizer='sgd')

print('Training...')
for step in range(1000):
        cost=model.train_on_batch(X_train, y_train)
        if step%100==0:
                print('train cost:',cost)

print('Testing...')
cost=model.evaluate(X_test, y_test,batch_size=10)
print('test cost:', cost)
W,b=model.layers[0].get_weights()
print('Weights=',W.flatten() / scaler.scale_,'\nbiases=',b.flatten()/ scaler.scale_)

x1_fit, x2_fit=np.meshgrid(np.arange(X[:,0].min(),X[:,0].max(),(X[:,0].max()-X[:,0].min())/100),np.arange(X[:,1].min(),X[:,1].max(),(X[:,1].max()-X[:,1].min())/100))
x_fit=np.column_stack((x1_fit.flatten(),x2_fit.flatten()))
ax.plot_surface(x1_fit,x2_fit,model.predict(x_fit).reshape(100,100),alpha=.5)
plt.show()

输出结果:


相关文章

网友评论

      本文标题:线性回归的sklearn、tensorflow和keras实现及

      本文链接:https://www.haomeiwen.com/subject/istgvftx.html