import numpy as np
import matplotlib.pyplot as plt
# 构建样本数据,x值从-4到5,每个数间隔为1
x = np.arange(-4, 5, 1)
# 结果 array([-4, -3, -2, -1, 0, 1, 2, 3, 4])
# y构建为0,1 向量,且是线性不可分的
y = np.array((x >= -2) & (x <= 2), dtype='int')
# 结果 array([0, 0, 1, 1, 1, 1, 1, 0, 0])
# 绘制样本数据
print(y == 0) # [ True True False False False False False True True]
print(x[y == 0]) # [-4 -3 3 4]
print(x[y == 1]) # [-2 -1 0 1 2]
plt.scatter(x[y == 0], [0] * len(x[y == 0]))
plt.scatter(x[y == 1], [0] * len(x[y == 1]))
plt.show()
def f0():
X_new = np.copy(x)
Y_new = np.copy(x)
for i, data in enumerate(Y_new):
Y_new[i] = Y_new[i] * Y_new[i]
# 绘制新的样本点
plt.scatter(X_new[y == 0], Y_new[y == 0])
plt.scatter(X_new[y == 1], Y_new[y == 1])
plt.show()
"""
1. 在 NumPy 中,X[y == 1] 是一种索引操作,用于从数组 X 中选择那些在数组 y 中对应位置的值为 1 的元素。这种操作通常用于根据某个条件筛选数据。
2. 如果你多次调用 plt.scatter 而不指定颜色,matplotlib 会使用默认的颜色循环来为每个散点图分配不同的颜色。默认的颜色循环是 ['C0', 'C1', 'C2', ...],其中 C0 通常对应于蓝色,C1 对应于橙色,依此类推。
"""
f0()
def f1():
def gaussian(x, l):
# 这一节对gamma先不做探讨,先定为1
gamma = 1.0
# 这里x-l是一个数,不是向量,所以不需要取模
return np.exp(-gamma * (x - l) ** 2)
# 将每一个x值通过高斯核函数和l1,l2地标转换为2个值,构建成新的样本数据
l1, l2 = -1, 1
X_new = np.empty((len(x), 2))
for i, data in enumerate(x):
X_new[i, 0] = gaussian(data, l1)
X_new[i, 1] = gaussian(data, l2)
# 绘制新的样本点
# X_new 有9条数据,但只把 y=0的 4 条绘制出来
plt.scatter(X_new[y == 0, 0], X_new[y == 0, 1])
# X_new 有9条数据,但只把 y=1的 5 条绘制出来
plt.scatter(X_new[y == 1, 0], X_new[y == 1, 1])
plt.show()
# 调用f1
f1()
def f2():
# pip install scikit-learn
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
X, y = datasets.make_moons(noise=0.15, random_state=666)
plt.scatter(X[y == 0, 0], X[y == 0, 1])
plt.scatter(X[y == 1, 0], X[y == 1, 1])
plt.show()
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.pipeline import Pipeline
def RBFKernelSVC(gamma=1.0):
return Pipeline([("std_scaler", StandardScaler()), ("svc", SVC(kernel="rbf", gamma=gamma))])
# 将gamma取1
rbf_svc = RBFKernelSVC(gamma=1)
rbf_svc.fit(X, y)
def plot_decision_boundary(model, axis):
# meshgrid函数用两个坐标轴上的点在平面上画格,返回坐标矩阵
X0, X1 = np.meshgrid(
# 随机两组数,起始值和密度由坐标轴的起始值决定
np.linspace(axis[0], axis[1], int((axis[1] - axis[0]) * 100)).reshape(-1, 1),
np.linspace(axis[2], axis[3], int((axis[3] - axis[2]) * 100)).reshape(-1, 1),
)
# ravel()方法将高维数组降为一维数组,c_[]将两个数组以列的形式拼接起来,形成矩阵
X_grid_matrix = np.c_[X0.ravel(), X1.ravel()]
# 通过训练好的逻辑回归模型,预测平面上这些点的分类
y_predict = model.predict(X_grid_matrix)
y_predict_matrix = y_predict.reshape(X0.shape)
# 设置色彩表
from matplotlib.colors import ListedColormap
my_colormap = ListedColormap(['#0000CD', '#40E0D0', '#FFFF00'])
# 绘制等高线,并且填充等高区域的颜色
plt.contourf(X0, X1, y_predict_matrix, linewidth=5, cmap=my_colormap)
plot_decision_boundary(rbf_svc, axis=[-1.5, 2.5, -1.0, 1.5])
plt.scatter(X[y == 0, 0], X[y == 0, 1])
plt.scatter(X[y == 1, 0], X[y == 1, 1])
plt.show()
# 将gamma取100
rbf_svc100 = RBFKernelSVC(gamma=100)
rbf_svc100.fit(X, y)
plot_decision_boundary(rbf_svc100, axis=[-1.5, 2.5, -1.0, 1.5])
plt.scatter(X[y == 0, 0], X[y == 0, 1])
plt.scatter(X[y == 1, 0], X[y == 1, 1])
plt.show()
# 将gamma取0.1
rbf_svc01 = RBFKernelSVC(gamma=0.1)
rbf_svc01.fit(X, y)
plot_decision_boundary(rbf_svc01, axis=[-1.5, 2.5, -1.0, 1.5])
plt.scatter(X[y == 0, 0], X[y == 0, 1])
plt.scatter(X[y == 1, 0], X[y == 1, 1])
plt.show()
# 调用f2
f2()
0条评论