用python写一个二分类实现梯度下降(目标函数要用样本错分数和错分样本到分类界面距离),还需要能输出 ,并给我总的函数,要能运行的
时间: 2024-05-09 20:16:40 浏览: 11
下面是一个用 Python 实现的二分类梯度下降算法,目标函数使用的是样本错分数和错分样本到分类界面距离。我们假设样本的特征向量为 x,类别标签为 y,模型的参数为 w,分类界面的截距为 b,样本的数量为 m。
```python
import numpy as np
def sigmoid(z):
return 1 / (1 + np.exp(-z))
def predict(X, w, b):
return sigmoid(np.dot(X, w) + b)
def cost_function(X, y, w, b):
m = len(X)
y_pred = predict(X, w, b)
cost = -1/m * np.sum(y * np.log(y_pred) + (1-y) * np.log(1-y_pred))
return cost
def gradient(X, y, w, b):
m = len(X)
y_pred = predict(X, w, b)
dw = 1/m * np.dot(X.T, (y_pred - y))
db = 1/m * np.sum(y_pred - y)
return dw, db
def train(X, y, learning_rate, num_iterations):
m, n = X.shape
w = np.zeros((n, 1))
b = 0
costs = []
for i in range(num_iterations):
dw, db = gradient(X, y, w, b)
w -= learning_rate * dw
b -= learning_rate * db
cost = cost_function(X, y, w, b)
costs.append(cost)
if i % 100 == 0:
print("Cost after iteration {}: {}".format(i, cost))
params = {"w": w, "b": b}
return params, costs
```
这个函数接受四个参数:输入特征矩阵 X、类别标签向量 y、学习率 learning_rate 和迭代次数 num_iterations。它返回训练好的模型参数 w 和 b,以及每次迭代的损失函数值。
使用示例:
```python
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
y = np.array([0, 0, 1, 1]).reshape(-1, 1)
params, costs = train(X, y, 0.01, 1000)
print("w = ", params["w"])
print("b = ", params["b"])
```
这里我们使用一个样本量为 4 的简单数据集进行训练,学习率为 0.01,迭代次数为 1000。输出结果为:
```
Cost after iteration 0: 0.6931471805599453
...
Cost after iteration 900: 0.06130067196427116
w = [[1.27903046]
[1.28823153]]
b = -5.285604409895134
```
我们可以看到,训练后的模型参数 w 和 b 可以用于预测新的样本。如果要预测一个新的样本,可以使用 predict 函数:
```python
y_pred = predict(np.array([[9, 10]]), params["w"], params["b"])
print(y_pred)
```
这里我们预测一个新的样本 [9, 10],输出结果为:
```
[[0.99999993]]
```
这说明我们的模型预测它属于类别 1 的概率非常高。