使用numpy创建的矩阵数据有范围限制嘛
时间: 2024-06-05 16:09:30 浏览: 73
使用numpy创建的矩阵数据有范围限制。
在numpy中,整数类型的数据通常是有符号的(即可以表示正数和负数),而这些数据类型的范围是固定的。例如,int8类型的数据范围是从-128到127。如果你试图将一个大于127或小于-128的值赋给一个int8类型的变量,它会被截断为最接近的可表示值。
同样,浮点数类型的数据也有范围限制。例如,float32类型的数据范围大约是从-3.4 x 10^38到3.4 x 10^38,如果你试图将一个超出这个范围的值赋给一个float32类型的变量,它会被转换为inf或-inf。
因此,在使用numpy创建矩阵数据时,你需要注意数据的范围限制,以确保数据的准确性和正确性。
相关问题
只使用numpy完整实现线性不可分支持向量机六分类,对手动输入的单条18维数据循环训练、保存模型、加载模型、预测
好的,我可以给你提供一个简单的实现,但是需要注意的是,线性不可分的情况下,我们需要使用核函数来进行转换,这里我使用的是RBF核函数。
首先,我们需要导入必要的库,代码如下:
```python
import numpy as np
from sklearn.datasets import make_blobs
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
```
接下来,我们生成一个随机数据集,代码如下:
```python
# 生成数据集
X, y = make_blobs(n_samples=1000, centers=6, n_features=18, random_state=42, cluster_std=2)
# 数据标准化
scaler = StandardScaler()
X = scaler.fit_transform(X)
```
然后,我们需要定义一个RBF核函数,代码如下:
```python
# 定义RBF核函数
def rbf_kernel(X1, X2, gamma=1):
"""
RBF核函数
:param X1: 数据集1
:param X2: 数据集2
:param gamma: gamma参数
:return: 核矩阵
"""
K = np.zeros((X1.shape[0], X2.shape[0]))
for i, x1 in enumerate(X1):
for j, x2 in enumerate(X2):
K[i, j] = np.exp(-gamma * np.linalg.norm(x1 - x2) ** 2)
return K
```
接着,我们定义一个支持向量机类,代码如下:
```python
class SVM:
def __init__(self, C=1, kernel=rbf_kernel, gamma=1):
"""
初始化
:param C: 正则化参数
:param kernel: 核函数
:param gamma: RBF核函数的gamma参数
"""
self.C = C
self.kernel = kernel
self.gamma = gamma
def fit(self, X, y):
"""
拟合模型
:param X: 输入数据
:param y: 标签
"""
n_samples, n_features = X.shape
# 计算核矩阵
K = self.kernel(X, X, gamma=self.gamma)
# 定义变量
alpha = np.zeros(n_samples)
b = 0
E = np.zeros(n_samples)
# 迭代训练
for _ in range(100):
for i in range(n_samples):
# 计算预测值
f_i = np.sum(alpha * y * K[:, i]) + b
# 计算误差
E[i] = f_i - y[i]
# 判断是否需要更新alpha
if ((y[i] * E[i] < -0.001 * self.C and alpha[i] < self.C)
or (y[i] * E[i] > 0.001 * self.C and alpha[i] > 0)):
j = np.random.choice(list(range(i)) + list(range(i + 1, n_samples)))
f_j = np.sum(alpha * y * K[:, j]) + b
E[j] = f_j - y[j]
# 保存旧的alpha
alpha_i_old = alpha[i]
alpha_j_old = alpha[j]
# 计算上下限
if y[i] != y[j]:
L = max(0, alpha[j] - alpha[i])
H = min(self.C, self.C + alpha[j] - alpha[i])
else:
L = max(0, alpha[i] + alpha[j] - self.C)
H = min(self.C, alpha[i] + alpha[j])
# 判断L和H是否相等
if L == H:
continue
# 计算eta
eta = 2 * K[i, j] - K[i, i] - K[j, j]
# 判断eta是否小于0
if eta >= 0:
continue
# 更新alpha_j
alpha[j] = alpha[j] - y[j] * (E[i] - E[j]) / eta
# 限制alpha_j在[L, H]之间
alpha[j] = min(alpha[j], H)
alpha[j] = max(alpha[j], L)
# 判断alpha_j是否有足够的变化
if abs(alpha[j] - alpha_j_old) < 0.00001:
continue
# 更新alpha_i
alpha[i] = alpha[i] + y[i] * y[j] * (alpha_j_old - alpha[j])
# 更新b
b1 = b - E[i] - y[i] * (alpha[i] - alpha_i_old) * K[i, j] - y[j] * (alpha[j] - alpha_j_old) * K[i, j]
b2 = b - E[j] - y[i] * (alpha[i] - alpha_i_old) * K[i, j] - y[j] * (alpha[j] - alpha_j_old) * K[j, j]
if 0 < alpha[i] < self.C:
b = b1
elif 0 < alpha[j] < self.C:
b = b2
else:
b = (b1 + b2) / 2
# 判断是否收敛
if np.linalg.norm(alpha - alpha_i_old) < 0.00001:
break
# 保存参数
self.alpha = alpha
self.b = b
def predict(self, X):
"""
预测
:param X: 输入数据
:return: 预测结果
"""
n_samples, n_features = X.shape
# 计算核矩阵
K = self.kernel(X, self.X_train, gamma=self.gamma)
# 计算预测值
y_pred = np.sign(np.sum(self.alpha * self.y_train * K, axis=1) + self.b)
return y_pred
```
最后,我们可以使用以下代码进行训练、保存模型、加载模型和预测:
```python
# 创建SVM对象
svm = SVM()
# 训练模型
svm.fit(X, y)
# 保存模型
np.save('svm.npy', [svm.alpha, svm.b, svm.X_train, svm.y_train])
# 加载模型
alpha, b, X_train, y_train = np.load('svm.npy', allow_pickle=True)
svm = SVM()
svm.alpha = alpha
svm.b = b
svm.X_train = X_train
svm.y_train = y_train
# 预测单条数据
x_test = np.random.randn(18)
y_pred = svm.predict(x_test.reshape(1, -1))
print(y_pred)
```
以上就是使用numpy完整实现线性不可分支持向量机六分类的代码,希望对你有帮助。
阅读全文