为了账号安全,请及时绑定邮箱和手机立即绑定

自己跑通的代码pyhon3.7,包括生成数据文件,没问题。

# 生成数据文件
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)


正在回答

举报

0/150
提交
取消

自己跑通的代码pyhon3.7,包括生成数据文件,没问题。

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信