机器学习基础算法及其实现

线性回归

知识点:
1. 线性回归模型可以使用不同的目标函数,最常用的是最小二乘法、最小绝对值法和最大似然法。
2. 在最小二乘法中,目标是最小化实际值与预测值之间的误差平方和,这可以通过求导数等方法来求解。
3. 在最小绝对值法中,目标是最小化实际值与预测值之间的误差绝对值和,这可以使用线性规划等方法来求解。
4. 在最大似然法中,目标是估计模型参数,使得在给定自变量的条件下,因变量的概率最大化。
5. 线性回归模型的参数估计可以使用基于梯度下降的算法,如批量梯度下降、随机梯度下降、小批量梯度下降等。
6. 在应用线性回归模型时,需要注意多重共线性、异方差性、自相关等问题,并采取相应的处理措施。
7. 除了传统的线性回归模型,还有多项式回归、岭回归、lasso回归、弹性网络回归等变种模型。

逻辑回归

import numpy as np

class LogisticRegression:
    def __init__(self, learning_rate=0.01, num_iterations=10):
        self.learning_rate = learning_rate
        self.num_iterations = num_iterations
        self.weights = None
        self.bias = None
    
    def fit(self, X, y):
        num_samples, num_features = X.shape
        print(num_samples,num_features)
        self.weights = np.zeros(num_features)
        print(X)
        print(self.weights)
        self.bias = 0
        
        # 梯度下降算法
        for i in range(self.num_iterations):
            linear_model = np.dot(X, self.weights) + self.bias
            print(linear_model)
            y_pred = self._sigmoid(linear_model)
            print("sigmoid")
            print(y_pred)
            print("end")
            # 计算损失函数的梯度
            dw = (1 / num_samples) * np.dot(X.T, (y_pred - y))
            db = (1 / num_samples) * np.sum(y_pred - y)
            
            # 更新权重和偏移量
            self.weights -= self.learning_rate * dw
            self.bias -= self.learning_rate * db
    
    def predict(self, X):
        print("pre")
        print(X)
        linear_model = np.dot(X, self.weights) + self.bias
        y_pred = self._sigmoid(linear_model)
        y_pred_class = [1 if i > 0.5 else 0 for i in y_pred]
        return np.array(y_pred_class)
    
    def _sigmoid(self, x):
        return 1 / (1 + np.exp(-x))


# 创建训练数据
X_train = np.array([[1,2,3],
                    [2,3,4],
                    [3,4,5],
                    [4,5,6], 
                    [5,6,7]])
y_train = np.array([0, 0, 1, 1, 1])

# 创建逻辑回归模型
lr_model = LogisticRegression()

# 训练模型
lr_model.fit(X_train, y_train)

# 预测新数据
X_new = np.array([[2,4,6], [3,5,7]])
y_pred = lr_model.predict(X_new)

print(y_pred)

SVM

基于sklearn库实现SVM:

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score

# 加载数据集
iris = datasets.load_iris()
X = iris.data
y = iris.target

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, 
                                                    test_size=0.2, 
                                                    random_state=42)
# 创建 SVM 模型对象
svm_model = SVC(kernel='linear', C=1)

# 训练 SVM 模型
svm_model.fit(X_train, y_train)

# 预测测试集数据
y_pred = svm_model.predict(X_test)

# 计算准确率
acc = accuracy_score(y_test, y_pred)
print('Accuracy:', acc)

具体代码实现:(复习后再过来研究)

import numpy as np

# 定义 SVM 模型类
class SVM:
    def __init__(self, C=1.0, kernel='linear', gamma=1.0):
        self.C = C               # 惩罚系数
        self.kernel = kernel     # 核函数类型
        self.gamma = gamma       # 核函数参数
        self.alpha = None        # 拉格朗日乘子
        self.b = 0               # 阈值
        self.X = None            # 训练数据
        self.y = None            # 训练标签
        
    # 核函数
    def _kernel_function(self, x1, x2):
        if self.kernel == 'linear':
            return np.dot(x1, x2)
        elif self.kernel == 'rbf':
            return np.exp(-self.gamma * np.linalg.norm(x1 - x2) ** 2)
        else:
            raise ValueError('Unsupported kernel function type')

    # 训练模型
    def fit(self, X, y):
        n_samples, n_features = X.shape          # 5 3 
        self.alpha = np.zeros(n_samples)
        self.X = X
        self.y = y

        # 计算 Gram 矩阵
        K = np.zeros((n_samples, n_samples))     # 5 5
        for i in range(n_samples):
            for j in range(n_samples):
                K[i, j] = self._kernel_function(X[i], X[j]) # np.dot

        # 定义优化目标函数
        def objective_function(alpha):
            return 0.5 * np.dot(alpha, np.dot(alpha, K)) - np.sum(alpha)

        # 定义约束条件
        def zero_sum_constraint(alpha):
            return np.dot(alpha, y)

        # 定义不等式约束条件
        bounds = [(0, self.C) for i in range(n_samples)]
        cons = [{'type': 'eq', 'fun': zero_sum_constraint}]
        
        # 使用优化算法求解拉格朗日乘子
        from scipy.optimize import minimize
        res = minimize(objective_function, self.alpha, bounds=bounds, constraints=cons)
        self.alpha = res.x

        # 计算阈值
        support_vectors = self.alpha > 1e-5
        support_vectors_idx = np.where(support_vectors)[0]
        self.b = np.mean(y[support_vectors] - np.dot(K[support_vectors_idx, :], self.alpha * y))

    # 预测新数据
    def predict(self, X):
        n_samples = X.shape[0]
        y_pred = np.zeros(n_samples)

        for i in range(n_samples):
            s = 0
            for alpha, x, y in zip(self.alpha, self.X, self.y):
                s += alpha * y * self._kernel_function(X[i], x)
            y_pred[i] = s + self.b

        return np.sign(y_pred)
    
# 创建训练数据
X_train = np.array([[1,2,3],
                    [2,3,4],
                    [3,4,5],
                    [4,5,6], 
                    [5,6,7]])
y_train = np.array([0, 0, 1, 1, 1])

# 创建逻辑回归模型
model = SVM()

# 训练模型
model.fit(X_train, y_train)

# 预测新数据
X_new = np.array([[2,4,6], [3,5,7]])
y_pred = model.predict(X_new)

print(y_pred)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值