Penho
2019-10-10 11:28
# 生成数据文件 import random # 函数前要有空白两行 否则报错 def f(X1, X2, X3): return 0.65 * X1 + 0.70 * X2 - 0.55 * X3 + 1.95 # 函数前要有空白两行 否则报错 def produce(): c = 0 with open('data.csv', 'w') as file: # 直接写文件名去找到相对路径,即当前项目所在路径中创建名为data的文件 C:\Users\Pen\PycharmProjects\demo file.write('0,Y,X1,X2,X3\n') for i in range(200): # 通过缩进表示循环语句的范围 random.seed() # 设置随机种子数seed,默认参数seed()下 每次生成的随机数都不同 # random.seed(2) # 设定seed后的数字,用random.random()生成的随机数将唯一,如设定random.seed(2) 后面将会输出0.95 ,设定random.seed(3)后将会输出0.88 print(random.random()) x1 = random.random() * 10 x2 = random.random() * 10 x3 = random.random() * 10 y = f(x1, x2, x3) c = c + 1 try: file.write(str(c) + ',' + str(y) + ',' + str(x1) + ',' + str(x2) + ',' + str(x3) + '\n') except IOError: print('Write Error') # 空白两行 if __name__ == '__main__': produce() import numpy as np from numpy.linalg import inv from numpy import dot from numpy import mat import pandas as pd dataSet = pd.read_csv('data.csv') # 读取文件 print(dataSet) temp = dataSet.iloc[:, 2:5] # 输出 2 3 4 列 # print(temp) temp['x0'] = 1 # temp的第0 1 2列是原来的 x1 x2 x3 x0 X = temp.iloc[:, [3, 0, 1, 2]] # 将上述的 x1 x2 x3 x0 变为 x0 x1 x2 x3 Y = dataSet.iloc[:, 1].values.reshape(200, 1) # 输出第0列 # Z = dataSet.iloc[:, 2] # 输出第1列 # print(X) # print(Y) # print(Z) # 1.用公式法直接求theta 缺点:比较耗资源 theta = dot(dot(inv(dot(X.T, X)), X.T), Y) print(theta.reshape(4, 1)) # 2.用梯度下降法求theta 记得用temp去存变化值实现迭代 theta = np.array([1., 1., 1., 1.]).reshape(4, 1) # 将1行4列的矩阵 转 4行1列 alpha = 0.02 # learning rate 学习率,越小越慢。太大会导致过了极值点 temp = theta # X0_r = X.iloc[:, 0] X0 = X.iloc[:, 0].values.reshape(200, 1) # 将csv文件的第0列取出,构建一个200行1列的矩阵 # print(X0_r) 是csv的列 默认带序号 # print(X0) 是矩阵 去掉默认 X1 = X.iloc[:, 1].values.reshape(200, 1) # X1表示表格中第1列的数据构成200行1列的矩阵 X2 = X.iloc[:, 2].values.reshape(200, 1) # X2表示表格中第2列的数据构成200行1列的矩阵 X3 = X.iloc[:, 3].values.reshape(200, 1) # X3表示表格中第3列的数据构成200行1列的矩阵 for i in range(10000): temp[0] = theta[0] + alpha * np.sum((Y - dot(X, theta)) * X0) / 200. temp[1] = theta[1] + alpha * np.sum((Y - dot(X, theta)) * X1) / 200. temp[2] = theta[2] + alpha * np.sum((Y - dot(X, theta)) * X2) / 200. temp[3] = theta[3] + alpha * np.sum((Y - dot(X, theta)) * X3) / 200. theta = temp print(theta)
还没有人回答问题,可以看看其他问题
Python实现线性回归
26151 学习 · 36 问题
相似问题