1.文件 (singleFeature.txt)
6.1101,17.592
5.5277,9.1302
8.5186,13.662
7.0032,11.854
5.8598,6.8233
8.3829,11.886
7.4764,4.3483
8.5781,12
6.4862,6.5987
5.0546,3.8166
5.7107,3.2522
14.164,15.505
5.734,3.1551
8.4084,7.2258
5.6407,0.71618
5.3794,3.5129
6.3654,5.3048
5.1301,0.56077
6.4296,3.6518
7.0708,5.3893
6.1891,3.1386
20.27,21.767
5.4901,4.263
6.3261,5.1875
5.5649,3.0825
18.945,22.638
12.828,13.501
10.957,7.0467
13.176,14.692
22.203,24.147
5.2524,-1.22
6.5894,5.9966
9.2482,12.134
5.8918,1.8495
8.2111,6.5426
7.9334,4.5623
8.0959,4.1164
5.6063,3.3928
12.836,10.117
6.3534,5.4974
5.4069,0.55657
6.8825,3.9115
11.708,5.3854
5.7737,2.4406
7.8247,6.7318
7.0931,1.0463
5.0702,5.1337
5.8014,1.844
11.7,8.0043
5.5416,1.0179
7.5402,6.7504
5.3077,1.8396
7.4239,4.2885
7.6031,4.9981
6.3328,1.4233
6.3589,-1.4211
6.2742,2.4756
5.6397,4.6042
9.3102,3.9624
9.4536,5.4141
8.8254,5.1694
5.1793,-0.74279
21.279,17.929
14.908,12.054
18.959,17.054
7.2182,4.8852
8.2951,5.7442
10.236,7.7754
5.4994,1.0173
20.341,20.992
10.136,6.6799
7.3345,4.0259
6.0062,1.2784
7.2259,3.3411
5.0269,-2.6807
6.5479,0.29678
7.5386,3.8845
5.0365,5.7014
10.274,6.7526
5.1077,2.0576
5.7292,0.47953
5.1884,0.20421
6.3557,0.67861
9.7687,7.5435
6.5159,5.3436
8.5172,4.2415
9.1802,6.7981
6.002,0.92695
5.5204,0.152
5.0594,2.8214
5.7077,1.8451
7.6366,4.2959
5.8707,7.2029
5.3054,1.9869
8.2934,0.14454
13.394,9.0551
5.4369,0.61705
2.代码(因为数据集本身没有排序,故未随机分开)
import matplotlib.pyplot as plt
import numpy as np
# y=wx+b
f = open('singleFeature.txt', 'r') # 读文件
x = []
y = []
while 1:
yihang = f.readline()
if len(yihang) <= 1:
break
fenkai = yihang.split(',')
fenkai[0] = eval(fenkai[0])
fenkai[1] = eval(fenkai[1])
x.append(fenkai[0])
y.append(fenkai[1])
plt.figure(1) # 绘制散点图1 全部训练+测试
plt.scatter(x, y, )
plt.xlabel('x')
plt.ylabel('y')
plt.title('')
x0 = sum(x) / len(x) # x平均
y0 = sum(y) / len(y) # y平均
w1 = w2 = w3 = 0
for i in range(len(x)):
w1 += y[i] * (x[i] - x0)
w2 += x[i] * x[i]
w3 += x[i]
w3 = w3 * w3 / len(x)
w = w1 / (w2 - w3) # 计算w
b = 0
for i in range(len(x)):
b += y[i] - (w * x[i])
b /= len(x) # 计算b
error = 0
for i in range(len(x)):
error += (w * x[i] + b - y[i]) ** 2
error /= len(x) # 计算均方误差
print('w1 = ', w, ',b1 = ', b, '误差1 = ', error)
xl = np.arange(5, 25, 0.1) # 绘制回归直线
yl = w * xl + b
plt.plot(xl, yl, 'r')
plt.figure(2) # 绘制散点图2 分开训练+测试
x1 = x[0:60]
y1 = y[0:60]
x2 = x[60:len(x)]
y2 = y[60:len(y)]
plt.scatter(x1, y1, c='b') # 测试点
plt.scatter(x2, y2, c='g') # 训练点
plt.xlabel('x')
plt.ylabel('y')
plt.title('')
x0 = sum(x1) / len(x1) # x平均
y0 = sum(y1) / len(y1) # y平均
w1 = w2 = w3 = 0
for i in range(len(x1)):
w1 += y1[i] * (x1[i] - x0)
w2 += x1[i] * x1[i]
w3 += x1[i]
w3 = w3 * w3 / len(x1)
w = w1 / (w2 - w3) # 计算w
b = 0
for i in range(len(x1)):
b += y1[i] - (w * x1[i])
b /= len(x1) # 计算b
error = 0
for i in range(len(x2)):
error += (w * x2[i] + b - y2[i]) ** 2
error /= len(x2) # 计算均方误差
print('w2 = ', w, ',b2 = ', b, '误差2 = ', error)
xl = np.arange(5, 25, 0.1) # 绘制回归直线
yl = w * xl + b
plt.plot(xl, yl, 'r')
plt.show() # 显示图像
3.结果
很巧合,训练样本少的误差低。
欢迎指正。