一、计算赔率(素数、合数赌博)
import operator
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
from time import time
import math
from collections import Counter
def is_prime(x):
return 0 not in [x % i for i in range(2, int(math.sqrt(x)) + 1)]
def is_prime3(x):
flag = True
for p in p_list2:
if p > math.sqrt(x):
break
if x % p == 0:
flag = False
break
if flag:
p_list2.append(x)
return flag
if __name__ == "__main__":
a = 2
b = 100000
# 方法1:直接计算
t = time()
p = [p for p in range(a, b) if 0 not in [p % d for d in range(2, int(math.sqrt(p)) + 1)]]
print(time() - t)
print(p)
# 方法2:利用filter,可以节省一定时间
t = time()
p = filter(is_prime, range(a, b))
print(time() - t)
print(p)
# 方法3:利用filter和lambda,利用filter后,方法写在外面与里面运行时间差别不大
t = time()
is_prime2 = (lambda x: 0 not in [x % i for i in range(2, int(math.sqrt(x)) + 1)])
p = filter(is_prime2, range(a, b))
print(time() - t)
print(p)
# 方法4:定义
#创建一个空列表后
t = time()
#创建一个空列表后
p_list = []
#进入循环,将每一个素数存入列表,由于合数一定可以被某一个素数整除,所以只需要判断列表中的素数即可
for i in range(2, b):
flag = True
for p in p_list:
if p > math.sqrt(i):
break
if i % p == 0:
flag = False
break
if flag:
p_list.append(i)
print(time() - t)
print(p_list)
# 方法5:定义和filter
p_list2 = []
t = time()
#filter(方法,可迭代对象),将可迭代对象一个个传值给方法函数,知道传遍全部值
filter(is_prime3, range(2, b))
print(time() - t)
print(p_list2)
print ('---------------------')
a = 2
b = 1230
p_list2 = []
#filter返回值为数组,不是列表,转化为列表后才能使用len
p = list(filter(is_prime3, range(a, b+1)))
p_rate = float(len(p)) / float(b - a + 1)
#上下结果相同,注意nupmy中size、shape、len用法;Counter是以字典形式返回数组中不同元素出现的个数
#p = np.array(list(filter(is_prime3, range(a, b+1))))
# p_rate = float(p.size) / float(b-a+1)
print('素数的概率:', p_rate, '\t',)
print ('公正赔率:', 1/p_rate)
print ('合数的概率:', 1-p_rate, '\t',)
print ('公正赔率:', 1 / (1-p_rate))
二、公路堵车模型
车辆其实速度为V;
若与前车距离大于当前车速,则它在下一秒的车速提高到v+1,直到达到规定的最高限速;
若与前车的距离小于当前车速,则它下 一秒的车速降低到d-1(当前距离-1) ;
车速有P的概率会减一
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
#限制函数;车辆位移受限,超出公路的汽车默认回到开头(环形公路)
def clip(x, path):
for i in range(len(x)):
if x[i] >= path:
x[i] %= path
if __name__ == "__main__":
#转换中文
mpl.rcParams['font.sans-serif'] = [u'SimHei']
mpl.rcParams['axes.unicode_minus'] = False
path = 5000 # 环形公路的长度
n = 100 # 公路中的车辆数目
v0 = 50 # 车辆的初始速度
p = 0.3 # 随机减速概率
Times = 3000 #时间
#产生相同的随机数(随机种子)
np.random.seed(0)
#100辆车的起始位置
x = np.random.rand(n) * path
#对车辆位置进行排序
x.sort()
# 将100个车辆的速度定义为50,并设为float类型数据
v = np.tile([v0], n).astype(np.float)
plt.figure(figsize=(10, 8), facecolor='w')
#模拟在时间范围内的堵车情况
for t in range(Times):
#使用散点图
plt.scatter(x, [t]*n, s=1, c='k', alpha=0.05)
for i in range(n):
#计算前后车距离
if x[(i+1)%n] > x[i]:
d = x[(i+1) % n] - x[i] # 距离前车的距离
else:
d = path - x[i] + x[(i+1) % n]
#判断此时的速度与前车距离大小
if v[i] < d:
#若前方可见范围内没车,则它在下一秒的车速提高到v+1,直到达到规定的最高限速。同时,每辆车会以概率p随机减速v-1。
if np.random.rand() > p:
v[i] += 1
else:
v[i] -= 1
# 若前方有车,前车的距离为d,且d < v,则它下 一秒的车速降低到d-1 。
else:
v[i] = d - 1
# 限制速度,v<0,则将v定义为0;v>150,则将v定义为150
v = v.clip(0, 150)
#车不断向前
x += v
# 车辆位移受限,超出公路的汽车默认回到开头(环形公路)
clip(x, path)
#设置x、y坐标
plt.xlim(0, path)
plt.ylim(0, Times)
#设置标签
plt.xlabel(u'车辆位置', fontsize=16)
plt.ylabel(u'模拟时间', fontsize=16)
plt.title(u'环形公路车辆堵车模拟', fontsize=20)
#自动调整子图参数,使之填充整个图像区域
plt.tight_layout(pad=2)
plt.show()
三、鸢尾花数据(PCA)
import pandas as pd
import numpy as np
from sklearn.decomposition import PCA
from sklearn.linear_model import LogisticRegressionCV
from sklearn import metrics
from sklearn.model_selection import train_test_split
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
def extend(a, b):
return 1.05*a-0.05*b, 1.05*b-0.05*a
if __name__ == '__main__':
#显示最大行数列数,超过了显示省略号
pd.set_option('display.width', 200)
#读取燕尾花数据
data = pd.read_csv('iris.data', header=None)
#重新设置列名称、属性
columns = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'type']
data.rename(columns=dict(zip(np.arange(5), columns)), inplace=True)
data['type'] = pd.Categorical(data['type']).codes
print(data.head(5))
#划分数据(特征值和目标值)
x = data.loc[:, columns[:-1]]
y = data['type']
#使用PCA进行降维处理,查看方差所占百分比,去除影响较小的特征
pca = PCA(n_components=2, whiten=True, random_state=0)
x = pca.fit_transform(x)
print('各方向方差:', pca.explained_variance_)
print('方差所占比例:', pca.explained_variance_ratio_)
print(x[:5])
#cm_light = mpl.colors.ListedColormap(['#77E0A0', '#FF8080', '#A0A0FF'])
cm_dark = mpl.colors.ListedColormap(['g', 'r', 'b'])
#切换为中文
mpl.rcParams['font.sans-serif'] = u'SimHei'
mpl.rcParams['axes.unicode_minus'] = False
plt.figure(facecolor='w')
#绘制散点图
plt.scatter(x[:, 0], x[:, 1], s=30, c=y, marker='o', cmap=cm_dark)
#背景网格线
plt.grid(b=True, ls=':')
plt.xlabel(u'组份1', fontsize=14)
plt.ylabel(u'组份2', fontsize=14)
plt.title(u'鸢尾花数据PCA降维', fontsize=18)
# plt.savefig('1.png')
plt.show()
#划分训练集、测试集
x, x_test, y, y_test = train_test_split(x, y, train_size=0.7)
#机器学习模型(管道)
model = Pipeline([
#特征选择,degree:选择线性函数次数
('poly', PolynomialFeatures(degree=4, include_bias=True)),
#逻辑回归--分类
('lr', LogisticRegressionCV(Cs=np.logspace(-3, 4, 8), cv=5, fit_intercept=False))
])
#进行调参
model.fit(x, y)
print ('最优参数:', model.get_params('lr')['lr'].C_)
y_hat = model.predict(x)
print ('训练集精确度:', metrics.accuracy_score(y, y_hat))
y_test_hat = model.predict(x_test)
print ('测试集精确度:', metrics.accuracy_score(y_test, y_test_hat))
# 对得到的结果进行绘图,即在PCA的图形上根据分类结果对不同类别进行绘制
N, M = 500, 500 # 横纵各采样多少个值
x1_min, x1_max = extend(x[:, 0].min(), x[:, 0].max()) # 第0列的范围
x2_min, x2_max = extend(x[:, 1].min(), x[:, 1].max()) # 第1列的范围
t1 = np.linspace(x1_min, x1_max, N)
t2 = np.linspace(x2_min, x2_max, M)
x1, x2 = np.meshgrid(t1, t2) # 生成网格采样点
x_show = np.stack((x1.flat, x2.flat), axis=1) # 测试点
y_hat = model.predict(x_show) # 预测值
y_hat = y_hat.reshape(x1.shape) # 使之与输入的形状相同
plt.figure(facecolor='w')
plt.pcolormesh(x1, x2, y_hat, cmap=cm_light) # 预测值的显示
plt.scatter(x[:, 0], x[:, 1], s=30, c=y, edgecolors='k', cmap=cm_dark) # 样本的显示
# 打标签
plt.xlabel(u'组份1', fontsize=14)
plt.ylabel(u'组份2', fontsize=14)
# 对x,y坐标轴的坐标进行限制
plt.xlim(x1_min, x1_max)
plt.ylim(x2_min, x2_max)
plt.grid(b=True, ls=':')
patchs = [mpatches.Patch(color='#77E0A0', label='Iris-setosa'),
mpatches.Patch(color='#FF8080', label='Iris-versicolor'),
mpatches.Patch(color='#A0A0FF', label='Iris-virginica')]
plt.legend(handles=patchs, fancybox=True, framealpha=0.8, loc='lower right')
plt.title(u'鸢尾花Logistic回归分类效果', fontsize=17)
# plt.savefig('2.png')
plt.show()
四、
排污数据异常值检测与修正
import numpy as np
import matplotlib as mpl
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import BaggingRegressor
def read_data():
plt.figure(figsize=(13, 7), facecolor='w')
plt.subplot(121)
data = pd.read_csv('C0904.csv', header=0)
x = data['H2O'].values
plt.plot(x, 'r-', lw=1, label=u'C0904')
plt.title(u'实际排放数据0904', fontsize=18)
plt.legend(loc='upper right')
plt.grid(b=True)
plt.subplot(122)
data = pd.read_csv('C0911.csv', header=0)
x = data['H2O'].values
plt.plot(x, 'r-', lw=1, label=u'C0911')
plt.title(u'实际排放数据0911', fontsize=18)
plt.legend(loc='upper right')
plt.grid(b=True)
plt.tight_layout(2, rect=(0, 0, 1, 0.95))
plt.suptitle(u'如何找到下图中的异常值', fontsize=20)
plt.show()
if __name__ == "__main__":
mpl.rcParams['font.sans-serif'] = [u'simHei']
mpl.rcParams['axes.unicode_minus'] = False
# read_data()
data = pd.read_csv('C0904.csv', header=0) # C0911.csv, C0904.csv
x = data['H2O'].values
print (x)
width = 500
delta = 10
eps = 0.15
N = len(x)
p = []
abnormal = []
for i in np.arange(0, N-width, delta):
s = x[i:i+width]
p.append(np.ptp(s))
if np.ptp(s) > eps:
abnormal.append(range(i, i+width))
abnormal = np.array(abnormal).flatten()
abnormal = np.unique(abnormal)
# plt.plot(p, lw=1)
# plt.grid(b=True)
# plt.show()
plt.figure(figsize=(18, 7), facecolor='w')
plt.subplot(131)
plt.plot(x, 'r-', lw=1, label=u'原始数据')
plt.title(u'实际排放数据', fontsize=18)
plt.legend(loc='upper right')
plt.grid(b=True)
plt.subplot(132)
t = np.arange(N)
plt.plot(t, x, 'r-', lw=1, label=u'原始数据')
plt.plot(abnormal, x[abnormal], 'go', markeredgecolor='g', ms=3, label=u'异常值')
plt.legend(loc='upper right')
plt.title(u'异常检测', fontsize=18)
plt.grid(b=True)
# 预测
plt.subplot(133)
select = np.ones(N, dtype=np.bool)
select[abnormal] = False
t = np.arange(N)
dtr = DecisionTreeRegressor(criterion='mse', max_depth=10)
br = BaggingRegressor(dtr, n_estimators=10, max_samples=0.3)
br.fit(t[select].reshape(-1, 1), x[select])
y = br.predict(np.arange(N).reshape(-1, 1))
y[select] = x[select]
plt.plot(x, 'g--', lw=1, label=u'原始值') # 原始值
plt.plot(y, 'r-', lw=1, label=u'校正值') # 校正值
plt.legend(loc='upper right')
plt.title(u'异常值校正', fontsize=18)
plt.grid(b=True)
plt.tight_layout(1.5, rect=(0, 0, 1, 0.95))
plt.suptitle(u'排污数据的异常值检测与校正', fontsize=22)
plt.show()